Buffalo介紹
Web正隨著Amowa/Ajax的引入開發開始變得有趣!
Buffalo是Amowa思想實現的關鍵組件。Buffalo中定義了Web遠程調用的傳輸基礎,并且將遠程調用對象完整的序列化到了本地,成為可以被JavaScript編程觸及的對象。Buffalo中的重要組件 - BuffaloBinding,提供了將JavaScript對象綁定到HTML元素的能力。這種綁定將是無侵入的,只需要在HTML元素中加入若干個不影響排版的屬性,即可將數據與界面綁定。
Buffalo1.1之前的版本重要的功能主要集中于遠程調用與Java對象/JavaScript對象之間的雙向序列化,這個特性已經被眾多的應用久經考驗,被認為是健壯的。它大大減少了在Java對象與JavaScript對象之間需要考慮的細節,開發者可以更用心地進行業務設計和界面設計。1.2版本的推出,引入了新的眾多的特性,包括:新的重新改寫的Spring集成;與流行javascript庫prototype的集成;支持瀏覽器前進后退按鈕,等等。Buffalo努力使Web2.0的概念在這個小小的輕量級的框架中得到體現,讓你的應用具備更豐富的表現。
問題
可是在使用Buffalo傳輸對象的過程中我發現Buffalo并不能夠很好的傳遞用戶自定義的對象,不光如此在與作者的討論過程中我還發現很多的人對于Javascript程序的規范根本不屑一顧,似乎選擇了Javascript本身就是選擇了"自由編程",可是真的如此嗎?
其實Javascript是一個比較純粹的OO語言,并不想一些報道中所說的那樣,對于封裝、繼承、多態Javascript同樣可以完成,既然它是OO的語言,就理所應當的按照某種規范來編寫代碼,正如JavaScript說分明 中說得那樣,編寫Javascript不是一件簡單的事情,關鍵是很多人亂用了這個語言,從而導致給很多的朋友以為寫Javascript就是很沒有水準的事情(偶以前也是如此),但我最近發現用Javascript這樣的動態語言沒有一個很好的語言規范,你開發出來的應用只能夠停留在小型系統之上,而對于比較大型的應用開發,這樣寫出來得代買根本無法復用!
再來說說Buffalo傳輸對象的問題,以下是我自定義的Node對象
function Node(_id , _type)
{
//log("create node object!!!");
//============================== property =================================//
//=========================================================================//
var id = _id;
var type = _type; //<- type的出現在OO世界里本身就是背叛
var brush = null //節點的物理表現句柄
var rList = new Array();//左節點列表
var lList = new Array();//右節點列表
var rLine = new Array();//節點的左線列表
var lLine = new Array();//節點的右線列表
var x = 0;//節點的x坐標
var y = 0;//節點的y坐標
var m = false; //標識節點是否可移動
var r = false; //標識節點是否能夠建立聯系
var name = ""; //節點的名稱
//================================ method =================================//
//=========================================================================//
this.getType = function()
{
return type;
}
this.setType = function(_t)
{
type = _t;
}
this.setName = function(_n)
{
name = _n;
}
this.getName = function()
{
return name;
}
this.setId = function(_i)
{
id = _i;
}
this.getId = function()
{
return id;
}
}
然而在使用Buffalo的時候Node對象根本就無法傳遞,而導致這個問題的原因竟然是我沒有"自由的編寫Javascript"!其實問題就出在doStructXML 方法上,作者在這里有意的"避開"了這個問題,所以在傳遞Node的時候對于其私有的方法Buffalo是根本就不考慮的,FAINT!
原先
doStructXML : function(data){
var boClass = data[Buffalo.BOCLASS];
var boType = boClass ? boClass : "java.util.HashMap";
var xml = "<map>\n";
xml += "<type>" +boType+ "</type>\n";
for (var i in data){
if (data[i] != boType) {
if (typeof(data[i]) == "function") continue; /* the function shouldn't transfered. */
xml += this.getParamXML(this.dataTypeOf(i),i)+"\n";
xml += this.getParamXML(this.dataTypeOf(data[i]),data[i]) + "\n";
}
}
xml += "</map>\n";
return xml;
},
修改后
doStructXML : function(data){
var boClass = data[Buffalo.BOCLASS];
var boType = boClass ? boClass : "java.util.HashMap";
var xml = "<map>\n";
xml += "<type>" +boType+ "</type>\n";
for (var i in data){
if (data[i] != boType) {
if (typeof(data[i]) == "function")
{
/*判斷方法名稱*/
if(i.substring(0,3) == 'get')
{
var _name = i.substring(3,i.length).toLowerCase();
var _value = data[i]();
//alert("functin name[" + this.dataTypeOf(_name) + "]=" + _name
// + " | value[" + this.dataTypeOf(_value) + "]=" + _value);
xml += this.getParamXML(this.dataTypeOf(_name),_name)+"\n";
xml += this.getParamXML(this.dataTypeOf(_value),_value) + "\n";
}
continue; /* the function shouldn't transfered. */
}
xml += this.getParamXML(this.dataTypeOf(i),i)+"\n";
xml += this.getParamXML(this.dataTypeOf(data[i]),data[i]) + "\n";
}
}
xml += "</map>\n";
return xml;
}
總結
1。Javascript的編寫是否應該遵守一定的規范,其實屬于程序員自身休養的問題,但我還是覺得復用JAVA的編碼規范不是壞事情!
2。時刻記住Buffalo是建立在burlap協議的基礎上的,我們應該把注意力放在burlap上而不僅僅只是Buffalo!