修改buffalo代碼一

          Posted on 2006-03-02 19:46 killvin 閱讀(226) 評論(0)  編輯  收藏 所屬分類: javascript

          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!

          主站蜘蛛池模板: 玛沁县| 肇源县| 安多县| 嵩明县| 饶河县| 申扎县| 萍乡市| 沙坪坝区| 永仁县| 雅安市| 惠来县| 出国| 万盛区| 邢台市| 竹溪县| 泽普县| 福建省| 老河口市| 镇赉县| 洞口县| 怀化市| 丽水市| 江山市| 夏津县| 襄汾县| 武城县| 横峰县| 金平| 望都县| 金塔县| 通渭县| 德清县| 海阳市| 荃湾区| 凭祥市| 广丰县| 武隆县| 木兰县| 白银市| 焦作市| 冕宁县|