1. 程式人生 > >抽象數據類型(ADT)和面向對象編程(OOP)3.2規約

抽象數據類型(ADT)和面向對象編程(OOP)3.2規約

閱讀 合同 表示 自己實現 api 運行 技術分享 AR result

API:application programming interface,是Java自己提供的標準類庫;

查API就是讓你去看Java自己實現的函數,查看它怎樣調用,要傳什麽參數等;

為什麽要寫我們的想法:自己不能記住,其他閱讀的人更改程序的人也不知道。

與電腦溝通先說服編譯器你的程序是合理的 - 語法正確和類型正確。 然後讓邏輯正確,以便在運行時提供正確的結果

與其他人溝通。 使程序易於理解,以便在有人修復,改進或未來適應時,他們可以這樣做

技術分享圖片技術分享圖片

規約給實施者自由地改變實現而不告訴客戶端。通過對輸入的限制說明,省略掉 一些耗時的檢查工作,提升效率

合同充當客戶和實施者之間的防火墻

它將客戶從單位運作的細節中屏蔽掉
它使執行者免於單位使用的細節。 - 此防火墻導致解耦(解耦),允許單元的代碼和客戶端的代碼獨立更改,只要更改符合規範即可。

行為等價性

要確定行為等同性,問題是我們是否可以用另一個實現替代另一個實現(站在客戶端視角看行為等價性) 這些方法不僅具有不同的代碼,而且實際上具有不同的行為。 但是,當val恰好出現在數組的一個索引處時,這兩個方法的行為相同

規範不應該談論方法類的局部變量或方法類的私有字段

前置條件和後置條件

前置條件 requires表示 對客戶端的約束,在使用方法時必須滿足條件

後置條件 effects表示 對開發者的約束,在方法結束時必須滿足的條件 契約:如果前置條件滿足,則後置條件必須滿足

如果在調用該方法時前置條件成立,則該方法完成後,後置條件必須成立。

如果在調用方法時前置條件不成立,則實現不受後置條件的限制。 它可以自由地做任何事情,包括不終止,拋出異常,返回任意結果,進行任意修改等。

Java的靜態類型聲明(也是一種規約)實際上是方法的前提條件和後置條件的一部分,該方法是編譯器自動檢查和執行的一部分。

方法前的註釋也是規約但需要人工檢查判定

@param 參數(前置條件)

@return @throws 返回結果(後置條件)

Java API文檔是從Java標準庫源代碼中的Javadoc註釋生成的

除非後置條件中聲明過,否則方法內部不應改變輸入參數

盡量不設計變化的spec很容易出現錯誤

除非有聲明必須如此,否則不應改變輸入參數

可變的對象使規約變得復雜,降低可變性,盡量少用

對同一個可變對象(對象的別名)的多次引用可能意味著程序中的多個地方 - 可能分隔很大 - 依靠該對象保持一致,需要程序維護一致性

此時合同不再是單純的在客戶和實現者之間維持,不再是在一個地方執行,需 要每一個引用者都有良好的行為

可變的對象使全局屬性難於理解,難於確保程序正確性

我們仍然必須這樣做 - 為了性能和便利性 - 但是為了這樣做,我們在bug安全方面付出了巨大的代價

可變對象使得客戶端和實現者之間的契約更加復雜,並且減少了客戶端和實現者改變的自由(使用允許更改的對象會使代碼難以改變)

測試驗證規約

技術分享圖片技術分享圖片

記錄每個參數,返回值,每個異常(選中和未選中)方法執行的操作,包括目的,副作用,任何線程安全問題,任何性能問題

抽象數據類型(ADT)和面向對象編程(OOP)3.2規約