<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

    [導入]唯一性與自洽性

    Posted on 2006-04-23 16:39 canonical 閱讀(1693) 評論(0)  編輯  收藏 所屬分類: 設計理論
    http://xp.c2.com/OnceAndOnlyOnce.html
    http://c2.com/cgi/wiki?DontRepeatYourself

    ???? OAOO(Once And Only Once)是我們在軟件開發中需要關注的基本原則之一. 唯一性當然是一個值得追求的目標. 從正交分解的角度上說,系統可以由少數的正交基通過組合構造出來。尤其在分析階段,我們需要牢牢把握住系統內核的幾個變化維度。但是這并不意味著我們最終能夠做到每種可以想見的軟件元素都是唯一的,也不意味著保持唯一性永遠都是最好的。
    ???? 唯一性在軟件中最直接的體現就是代碼的重用(reuse), 除了實現起來節省了工作量之外,代碼重用的另一個作用在于維護了系統中概念的唯一性,或者更廣泛的說,它維護了系統中知識的唯一性。例如,如果我們經常用到圓周率Pi,我們可以選擇在各處都直接寫3.1415926, 也可以選擇定義一個系統常數PI, 在使用的時候引用這個常數,保持關于PI值的知識的唯一性。其實只要各處的PI值是相同的,甚至只要是在誤差范圍內相互匹配的(例如有些地方用3.14, 有些地方用3.1415926),程序就可以正確無誤的運行,這樣就達到了我們開發程序的目的,并不需要什么常數定義。只是為了保證這種知識的一致性,定義一個常數無疑是最簡單直接的一種方法。從理論上說,我們實際需要的只是知識在軟件中能夠得到一致的表達,或者更加抽象一些,我們所需要的只是知識的自洽性,而唯一性無疑是維持自洽性的一種廉價方法。特別是在一個不斷演化的系統中,保持形式上的唯一性可能是實現自洽性的唯一可行的方法。
    ???? 但是, 我們需要認識到知識的一致性與代碼的唯一性并不是等同的,例如同樣是釋放資源的函數, 在不同的應用情形下我們可能將其命名為close, 也可能是destroy, 或者是dispose, 如果我們使用一個接口IDisposable.dispose(), 則引入了一種形式上的唯一性要求. 在使用reflection的情況下, 我們可以放松要求, 不要求對象實現特定的接口, 只要提供指定的函數名(例如dispose)即可. 我們也可以更加寬容, 通過外部描述性數據指定函數的用途, 只要求概念上的一致性, 例如spring中通過destroy-method屬性指定對象資源釋放函數. 沒有語言級別的形式唯一性, 我們就無法依賴于編譯器來維護其隱含的知識的一致性, 此時我們所能使用的通用方法就只有測試(test)了. 實際上, 很多知識上的自洽性要求都無法在程序中直接得到表達, 而只能通過一個構造的測試網絡來進行驗證.

    ???? 正如排他鎖(exclusive lock)是實現transaction的一種強形式一樣, 唯一性也是自洽性的一種強形式。在保持了唯一性的情況下,當然不可能出現沖突的情況,也就自然的維持了系統的自洽性。但是,很多時候概念的多樣性也是我們不得不考慮的內容。在C語言中, memmove函數的功能包括memcpy的功能,到底要不要取消memcpy以避免無謂的錯誤可不是一件容易決定的事情. 在數學上,同一個定理可能存在著多種非平凡(non-trivial)的等價表述形式, 從表面上看,它們可以是完全不相關的,但是原理上是等價的. 而不同的表述往往適用于不同的應用情形. 同樣的,在軟件系統中,It is ok to have more than one representation of a piece of knowledge provided an effective mechanism for ensuring consistency between them is engaged. 在軟件設計中, 引入中間層是在控制內在統一性的同時獲得豐富的外在表現的一種重要方式. 在CORBA中idl編譯器將idl文件翻譯成不同程序語言的版本, 我們在程序中使用的是特定程序語言的版本而不是直接的idl接口文件, 這些版本之間的自洽性是通過idl編譯器來保證的. idl編譯器所做的只是一對一的翻譯工作, 它本身并沒有提供額外的知識, 而它所生成的各個程序語言版本所表達的知識也是相同的. 可以想見, 一種更加復雜的,甚至是具備一定推理能力的引擎(engine)可以基于元知識進行更加復雜的變換工作, 并可以融合其他外部的知識, 最終輸出一系列自洽的表現結構.例如, 我們可以根據一個描述文件生成所有CRUD(Create Read Update Delete)操作的程序代碼和界面代碼. 這些生成的文件中可能存在著重復的代碼,可能重復的表達了某個知識, 例如界面布局等, 但是它們之間通過引擎隱蔽的存在著穩固的聯系
    主站蜘蛛池模板: 毛片a级毛片免费观看免下载| 国产成人AV免费观看| 在线亚洲高清揄拍自拍一品区| 亚洲欧洲自拍拍偷精品 美利坚| 亚洲精品无码你懂的网站| 亚洲精华国产精华精华液好用| xvideos永久免费入口| 国产男女爽爽爽免费视频| 国产曰批免费视频播放免费s| 处破痛哭A√18成年片免费| 国产亚洲欧洲Aⅴ综合一区| 亚洲国产精品yw在线观看| 无码人妻一区二区三区免费视频| 久久精品私人影院免费看| 在线a人片天堂免费观看高清| 99久久国产亚洲综合精品| 成人毛片18女人毛片免费| 亚洲成a∧人片在线观看无码| 男人的天堂亚洲一区二区三区| 亚洲尤码不卡AV麻豆| 亚洲精品女同中文字幕| 日韩电影免费在线| 亚洲一区二区电影| 一级做a爰全过程免费视频毛片| 久久久久亚洲av毛片大| 人人玩人人添人人澡免费| 亚洲国产精品美女| 国产精品白浆在线观看免费| 亚洲国产精品综合久久久| 精品国产免费一区二区| 精品国产日韩久久亚洲| 日韩亚洲国产综合久久久| 97在线视频免费公开视频| 亚洲精品国精品久久99热| 免费毛片a线观看| 亚洲V无码一区二区三区四区观看| 亚洲av无码兔费综合| 免费无码AV电影在线观看| 久久精品国产亚洲av影院 | 中文字幕手机在线免费看电影| 日本午夜免费福利视频|