類的介面分為兩部分 一、良好的抽象 類的介面應該展現一致的抽象層次。每一個類應該實現一個ADT,並且僅僅實現這個ADT。 一定要理解類所實現的抽象是什麼。理解對應的ADT。 提供成對的服務,比如Add、Delete。On、Off等。不要盲目創建相反的操作,但是得考慮是否有需要 把不相關的信息轉移到其 ...
類的介面分為兩部分
- 良好的抽象(Good Abstraction)
- 良好的封裝(Good Encapsulation)
一、良好的抽象
類的介面應該展現一致的抽象層次。每一個類應該實現一個ADT,並且僅僅實現這個ADT。
一定要理解類所實現的抽象是什麼。理解對應的ADT。
提供成對的服務,比如Add、Delete。On、Off等。不要盲目創建相反的操作,但是得考慮是否有需要
把不相關的信息轉移到其他類中。當發現類中一半的方法在使用該類的一半數據,另一半的方法在使用另外一半的數據,這個時候已經把兩個類混在一起了,需要拆分。
儘可能的讓介面可編程,而不是語義表達。可編程的介面部分由介面中的數據類型和其他屬性構成,編譯器能強制要求他們,語義部分則由“本介面會被怎樣使用”組成,如FuntionA必須在FunctionB調用之前進行調用。
不要添加與介面抽象不一致的公用成員,當要在類中添加方法時,先問問“這個方法與現有介面的所提供的抽象一致嗎?”
同時考慮抽象性和內聚性,一個呈現很好抽象的類介面通常有很高的內聚性,反之亦然。如果發現某個類的內聚性很弱,也不知道該怎麼修改,換一種方法:問問這個類是否表現為一致的抽象。
二、良好的封裝
抽象通過提供一個可以讓你忽略實現細節的模型來管理複雜度,而封裝則用於強制組織讓看到細節。
儘可能的限制類和成員的可訪問性。
不要公開暴漏數據成員。
避免把私有的實現細節放入類的介面中。
不要對類的使用者做出任何假設。
不要因為一個子程式里僅僅使用了公用子程式,就把它歸入公開介面。要反問:把這個子程式暴漏給外界後,介面所展示的抽象性是否還是一致的。