<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 176, comments - 240, trackbacks - 0, articles - 7

      html最早的設計目標只是作為某種多媒體文檔展現技術,其設計者顯然無法預料到今天Web應用的蓬勃發展,一些設計缺陷也就難以避免。特別是html規范中缺乏對于復雜交互式組件模型的支持,直接導致企業應用的前臺開發困難重重。AJAX技術可以看作是對這種困境的一種改良性響應,它試圖通過javascript語言在應用層創建并維護一系列復雜的交互機制。很多完善的ajax框架走得相當遙遠,最終基本將html作為一種底層“匯編”語言來使用。例如,一個很整齊美觀的類Excel表格可能是由一個個div拼接而成,與html原生的table元素已經沒有任何關系。
     
       Witrix平臺中對于前臺html模型也作了一定的增強,但基本的設計思想是盡量利用原生控件,并盡量保持原生控件內在的數據關系,而不是重新構建一個完整的底層支撐環境。采用這種設計的原因大致有如下幾點:
    1. 前臺技術目前競爭非常激烈,我們優先選擇的方式是集成第三方組件,盡量保持原生環境有利于降低集成成本。
    2. 通過javascript構造的控件可能存在性能瓶頸和其他瀏覽器內在的限制。例如一般Ajax框架提供的Grid控件都無法支撐大量單元格的顯示。
    3. Witrix平臺的tpl模板技術可以非常方便的生成html文本,并提供強大的控件抽象能力,因此在前臺動態創建并組織界面元素在Witrix平臺中是一種不經濟的做法。
    4. Witrix平臺提供的分解機制非常細致,存儲于不同地方的不同來源的代碼會在不同的時刻織入到最終的頁面中,基于原生環境有利于降低平臺快速演進過程中的設計風險。

       Witrix平臺中對于html模型的增強主要關注于以最少的代碼實現界面控件與業務邏輯的自然結合。基本結構包括:
    1. 通過ControlManager對象在前臺建立一種container結構,統一管理控件的注冊和獲取。js.makeControl(elmOrId)返回特殊注冊的控件對象或者根據原生html元素生成一個包裝對象。
    2. 通過js.getWxValue(elm)和js.setWxValue(elm,value)這兩個函數統一對控件的值的存取過程。
    3. 通過js.regListener(elm,listenerFunc)統一管理控件之間的相關觸發,實現控件之間的相互監聽。當js.setWxValue(elm,value)被調用時,注冊在ControlManager中的listenerFunc將被調用。
    4. stdPage.setFieldValue(fieldName,value)和stdPage.getFieldValue(fieldName,value)統一針對業務字段的值的存取過程,這里fieldName對應于實體上的業務字段名。
    5. 通過ajax.addForm(frmId)等函數統一前臺提交參數的提取過程,通過stdPage.buildAjax()等函數統一后臺服務的調用方式。
    6. 通過stdPage對象統一封裝業務場景中的"常識"。
    基于以上一些基礎機制,Witrix平臺即可提供一些復雜的業務組件封裝。例如<input name="productCode" onkeypress="stdPage.keyPressToLoadRefByCode({objectName:'SomeProduct',queryField:'productCode'})" .../>通過簡單的調用一個js函數即可實現如下功能:
    a. 在文本框中輸入回車的時候自動提交到后臺查找對應產品代碼的產品,并更新前臺多個相關字段的值
    b. 如果沒有查找到相應產品,則彈出對話框根據界面上已有的部分字段信息提示客戶添加新的產品信息。
    c. 如果找到多個對應產品,則彈出列表允許客戶選擇其一。
    d. 具體的處理過程可以通過函數參數進行精細的控制。
    在meta文件中,結合上下文環境中的元數據信息,我們在缺省情況下可以直接使用 <ds:LoadRefByCodeInputor objectName="SomeProduct" />標簽,不需要任何其他附加參數。

       Witrix平臺中一般利用原生控件來保存數據值,而不是將數據保存在分離的js對象中。例如對于一個選擇控件,經常要求選擇得到的是實體的id,而顯示在界面上的是某個其他字段的值。Witrix平臺中一般的實現結構是
       <input type="hidden" name="${fieldName}" value="${entity[dsMeta.idField]}" id="${id}" textId="text_${id}" />
       <input type="text" value="${entity[dsMeta.nameField]}" id="text_${id}" />
    通過textId等擴展屬性即可明確定義控件多個部分之間的關聯關系,同時保證控件的實現完全與html規范相兼容。
       Witrix平臺中目前使用的"標準化"的擴展屬性有textId(對應文本顯示控件的id), showName(某些無文字顯示的選擇控件需要保留顯示字段值), op(字段作為查詢條件提交時的比較算符),validator(字段值對應的檢驗函數),setWxValue/getWxValue(重定義控件值的存取行為),serializer(特殊處理前臺控件的提交參數)等。擴展屬性不僅可以引入說明信息,還可以引入豐富的控件行為。
      


    posted @ 2009-05-30 00:44 canonical 閱讀(2712) | 評論 (2)編輯 收藏

        分層是最常見的軟件架構方式之一。分層之后可以區分出橫縱兩個維度,縱向往往表現出一種隔離性。出于有意無意的各種原因,層次之間傳遞信息很容易出現模糊甚至丟失的現象。B/S多層體系架構下的程序因為瀏覽器和服務器之間的狀態空間相互獨立,相對于共享全局狀態空間的C/S程序,更容易出現信息傳遞不暢的問題。實際上,我們經常可以觀察到B/S程序中存在著大量的"接力"代碼,即在交界處,總是存在著大量用于讀取變量,拼接變量,轉換變量等與主體業務無關但卻又不可或缺的代碼。在多層架構程序中,信道構建應該是一個需要給予足夠重視的問題。

        在系統規劃中,多層結構應該內置與具體語義無關的通用信道,它跨越多個層次,允許信息透明的通過,并以未預期的方式在不同的層面激發各種相關的行為。在Witrix平臺中,平臺代碼與特定應用中的業務代碼處于高度交織的狀態,一個特定業務功能的實現往往需要多處業務代碼相互協同,平臺必須成為某種透明的背景。例如,假設我們編制了一個通用的列表選擇控件,它封裝的邏輯是從一個實體列表中進行選擇
          <app:SelectOne objectName="MyEntity" />
    如果現在要求選擇時只列出某個類型的實體,則調用形式為
          <app:SelectOne objectName="MyEntity" extArgs="$bizId=select&amp;$type=1" />
    在調用入口處補充必要的信息之后會推動系統在遙遠的狀態空間中應用一個特定的過濾條件。這里$bizId負責指示平臺應用特定的元數據配置,而其他的參數則由元數據中的邏輯負責處理。平臺與特定業務代碼各取所需,相互配合,將盡可能多的邏輯剝離為通用機制。


    posted @ 2009-03-22 21:10 canonical 閱讀(628) | 評論 (0)編輯 收藏

    javaeye提供的電子書制作功能非常實用。
    http://m.tkk7.com/Files/canonical/canonical-blog-20090228.rar

    posted @ 2009-02-28 17:21 canonical 閱讀(448) | 評論 (0)編輯 收藏

       現代數學是建立在等價類這一概念的基礎之上的。同構是對等價關系的一種刻劃。簡單的可以把它理解為兩個系統之間的一種“保持”運算規則的一一對應關系。在 數學中一個符號所代表的是所有能夠互相同構的對象。例如整數3可以看作是與某個元素個數為3的集合可以建立一一對應關系的所有的集合所構成的整體。所以在 數學中,如果我們解決某個特定的問題,它同時也就意味著我們解決了一系列相互等價的問題。
        同構關系對于認知可以起到本質上的簡化作用。如果通過一個推理鏈條,確認了A == B == C == D,則可以直接從概念上推導出 A == D, 這一關系有可能被直觀理解,而不需要理會中間的推理步驟。(注意到以上元素兩兩建立同構關系的時候可能要采用不同的對應手段,因此上面的等式并不是平凡 的。)另一方面,我們可以確定一個模型元素M,  將系統簡化為 A == M, B == M, C == M, D == M。只要理解了元素M就理解了等價的其他元素。

        Witrix平臺中PDM定義作為基礎的結構模型,它同時映射成為數據庫表,以及hbm, java, meta等多個代碼文件,此外還對應于約定的WebObject名稱和BizFlow文件名稱,相應的報表文件目錄等。我們只要理解了pdm模型,即可通 過推理自然的掌握各個層面上對應的結構。這意味著只要知道實體名稱,就知道如何通過Web訪問這個對象,知道數據在數據庫中對應的數據庫表,而不需要知道 后臺是如何讀取前臺提交的參數以及如何執行保存數據指令的。不僅僅是在模型驅動領域,在系統設計的各個方面,我們都應該盡量充分的利用當前的信息通過推理 得到系統其他部分的結構,而不是通過手工關聯或者判斷在程序中動態維持這種對應關系。例如在flow-cp機制中,biz的id, action的id等都根據step配置的id推導得到,這樣在工作列表跳轉的時候就可以根據規則推導出跳轉頁面對應的鏈接,而不需要手工編寫頁面重定向 代碼。




     
        同態(homomorphism)關系相對于同構關系,只強調單向映射的可行性,它是一個舍棄屬性的過程。同態作為最基礎的認知手段之一,它不僅僅是用一 個符號來置換一組元素,而是同時保留了某種全局的運算關系,因此同態映像可以構成某種獨立的完整的研究對象。通過同態映射,我們可以在不同的抽象層面上研 究原系統的一個簡化版本。例如meta中的layout是一種典型的領域特定語言(DSL)。
        userName userTitle
        emailAddress

    每一個字段表示了一個可能任意復雜的inputor或者viewer, 字段之間的前后關系描述了最終顯示頁面上顯示內容的相對關系。當viewer根據需求發生改變的時候,并不影響到layout層面上的關系,因此 layout可以保持不變。如果我們在系統中把問題分解為多個抽象層面上,多個觀察視角上的同態模型,則可能實現更高的軟件復用程度。
        在Witrix平臺的設計中,很多細粒度的標簽都定義為tpl文本段,這樣平臺只要理解某一層面上的交互關系,實際應用中可能出現的細節在標簽內部進行局 部處理,不會突破原始設計的形式邊界,不會影響到原先設定的主體系統結構。例如BizFlow中的tpls段,action的source段等。
        上世紀50年代以前,生物學家做夢也想象不到具有無限復雜性的生物遺傳過程,竟然可以被抽象為ATGC四個抽象符號的串聯。生命竟然不理會各種已知的或是 未知的物理化學作用,被抽象的三聯碼所驅動。一種抽象的本質似乎成了生命世界的本原。在軟件的世界中,可以被識別的抽象元素絕不只是語言本身所提供的那些 機制。

    posted @ 2009-02-28 16:57 canonical 閱讀(1646) | 評論 (0)編輯 收藏

          有一個心理學實驗,要求被試者將青草,公雞,牛三個東西分 成兩組,結果多數中國兒童將青草和牛分成一組,而多數美國兒童將公雞和牛分成一組。中國人的思想中青草和牛之間存在現實的關系,牛吃草,而西方人的典型邏 輯是公雞和牛都屬于動物這一范疇。通過分類將物體類型化,這是西方人從小就接受的訓練。據說美國嬰兒學習名詞的速度要快于動詞,而中國的嬰兒則相反,這并不是偶然的。

           中國人的傳統哲學認為世界是普遍聯系的,事物之間存在著禍福相依的辯證轉化關系。而古希臘人強調個體意識,以兩分法看待世界,他們將世界看成是孤立的物體組成(原子論)構成,然后選擇一個孤立物體(脫離背景),開始研究它的各項屬性,接著將屬性泛化,構成分類的基礎。西方語言中大量抽象概念都是從作為屬性的形容詞直接轉化而來,例如 white --> whiteness 。而中文中很少有精確的類型定義,而多半是富有表現力的,隱喻性的詞語,例如我們不談論抽象的白,而只說雪白,沒有抽象的 size ,而只說具體的大小。

           亞里士多德認為鐵球在空氣中下落是因為它具有“重性”,而木塊在水中漂浮是因為木塊具有“輕性”。這種將一切原因歸結為事物內在屬性的傳統在一定程度上妨礙了西方人認識到背景的存在和作用,但使得他們可以把問題簡化。

           古希臘人對于類型的熱衷源于他們對于永恒的迷戀。靜態的亙古不變的世界才是他們的思想棲息的場所。具體的物體是易逝的,多變的,只有抽象的類型才是永恒的存在,也只有抽象概念之間的關系才是永真的聯系。而具體實例之間的關聯在某種程度上被認為是不重要的,甚至是不可靠的。



           將具有某一屬性的所有物體定義為一個集合,這一做法在上世紀初被發現會引起邏輯悖論,動搖了整個數學的基礎,它絕不像表面上看起來那么單純。但確定無疑的是,通過類型來把握不變的事實是一種非常重要且有效的認識策略。面向對象語言強調名詞概 念,從引入類定義以及類之間的繼承關系開始,這符合西方一貫的作風。而 Ruby 這種強調實例間關系的動態語言首先由日本人發明,可能也不是偶然的。雖然現在大家都在玩高科技了,可實際販賣給你的多半仍然是包治百病的祖傳秘方。文化可能造成認知上的一種偏執,在技術領域這一現象并沒有被清楚的意識到。

     

    posted @ 2009-02-21 19:43 canonical 閱讀(1762) | 評論 (2)編輯 收藏

        軟件開發作為一種工程技術,它所研究的一個重點就是如何才能有效降低軟件產品的研發成本。在這一方向上,組件技術取得了空前的成功。它所提供的基本圖景是 像搭積木一樣從無到有的組裝出最終的產品。在某種意義上,這是對現代建筑工業的模仿和致敬。新材料,預制件,框架結構,這些建筑學的進展在軟件領域被一一 復制,建筑工地上的民工自然也成為了程序員們學習的楷模。畢竟,在組件的世界中碼代碼,基本上也是一種“搬磚”的行為。

        值得慶幸的是,軟件開發作為一種智力活動,它天生具有一種“去民工化”的傾向。信息產品有著與物質世界產品完全不同的抽象本質。在物理空間中,建造100 棟房屋,必須付出100倍的努力,老老實實的干上100遍。而在概念空間中建造100棟房屋,我們卻可以說其他房屋與第一棟一模一樣,加點平移旋轉變換即 可。一塊磚填了地基就不能用來蓋屋頂,而一段寫好的代碼卻可以在任何可用的場合無損耗的被使用。一棟建好的房屋發現水管漏水要大動干戈,而在完成的軟件中 補個局部bug卻是小菜一碟。在抽象的世界中有效的進行生產,所依賴的不應該是大干,苦干的堆砌,而應該是發現某種可用于推導的原理,基于這些原理,輸入 信息可以立刻轉換為最終的結果,而不需要一個逐步構造的過程。即我們有可能超越組裝性生產,實現某種類似于數學的原理性生產。http://canonical.javaeye.com/blog/325051

        代碼復用是目前軟件業中鼓吹降低生產成本的主要口號之一。但是在組件技術的指向下,一般所復用的只是用于構建的磚塊,而并不是某種構造原理。即使在所有信 息已經確定的情況下,我們仍然不可能從需求立刻得到可執行的產品。很多代碼即使我們在想象中已經歷歷在目,卻仍然需要一行行把它們謄寫下來。當我們發現系 統中已經沒有任何組件值得抽象的時候,仍然留下來眾多的工作需要機械化的執行。代碼復用的理想國距離我們仍然非常的遙遠。

        子例程(subroutine)是最早的代碼重用機制。這就像是將昨天已經完成的工作錄制下來,在需要的時候重新播放。函數(function)相對于子 例程更加強大。很多代碼看起來并不一樣,但是如果把其中的差異部分看作是變量,那么它們的結構就可以統一了。再加上一些判斷和循環,很多面目迥異的東西其 實是存在著大量共享信息的。面向對象技術是一次飛躍性的發展。眾多相關信息被打包到一個名稱(類型)中,復用的粒度和復雜度都大大提升。派生類從基類繼 承,可以通過重載實現對原有代碼的細致調整。不過,這種方式仍然無法滿足日益增長的復用需求。很多時候,一個名稱并不足以標定我們最終需要的代碼結構,在 實際使用的時候還需要補充更多的信息。類型參數化,即泛型技術,從事后的角度看其實是一種明顯的解決方案。根據參數動態的生成基類自然可以吸納更多的變 化。經歷了所謂Modern C++的發展之后,我們現在已經非常明確,泛型并非僅僅能夠實現類型共變,而是可以從類型參數中引入更豐富的結構信息,它的本質是一種代碼生成的過程。http://canonical.javaeye.com/blog/57244 認清了這一點,它的擴展就非常明顯了

       BaseClass<ArgClass> --> CodeGenerator<DSL>

    DSL(或者某種模型對象)相對于普通的類型(Class),信息密度要大很多,它可以提供更豐富也更完整的輸入信息。而CodeGenerator也不必拘泥于基礎語言本身提供的各種編譯機制,而是可以靈活應用各種文本生成技術。http://canonical.javaeye.com/blog/309395 CodeGenerator在這里所提供的正是根據輸入模型推導出完整實現代碼的構造原理。

        現在很多人熱衷于開發自己的簡易代碼生成工具,這些工具也許可以在簡單的情形下減輕一些體力工作,但是生成的代碼一般不能直接滿足需求,仍然需要手工執行 大量的刪改工作。當代碼生成之后,它成為一種固化的物質產品,不再能夠隨著代碼生成工具的改進而同步改進,在長期的系統演化過程中,這些工具并不一定能夠 減少累積的工作量。

       修正過程  ==> CodeGenerator<DSL>

    為了改進以上代碼生產過程,一些人試圖在CodeGenerator中引入越來越多的可配置性,將各種變化的可能內置在構造原理中。顯然這會造成CodeGenerator的不正常的腫脹。當更多的偶然性被包含在原理中的時候,必然會破壞原理的簡單性和普適性。

       輸入信息 + 一段用于推導的原理 + 修正補充 = 真實模型

    必須存在[修正補充]這一項才能維持以上方程的持久平衡。

        為了擺脫人工修正過程,將模型調整納入到概念世界中,我們需要超越繼承機制的,更加強大的,新的技術手段。其實在當前的技術背景下,這一技術已經是呼之欲出了。這就是AOP, Aspect Oriented Programming。http://canonical.javaeye.com/blog/34941

          Biz ==[AOP extends]==> CodeGenerator<DSL>

    繼承僅僅能夠實現同名方法之間的簡單覆蓋,而AOP所代表的技術原理卻是在代碼結構空間中進行任意復雜的刪改操作,它潛在的能力等價于人工調整。

        為了實現上述生產模式,需要對編程語言,組件模型,框架設計等方面進行一系列改造。目前通用的AOP實現和元編程技術其實并不足以支持以上模式。http://canonical.javaeye.com/blog/275015
        這一生產模式將會如何演化,也是一個有趣的問題。按照級列理論,我們立刻可以得到如下發展方向:

        Context0 + DSL1 + EXT0 = DSL0  
        Context1 
    + DSL2 + EXT1 = DSL1 
       

     http://canonical.javaeye.com/blog/33824

    Witrix平臺中BizFlow可以看作是對DaoWebAction的修正模型,但是它本身具有完整的意義,可以直觀的被理解。在BizFlow的基礎上可以逐步建立SeqFlow,StateFlow等模型。http://canonical.javaeye.com/blog/126467

          現在有些人試圖深挖函數式語言,利用模式匹配之類的概念,做符號空間的全局優化。但是我們需要認識到通用的機制是很少的,能夠在通用語言背景下被明確提出 的問題更是很少的。只有在特定領域中,在掌握更多局部信息的情況下,我們才能提出豐富的問題,并作出一定背景下的解答。DSL的世界中待做的和可做的工作 很多。http://canonical.javaeye.com/blog/147065

          對于程序員而言,未來將變得越來越豐富而復雜,它將持續拷問我們的洞察力。我們不是一行行的編寫代碼,把需求一條條的翻譯到某種實現上,而是不斷發明局部的生產原理,依靠自己制定的規則在抽象的空間中不斷的創造新的表象。

    posted @ 2009-02-15 18:21 canonical 閱讀(2092) | 評論 (2)編輯 收藏

           負數沒有直接的幾何意義,因此它被認為是對應于不存在的事物。而按照古希臘的邏輯,不存在的事物是不可能存在的,因而也就是無法被理解的,更不可能參與到 推理過程中,因此是無意義的,無法被定義的, 因此它是不存在的。中國人注重的是運算的合理性,而不是數的真理性,大概在公元前400年左右就創造了負數和零的概念。而在西方直到公元7世紀(唐代)的 一本印度人的著作中才出現負數,它被用來表示負債。西方人沒有能夠創造負數,他們對負數的接受更遲至15世紀左右。這件事實在一定程度上說明了存在某種深 刻的困難阻礙我們理解負數概念。
           在引入負數之前,3x^2 + 8 = 4x 和  3x^2 + 4x + 8 = 0 這兩個方程的結構是完全不同的,它們需要不同的求解技術,因此也就不可能利用符號抽象出 a x^2 + b x + c = 0。引入負數才使得我們能夠以統一的方式提出問題,并研究通用的求解技術。
          群論(Group Theory)是對結構進行抽象研究的數學分支。群的定義包括四條規則
    1.    元素之間的運算滿足結合律 (a * b) * c = a * (b * c)
    2.    元素之間的運算封閉,即 a * b 仍然屬于該群
    3.    存在單位元,即對所有a, a * e = e*a = a
    4.    每個元素存在對應的逆元,a * a^-1= e
          逆運算是非常重要的結構要求,逆元是對負數的一種抽象推廣。如果沒有逆元,則只能構成半群(semi-group),它的性質要少很多。


          目前軟件設計中所有的原則都指向組裝過程,從無到有,層層累進。構件組裝的隱喻中所包含的圖像是操縱實際可見的積木,是缺少逆元概念的。

          考察一個簡單的例子,假設需要的產品是三角形內部挖去一個五邊形的剩余部分。有三種生產策略:
    1.    對最終需要的產品形態進行三角剖分,使用8個小三角形拼接出來。這種方式比較繁瑣,而且最后粘接工序的可靠性和精確性值得懷疑。
    2.    拿到一個真實的三角形,然后用刀在內部挖出一個五邊形的洞。這種方式需要消耗一定的人工,而且也很難保證五邊形的精確性,即使我們曾經精確的生產過其他五角形和三角形。實際上一般情況下我們是逐步銼出一個五邊形的,并沒有充分利用到五邊形的對稱性。
    3.    在概念空間中做一個抽象計算  (-五邊形) + (三角形) = 所需產品
    如果我們能夠生產一種負的五邊形和一種正的三角形,則可以立刻得到最終的產品。



     
    在軟件開發的實踐中,我們目前多數采用的是兩種方式:
    1.    采用可視化設計工具通過拖拽操作開發出完整的界面和后臺
    2.    拷貝一些已有的代碼,刪除掉不需要的部分,增加一些新的實現,也可能對已有實現做一些不兼容的修正。

    在第二種方式中
               新結構的構造 = 已有結構 + 軟件之外的由人執行的一個剪裁過程
    這個剪裁過程表現為一個時間序列。如果我們對原有結構進行了調整,則需要重新關聯一個時間序列,而此時間序列并不會自動重播。為了壓縮以時間為度量單位的 生產成本,我們必須減少對時間序列的依賴。在時間序列中展開的一個構造過程可以被轉化為一個高維設計空間中的一種更加豐富的構造原理,我們最終的觀測可以 看作是設計空間向物理空間的一個投影(想象一束光打下來)。這種方式更容易保證程序的正確性。
              時間序列 --[原理轉化]--> 空間關系


        這樣我們就可以使用第三種生產策略:利用構造原理進行抽象計算。如果我們只盯著產品的最終形態看,只是想著怎么把它像搭積木一樣搭建出來,就不可能識別出 系統結構本身所蘊含的對稱性。如果我們發現了系統內蘊的結構特征,但是卻只能通過構造過程中的行動序列來追隨它,同樣無法實現有效的工作復用。同時因為這 個行動序列一般處于系統規則約束之外,完全由人的自覺來保障,因此很難保證它的正確性。現實世界的規范要求并不是模型本身所必須滿足的,只要我們能夠創造 新的結構原理,在概念空間中我們就可以擁有更多的自由。現在業內鼓吹的軟件構造原理多半是參照物理世界中生產具體物質產品的生產工序,卻沒有真正把握信息的抽象本質。掌握規則,制訂規則,才是信息空間中的游戲規則。

        物理學中最重要的分析學思想之一是微擾論(Perturbation). 針對一個復雜的物理現象,首先建立一個全局的規范的模型,然后考慮各種微擾條件對原有模型的影響。在小擾動情況下,模型的變化部分往往可以被線性化,被局 域化,因而問題得到簡化。微擾分析得到的解依賴于全局模型的解而存在,因而這是一種主從關系的分解方式。但是如果主體模型是我們已經熟知的物理現象,則我 們關注的重點可以全部放在擾動解上,認為所有特定的物理規律都體現在擾動解中。如果微擾分析得到的物理元素足夠豐富,則微擾模型本身可以成為獨立的研究對 象,在其中我們同樣可以發現某種普適的結構規律。
        考察如下的構造過程
           X = a + b + c
           Y = a + b + d = (a + b + c) - c + d = X - c + d
        對于數學而言,上述的推導是等價的,但是對于物理學而言,Y = a + b + d 和  Y = X - c + d是有著本質不同的。第一種方式要求打破原先X的構造,而重新的組裝其實是有成本的,特別是在X本身非常復雜的情況下。典型的,如果X是經過測試的功能, 重新組裝后原先由測試保障的概念邊界被打破。
             我們可以從Y = X + dX抽象出擾動模型  dX = - c + d
    主從分解模式自然的導出逆元概念。

          如果沒有逆元,我們必然需要分解。但是如果發掘了背景這一概念,在逆元運算下,對背景不是分解讓其成為可見的部分,而是采用追加的,增刪的方法對背景結構 進行修正,則我們有可能在沒有完整背景知識的情況下,獨立的理解局部變化的結構。即背景是透明的,知識成為局部的。在Witrix平臺中,BizFlow + DaoWebAction + StdPage 才構成完整的程序模型,BizFlow其實是對標準模型的差異描述,但是它可以被單獨的理解。如果我們從接觸程序開始就接受BizFlow, 就可能完全不需要了解數據庫訪問和前臺界面渲染的知識。我們并不是通過在DaoWebAction中設定各種可預見的調用形式,而是在BizFlow中通 過類似AOP的操作方式直接對標準模型進行修正。這種修正中一個很重要的部分就是刪除標準模型中缺省提供的功能。
         WebMVC之前世今生 http://canonical.javaeye.com/blog/163196
         Witrix架構分析 http://canonical.javaeye.com/blog/126467


          變化的部分構成獨立于原始模型的新的模型,它的結構關系是完備的,可以獨立的理解。在原始模型崩潰的情況下,它仍然可能保持有效性。
          從物理學的角度看,我們所觀測到的一切物理現象,都是某種物理作用的結果,也就是物質結構相對于背景狀況的一種偏離。我們只可能觀測到變化的部分,因此我們對世界的認識其實只是世界的擾動模型而已,世界的本體不屬于科學研究的范疇。

    posted @ 2009-02-07 22:22 canonical 閱讀(1610) | 評論 (1)編輯 收藏

        軟件技術的發展是一個結構化不斷加深的過程,我們逐漸擁有了越來越豐富的結構識別, 表達和處理手段。在這一方向上, 組件技術最終取得了巨大的商業成功。但是區分同時也就意味著隔閡。面向對象技術最基礎的概念在于 O = C(O), 對象的復合(Composition)仍然是對象.  然而在越來越復雜的軟件生態環境中,這一圖景實現的可能性被大大的壓縮. 面對層層封裝造成的形態各異的表達方式, 不同來源, 不同目標, 不同運行環境下的信息的交互變得越來越困難。我們逐漸喪失了概念上的簡潔性, 也喪失了數學世界中的那種穿透一切的統一的力量. 所謂SOA(Serivce Oriented Architecture)技術試圖通過補充更多的環境信息,放棄狀態關聯,暴露元知識等方式來突破現有的困境。 http://canonical.javaeye.com/blog/33803 這其中一項關鍵的技術抉擇是基于文本格式進行信息表達。

          在過去10年中Web技術取得了空前的成功,它造就了互聯網這一世界上最大的分布式集成應用。SOA從某種程度上說是對這一事實在技術層面上的反思。基于 文本傳遞的web技術所表現出來的開放性,可理解性和可觀測性,與封閉的,難以直接解讀的,必須擁有大量相關知識才能正確操作的二進制結構相比,這本身就 是革命性的創新。不需要特殊的工具就可以非常輕易的察看到網頁程序的輸入輸出,所有交互過程都處在完全透明的檢查下,各種不曾事先規劃的文本處理手段都可 以參與到web創建的過程中。隨著速度,存儲不再是我們考慮的首要問題,文本化作為一種技術趨勢逐漸變得明確起來。但是任何一種技術思想的成功或失敗都不 可能是因為某種單一的原因所造成的,因此有必要對文本化的技術價值做更加細致的剖析。
      
       1. 文本化是一定程度上的去結構化,但是通過這種方式我們獲得了對程序結構的更強的控制力。無論我們所關心的文本片斷層層嵌套在大段文本的哪個部分,我們都可 以通過text.indexOf(subStr)來實現定位,通過text.replace(oldStr,newStr)實現變換。而在組件系統中,我 們只有通過某種預定的遍歷方式逐步遞歸才有可能訪問到組件內部的組成對象。如果某個組件不按照規范實現或者規范中缺少明確的設定,則這一信息關聯鏈條將會 斷裂。在一些組件系統中,甚至沒有規定一種統一的遍歷方式,則我們根本無法定義出通用的大范圍的結構定位/變換手段。即使是在設計精良的組件框架中,受限 制于組件的封裝性要求,我們也不可能訪問到全部的信息。當我們以組件設計者意料之外的方式使用這些組件的時候,就會遇到重重障礙。即使所需的只是微小的局 部調整,因為無法觸及到需要修改的部分,我們也可能被迫放棄整個組件。
      
       2. 文本是普適的信道。各種操作系統,各種程序語言所具有的最基本的能力就是文本處理能力,對于文本格式的約定是最容易達成共識的。雖然對于機器而言,理解基 于地址定位的二進制數字可能更加直接,但是所有的應用程序都是由人來負責編制,調試,部署,維護的,如果人可以不借助特殊的工具就可以明確了解到系統內發 生的過程,則系統的構建和維護成本就會大幅下降。
      
       3. 文本表述形式上的冗余性增強了系統的概念穩定性和局部可理解性。在二進制格式中,經常出現的是根據相對地址定位,這要求我們完整理解整個二進制結構,才能 夠逐步定位到局部數據塊。同時,二進制格式中也經常使用一些外部的信息,例如某個位置處的數據為整型,占用四個字節等。這樣的信息可能只能在文檔說明里查 到,而在數據體中沒有任何的體現,這限制了獨立的理解可能性。與此相反,文本格式經常是自說明式的,例如width:3.5px, 這提高了系統的可理解性,特別是局部可理解性。即使我們對系統只具有很少的知識,一般也能根據數據周圍的相關信息進行局部操作。一般很容易就能夠定位到特 殊的局部數據區,安全的跳過眾多未知的或者不被關心的結構. 一個程序新手也可以在很短時間內靠著連蒙帶猜, 實現xml格式的word文件中的書簽替換功能,而要搞清楚word的二進制格式,并獨立編制出正確的替換功能,顯然就不是一兩周的工作量可以解決的了. 這其中, 可理解性的差異是存在著數量級上的鴻溝的.
      
       4. xml這種半結構化的文本格式規范的興起, 以通用的方式為文本描述引入了基本的形式約束, 實現了結構表達的均一性. C語言中的宏(Macro)本質上就是一種文本替換技術,它的威力在于沒有預定義的語義, 因此可以超越其他語法成分, 破除現有語法無法跨越的限制. 但是它的危險性在于缺乏與其能力相適應的形式約束, 難以控制. 而在xml格式規范下, 不同語義, 不同抽象層面的節點可以共存在同一個形式體系中, 可以用通用的方式進行定位,校驗, 轉換等. Witrix平臺在動態xml方面發展了一系列技術, 為文本處理引入了更多應用相關的規則, 增強了文本描述的抽象能力和表達能力. 
      
       5. 文本作為描述(description)而不是執行指令(execution). C語言的源代碼與機器碼基本上是一一對應的, 即源代碼本身所表達的就是指令的執行過程. 而在Web應用領域, HTML語言僅僅是聲明界面上需要展現什么, 但是如何去實現是由通用的解析引擎負責,它并不是我們關注的重點. 描述需要結合詮釋(解釋)才能夠產生實際的運行效果, 才能對現實的物理世界產生影響.這在某種程度上實際上是延遲了執行過程. 一種描述可以對應多種詮釋, 例如同樣的元數據在前臺可以用來生成界面,在后臺可以用于生成數據庫, 進行數據有效性校驗等. 在特定的應用領域中,執行引擎可以是通用的, 可以獨立于描述本身不斷演化, 因此一種領域特定的描述,它所承載的內容并不是固化的, 而是可以隨著執行引擎的升級不斷增強的. 例如, 在Witrix平臺中, FlowDSL本身所做出的流程描述是穩定的, 但是隨著流程引擎不斷改進,不斷引入新的功能,所有使用DSL的已實現的應用都同步得到升級. http://canonical.javaeye.com/blog/275015
      
       6. Text = Process(Text) 這個不動點在Unix系統中得到了充分的應用: 多個小程序通過管道(Pipe)組合在一起, 可以完成相當復雜的功能. 一個更加豐富的處理模型是 XML = Process(XML). 文本描述很自然的支持多趟處理, 它使得我們可以充分利用全局知識(后續的處理過程可以使用前次處理過程收集的全局信息), 可以同時支持多個抽象層面(例如DSL的不斷動態展開). Witrix平臺中的編譯期運行技術實際上就對應于如下簡單規則: 編譯期運行產生文本輸出, 對輸出文本再次進行編譯. 通過這一遞歸模式, 可以簡單的實現動態解析與靜態描述之間的平衡. 模板(Template)技術是具有關鍵性作用的文本生成技術. out.write("<div>");out.write(value);out.write("</div>");這種 API拼接方式顯然不如<div>${value}</div>這種模板生成方式直觀且易于使用. 在Witrix平臺的tpl模板語言中, xml的規范性使得在多趟編譯過程中我們一直可以維持某種形式約束.
      
       7. 不是所有的情況下都應該使用文本. 普元EOS中所鼓吹的XML總線之類的技術是我所極力反對的. http://canonical.javaeye.com/blog/33794

    posted @ 2009-01-04 00:55 canonical 閱讀(1985) | 評論 (1)編輯 收藏

        代碼生成(Code Generation)本身是一個非常宏大的概念。從某種意義上說,當我們明確了計算的意義之后,所做的一切都只是一系列代碼生成的過程,最終的目標是生成某種可執行的機器碼。對web程序員來說,代碼生成是最熟悉不過的了,每天我們所做的工作就是JSP=>Servlet=>HTML。不過,現在多數人腦海中的代碼生成,指的一般只是根據配置輸出一個或多個程序文本的過程,最常見的是根據數據庫模型生成增刪改查相關代碼。這種技術其實很少在小型以上的項目中起到積極的作用.因為一般的生成工具都沒有實現追加功能,無法適應模型的增量修改。此外一般生成的代碼相比于手工書寫的代碼要更加冗長,需要被直接理解的代碼總量不降反升.為圖一時之快,所要付出的是長期的維護成本。

       在應用開發中,有些領域是非常適合于使用代碼生成技術的。例如根據領域模型生成ORM(對象-關系映射)描述,或者根據接口描述生成遠程調用代理/存根 (Proxy/Stub)等。因為它們實際上只是對同一信息的不同技術形式或者不同技術層面的同義反復而已。這種生成最理想的方式是動態進行,可以隨時保持模型的有效性。RoR(RubyOnRails)框架中ActiveRecord技術便是一個成功的范例,它甚至提供了動態生成的DAO函數,減少了一系列的包裝調用過程。

       代碼生成更加深刻的應用是完成高層模型向低層模型的轉化,這一過程往往是非平凡(non-trivial)的。在Witrix平臺中通過代碼生成來支持領域抽象,可以用非常低的成本跨越結構障礙,將自定義的領域模型嵌入到現有的技術體系中。這其中我們的主要工作是解決了生成代碼與手工書寫代碼之間的有效隔離及動態融合問題,確保代碼生成可以反復的以增量的方式進行,同時支持最細粒度處對生成的代碼進行定制調整。

       舉一個簡單的例子,假設現在需要開發一個三步審批的流程,每一步的操作人可以錄入意見,可以選擇通過或者回退,可以選擇下一步操作的具體操作人,系統自動記錄操作時間,每個操作人可以查看自己的操作歷史等。雖然在現有技術體系中實現這一功能需要不少代碼,但是在業務層面上描述這一功能并不需要很多文字,實際需要提供的信息量很小。顯然,建立領域模型是比較適合的做法,可以定義一種DSL(Domain Specific Language)來描述這一模型。

       <flow_cp:SeqFlow>
         
    <step id="draft" userField="draferId" dateField="draftTime" waitStatus="drafted" />
         
    <step id="check" userField="checkerId" dateField="checkTime" opinionField="checkOpinion"
                       waitStatus
    ="sent" />
         
    <step id="approve" userField="approverId" dateField="approveTime"
                    opinionField
    ="approveOpinion" waitStatus="checked" passStatus="approved" />  
       
    </flow_cp:SeqFlow>

       以上功能涉及到多個操作場景,實現的時候需要補充大量具體信息,其中很大一部分信息來自于背景知識,例如顯示樣式,界面布局,前后臺通信方式等。以上模型可以進一步抽象為如下標簽
       <flow_cp:StepFlow3/>

      在不同應用中復用以上流程邏輯的時候可能需要局部修正,例如
       <flow_cp:StepFlow3>
          
    <step id="check" userField="checker" />
       
    </flow_cp:StepFlow3>

       更加復雜的情形是DSL本身提供的抽象無法滿足全部需求,而需要在局部補充更多模型之外的信息,例如物品接收單審批通過后自動導入庫存等。
     
       在Witrix中,代碼生成不是直接產生最終的輸出,而是在編譯期生成基礎模型,它與補充描述通過extends算子進行融合運算之后產生最終輸出, 這種融合可以實現基礎功能的新增,更改或者刪除。典型的調用形式為

      
    <biz-flow>
           
    <extends>
             
    <flow_cp:StepFlow3>
               
    <step id="check" userField="checker" />
              
    </flow_cp:StepFlow3>
           
    </extends>
           
           
    <action id="pass_approve">
             .
           
    </action>
       
    </biz-flow>

    這里的操作過程可以看作是BizFlow extends SeqFlow<FlowConfig extends StepFlow3Config>,與泛型技術非常類似,只是需要更強的局部結構控制能力。
        按照級列理論http://canonical.javaeye.com/blog/33824 ,我們可以定義一個DSL的級列,整個抽象過程為
         Context0 + DSL1 + EXT0 = DSL0
         Context1 + DSL2 + EXT1 = DSL1
           

        在目前一些通用語言中,也有一些所謂內嵌DSL的方案,可以提供比較簡潔的業務描述。但是僅僅建立DSL描述是不充分的,從級列理論的觀點看,我們必須提供一種DSL的補充手段,能夠在細節處補充DSL模型之外的信息,實現兩者的自然融合。同時我們應該可以在不同的抽象層面上獨立的進行操作,例如在 DSL1和DSL2的層面上都可以通過類似繼承的操作實現局部調整,這同時也包括在不同的抽象層面上都能對模型進行合法性校驗。
       

    posted @ 2008-11-23 11:57 canonical 閱讀(1919) | 評論 (0)編輯 收藏

       軟件系統的構建之所以與建筑工程不同,無法達到建筑工程的精確性和可控性,其中一個很重要的原因在于建筑的產物是一個靜態的結構,建筑的過程主要是采用各種預制件填充某個規劃好的建筑空間,而軟件是一種動態運行的產品,它的各個組成部分之間的關系不是可以靜態描述的,而是存在著復雜的交互關系,而且軟件在運行的過程中還需要根據需求的變化進行動態的調整,這種動態性使得軟件開發中很難抽象出固定的預制件,很難像建筑工程那樣實現標準件的組裝。現在所謂構件技術的構件插拔圖景其實是具有誤導性的。

        但是從另外一方面說,軟件內在的動態性使得它可以具備更強的適應能力,如果所編制的軟件把握住了業務機制的核心內容,則在運行過程中只需要進行少量調整就可以應對大量類似情況。100棟類似的建筑需要花費100倍的建造費用,而100個近似的軟件需求的滿足可能只需要花費2至3倍的開發費用。現代軟件企業在研發過程中都在不斷的追求自身產品的平臺化,其目的正在于以不斷提高的適應性來應對不斷變化的客戶需求。我們所面對的要求不僅僅是精確把握需求,而是要深刻把握需求背后所對應的業務機制。

    posted @ 2008-09-01 23:24 canonical 閱讀(459) | 評論 (2)編輯 收藏

    僅列出標題
    共18頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
    主站蜘蛛池模板: 免费成人午夜视频| 亚洲av无码片在线观看| 亚洲精品免费在线视频| 久久亚洲国产最新网站| 亚洲欧洲一区二区三区| 99在线观看视频免费| 亚洲国产成人综合精品| 亚洲国产精华液网站w| 免费高清小黄站在线观看| 岛国岛国免费V片在线观看| 亚洲中文字幕无码av在线| 亚洲毛片av日韩av无码| 97在线线免费观看视频在线观看| 国产免费不卡v片在线观看| 特级做a爰片毛片免费看| 亚洲AV日韩AV天堂一区二区三区| 久久嫩草影院免费看夜色| 亚洲AV无码久久久久网站蜜桃| 2019中文字幕免费电影在线播放| 国产AV无码专区亚洲精品| 成年女人午夜毛片免费视频| a级毛片免费在线观看| 国产精品亚洲专区无码不卡| 亚洲黄色免费观看| 国产成人精品日本亚洲专区61 | 亚洲永久无码3D动漫一区| 免费黄色福利视频| www成人免费视频| 亚洲影视自拍揄拍愉拍| 亚洲国产精品一区二区第一页| 99视频在线精品免费| 农村寡妇一级毛片免费看视频 | 亚洲欧美成aⅴ人在线观看| 亚洲乱码国产一区三区| 国产成人精品免费直播| 麻豆视频免费观看| 无码一区二区三区免费| 国产日韩AV免费无码一区二区 | 亚洲精品美女视频| 黑人大战亚洲人精品一区| 日韩在线看片免费人成视频播放|