软件构造学习笔记-第五周
本周講了AF、RI、Safety from rep exposure、spec等概念。這些是輔助程序設(shè)計(jì)的重要部分,需要在代碼中以注釋的形式體現(xiàn),可以顯著提高代碼可讀性,明確設(shè)計(jì)的目的。必須要養(yǎng)成寫的習(xí)慣!!!
設(shè)計(jì)規(guī)約
1.規(guī)約的強(qiáng)弱
前置條件更弱,或后置條件更強(qiáng)的規(guī)約,是較強(qiáng)的規(guī)約。如果一個(gè)規(guī)約強(qiáng)于另一個(gè)規(guī)約,則可以用較強(qiáng)的代替較弱的。
2.規(guī)約越強(qiáng),開發(fā)者的責(zé)任越重,使用者的責(zé)任越輕。如Lab1的GenerateMagicSquare,如果規(guī)約要求必須輸入奇數(shù)(較強(qiáng)前置條件),則需要用戶進(jìn)行操作。如果不要求必須輸入奇數(shù)(較弱前置條件),開發(fā)者就需要在程序中添加對(duì)輸入奇數(shù)的操作。
3.某個(gè)具體實(shí)現(xiàn),如果滿足規(guī)約,則落在其范圍內(nèi);否則在其之外。越強(qiáng)的規(guī)約,對(duì)應(yīng)的面積越小。
抽象數(shù)據(jù)型(ADT)
1.ADT的特性:表示泄露、抽象函數(shù)AF、表示不變量RI。AF、RI用戶不可見。
2.ADT是由操作定義的,和內(nèi)部實(shí)現(xiàn)無(wú)關(guān)。
ADT類型和方法的分類
1.ADT可以分為可變和不可變數(shù)據(jù)類型。可變類型的對(duì)象提供了可改變其內(nèi)部數(shù)據(jù)的值的操作(如StringBuilder);不可變數(shù)據(jù)類型的操作不改變內(nèi)部值,而是構(gòu)造新的對(duì)象(如String)。
2.抽象類型的方法分類:構(gòu)造器、生產(chǎn)器、觀察器、變值器。
生產(chǎn)器,例如String.concat(),以兩個(gè)String對(duì)象為參數(shù),返回一個(gè)新的String對(duì)象。
觀察器,例如List.size(),返回int。
變值器,例如List.add(),改變對(duì)象屬性。 !!!只在可變類型中出現(xiàn)
3.構(gòu)造器可以實(shí)現(xiàn)為構(gòu)造方法或者靜態(tài)方法。實(shí)現(xiàn)為靜態(tài)方法稱為工廠方法,工廠方法屬于類,而不屬于某個(gè)具體對(duì)象。
4.返回void一定是變值器,如果返回void則必然改變了對(duì)象的某些內(nèi)部狀態(tài)。變值器不一定返回void。
表示獨(dú)立性
用戶使用ADT時(shí)無(wú)需考慮其內(nèi)部實(shí)現(xiàn),ADT內(nèi)部表示的變化不影響spec和客戶端。
違反表示獨(dú)立性的例子:嚴(yán)格限制了people的類型
遵循表示獨(dú)立性的例子:同時(shí)把people改為private
測(cè)試ADT
測(cè)試構(gòu)造器、生產(chǎn)器、變值器:調(diào)用觀察器查看結(jié)果是否滿足規(guī)約
測(cè)試觀察器:調(diào)用構(gòu)造器、生產(chǎn)器、變值器產(chǎn)生或改變對(duì)象,查看結(jié)果是否正確
ADT不變量
1.不變量在任何時(shí)候都是true。
2.由ADT負(fù)責(zé)不變量,不變量和客戶端的任何行為無(wú)關(guān)。
3.總是要假設(shè)用戶有“惡意”破壞ADT的不變量(防御式編程)。
4.除非迫不得已,不要把希望寄托于客戶端上,ADT有責(zé)任保證自身的不變量,并且避免“表示泄露”。最好的辦法就是使用不可變的類型,徹底避免表示泄露。
5.如果一個(gè)類不是不可變的,改變屬性的方式:
-通過屬性中的操作
-表示暴露,方法返回屬性的引用
RI和AF
1.抽象值構(gòu)成的空間是客戶端看到和使用的值(真實(shí)的數(shù)據(jù))。ADT開發(fā)者關(guān)注表示空間R,客戶端關(guān)注抽象空間A。
2.R空間到A空間滿足的性質(zhì):
-滿射,用戶使用的數(shù)據(jù)必須在表示空間出現(xiàn)。
-未必單射,抽象空間的值可能對(duì)應(yīng)表示空間的多個(gè)值
-未必雙射,表示空間的值可能無(wú)法對(duì)應(yīng)抽象空間的值
3.AF:R->A(抽象函數(shù))給出R空間的數(shù)據(jù),如何映射到A空間的解釋。
RI:R->boolean(表示不變性)某個(gè)具體的表示是否是合法的。也可以將RI看成所有表示值的一個(gè)子集,包含了所有合法的表示值。同時(shí)可以將RI看作描述什么是合法表示值的條件。
4.選擇某種特定的表示方式R,進(jìn)而指定某個(gè)子集是合法的(RI),并為該自己中的每個(gè)值做出解釋(AF),即如何映射到抽象空間的值。在設(shè)計(jì)ADT時(shí),先確定AF再確定RI。
5.在所有可能改變r(jià)ep的方法內(nèi)都要檢查RI是否滿足。
有益可變性
1.對(duì)不可變ADT來(lái)說(shuō),它在A空間的抽象值是不變的。但R空間的表示值是可以變化的。
2.不可變類型的屬性不一定不能改變。只要不影響A空間數(shù)據(jù)的變化,屬性改變是可以的。
表示泄露的安全聲明
給出理由證明代碼并未對(duì)外泄露其內(nèi)部表示。
總結(jié)
1.ADT規(guī)約里只能使用客戶端可見內(nèi)容來(lái)撰寫,包括參數(shù)、返回值、異常等。如果規(guī)約里需要提及“值”,只能使用A空間的值。
2.ADT規(guī)約里不應(yīng)該談及任何內(nèi)部表示的細(xì)節(jié),以及R空間的任何值。
3.ADT的內(nèi)部表示(private屬性)對(duì)外部嚴(yán)格不可見。
4.在注釋而不是Javadoc中寫AF和RI,防止被外部看到而破壞表示獨(dú)立性和信息隱藏。
5.表示泄露的風(fēng)險(xiǎn):一旦泄露,ADT的內(nèi)部表示可能在程序的任何位置發(fā)生改變,而不是限制在ADT內(nèi)部,從而無(wú)法保證ADT不變量是否始終為true。
6.檢測(cè)ADT保持不變量的三個(gè)標(biāo)準(zhǔn):
-創(chuàng)建對(duì)象的時(shí)候滿足不變量為true——對(duì)應(yīng)creators、producers
-屬性改變時(shí)滿足不變量為true——對(duì)應(yīng)mutators、observers
-沒有發(fā)生表示泄露
總結(jié)
以上是生活随笔為你收集整理的软件构造学习笔记-第五周的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 人眼像素高达5.76亿人眼有5.76亿像
- 下一篇: 软件构造学习笔记-第六周