1、單一職責SRP;
一個模塊的代碼應該盡可能只專注一件事情,要求在設計功能模塊代碼時,盡可能劃分清楚代碼的功能;
比如一個 “容器接口(協議)”, 只有盛和倒,而不應該考慮各種使用方法;
2、開放閉合OCP;
當程序已經正確描述功能穩定發布后,需要添加新的功能或者修改功能時,應該進行對程序進行拓展,而不是修改源代碼。
當杯子實現了 “容器接口 ”,而杯子需要有一個“把手”,應該依賴一個“把手接口”,而不是直接在類里耦合實例一個“把手對象”的。否則,當把手需要替換的時候,你需要每次都從一個帶“把手”的“杯子”中把舊“把手”扔掉,才用上新的。
3、里氏替換LSP;
就是繼承,父類出現的地方,可以用子類對象進行替換,而原程序不會造成變化。理論上,設計(Java)代碼時,應該首選繼承抽象而不是具體。
當保溫瓶繼承了杯子,保溫瓶完全可以滿足杯子的功能,而保溫瓶的功能,杯子并不一定有。
4、依賴倒置DIP;
要求耦合盡量都是抽象的,類關系之間的依賴都應該是具體依賴抽象,是比較難實現的地方。
描述如2、開放閉合原則;
5、接口隔離ISP;
一個接口的方法應該盡量精簡,一個大的接口可以繼承自小的接口,一個具體類應該依賴自最小接口,從而避免實現無用的方法。
如果 “把手容器接口”繼承自“把手接口”和“容器接口”,杯子直接繼承“把手容器接口”。因為這個時候“把手”是不確定,有三種處理選擇:一、把杯子變成抽象類,抽象“把手接口”的方法;二、依賴一個 “把手”對象 ; 三、生成空方法無論哪一種都是可愛的感覺
6、自己舒服原則;
杯子好不好用,自己知道。 如我們都知道,高內聚低耦合是代碼的追求。 聚合/合成原則是一種強耦合原則,而迪米特法則也是一種實踐出來的經驗法門。地要怎么種不是死的。