每次需求評審產品總是讓我提高程式碼複用,說白了就是合成複用原則

語言: CN / TW / HK

前言

  • 原則是對我們的一種約束,按照約束開發前期可能會很通過。但是程式能夠穩步的擴充套件及執行。面對程式開發時我們不能僅僅面對當下,還需考慮未來。
  • 合成複用原則也叫做組合/聚合複用原則。相信在前面的原則系列中大家不止一次聽說過組合,聚合,依賴等關鍵詞了吧。他們之間都是一種耦合的作用。你可以能又要說了不是說高內聚低耦合的。但是你要記住一點不管怎麼低耦合。耦合還是會存在的。不耦合怎麼叫做協同開發了。你不與人交流如何讓別人知道你的想法呢?
  • 顧名思義合成複用原則他是想讓我們能夠複用我們的邏輯程式碼。在依賴時儘量使用組合,聚合的方式來實現功能的整合,其次才是使用繼承的方式

image-20220429161953945.png

造汽車

public class Common {      public static void main(String[] args) {          new WhileElectricCar().driver();          new RedElectricCar().driver();          new WhilePertolCar().driver();          new RedPertolCar().driver();     }  }  class Car{      public void driver() {          System.out.println("我是汽車,可以行駛");     }  }  ​  class PertolCar extends Car {      @Override      public void driver() {          System.out.println("我是汽油汽車,正在行駛");     }  }  ​  class WhilePertolCar extends PertolCar {      @Override      public void driver() {          System.out.println("我是白色的汽油汽車,正在行駛");     }  }  ​  class RedPertolCar extends PertolCar {      @Override      public void driver() {          System.out.println("我是紅色的汽油汽車,正在行駛");     }  }  class ElectricCar extends Car {      @Override      public void driver() {          System.out.println("我是電力汽車,正在行駛");     }  }  ​  class WhileElectricCar extends ElectricCar {      @Override      public void driver() {          System.out.println("我是白色的電力汽車,正在行駛");     }  }  ​  class RedElectricCar extends ElectricCar {      @Override      public void driver() {          System.out.println("我是紅色的電力汽車,正在行駛");     }  }

  • 上面程式碼像我們展示瞭如何製造汽車。可想而知當我們汽車種類和顏色種類越來越多的情況下,我們的子類也會越來越多。對應的UML圖示如下

image-20220502161235813.png

  • 按照這樣的發展,子類會越來越多不利於我們的管理,而且對我們的程式碼改動行也是非常大的。不夠靈活。假如我們除了顏色和車行駛能源角度還有是否自動這個引數,那麼我們所有的子類都得重新編寫。這無疑是不可取的,無疑也是程式碼不夠靈敏的。

合成複用

  • 針對上面我們提到的問題,我們進行如下修改

public class Hecheng {      public static void main(String[] args) {          Color redColor = new Color() {              @Override              public String getCurrentColor() {                  return "紅色";             }         };          Color whileColor = new Color() {              @Override              public String getCurrentColor() {                  return "白色色";             }         };          Color blackColor = new Color() {              @Override              public String getCurrentColor() {                  return "黑色";             }         };          PertolCar pertolCar1 = new PertolCar(redColor);          PertolCar pertolCar2 = new PertolCar(whileColor);          PertolCar pertolCar3 = new PertolCar(blackColor);          ElectricCar electricCar1 = new ElectricCar(redColor);          ElectricCar electricCar2 = new ElectricCar(whileColor);          ElectricCar electricCar3 = new ElectricCar(blackColor);          pertolCar1.driver();          pertolCar2.driver();          pertolCar3.driver();          electricCar1.driver();          electricCar2.driver();          electricCar3.driver();     }  }  ​  interface Color{      public String getCurrentColor();  }  ​  class Car{      private Color color;  ​      public Color getColor() {          return color;     }  ​      public void setColor(Color color) {          this.color = color;     }  ​      public Car(Color color) {          this.color = color;     }      public void driver() {          System.out.println(this.color.getCurrentColor()+"我是汽車,可以行駛");     }  }  ​  class PertolCar extends Car {      public PertolCar(Color color) {          super(color);     }  ​      @Override      public void driver() {          System.out.println(getColor().getCurrentColor()+"我是汽油汽車,正在行駛");     }  }  ​  class ElectricCar extends Car {      public ElectricCar(Color color) {          super(color);     }  ​      @Override      public void driver() {          System.out.println(getColor().getCurrentColor()+"我是電動汽車,正在行駛");     }  }

  • 如果程式碼看到比較凌亂,我這裡整理了下對應的UML圖。應該看這比較清晰點。

image-20220505090520336.png

小結

  • 我們總是說面向介面程式設計。不管是介面也好,還是抽象也罷。我們的目的只有一個提高程式的複用性。複用性提高了自然就減少了同類的產生。也提高了我們對程式碼的維護性

設計原則總結

  • 到這裡我們所有的設計原則已經全部梳理完了。【單一職責】【介面隔離原則】【依賴倒轉原則】【里氏替換原則】【開閉原則】【迪米特法則】【合成複用原則】七大設計原則
  • 這些原則是我們在設計初期儘量遵循的。但是我們需要看清一個事實,我們沒必要也沒法完全的遵從這些設計原則。因為在實際的場景中除了程式碼的優雅我們還需要考慮成本。

以下總結取自於網路【語言中文網】

| 設計原則 | 一句話歸納 | 目的 | | --------- | ---------------------------------- | --------------------- | | 1⃣️單一職責原則 | 一個類只幹一件事,實現類要單一 | 便於理解,提高程式碼的可讀性(降低複雜度) | | 2⃣️介面隔離原則 | 一個介面只幹一件事,介面要精簡單一 | 功能解耦,高聚合、低耦合 | | 3⃣️依賴倒置原則 | 高層不應該依賴低層,要面向介面程式設計 | 更利於程式碼結構的升級擴充套件 | | 4⃣️里氏替換原則 | 不要破壞繼承體系,子類重寫方法功能發生改變,不應該影響父類方法的含義 | 防止繼承氾濫,子類必須遵從父類的設計 | | 5⃣️迪米特法則 | 不該知道的不要知道,一個類應該保持對其它物件最少的瞭解,降低耦合度 | 只和朋友交流,不和陌生人說話,減少程式碼臃腫 | | 6⃣️開閉原則 | 對擴充套件開放,對修改關閉 | 降低維護帶來的新風險 | | 7⃣️合成複用原則 | 儘量使用組合或者聚合關係實現程式碼複用,少使用繼承 | 降低程式碼耦合 |

  • 學習設計模式最好的方式我覺得還是去看原始碼。工作這麼多年沒見過同事運用設計模式去開發的。唯一見到的就是在原始碼中

\

「其他文章」