iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 14
0

昨天有提到物件模型可以幫助我們分解需求、設計系統、實作系統。於1980年代在大型系統設計中有很多研究提出很多設計原則,Robert C. Martin整理了很多原則並濃縮提倡為物件導向設計原則,過程有增減與修改,於2004年以S、O、L、I、D順序排列,拼出SOLID(固體)設計原則。

以下是SOLID的五個原則

  1. 單一職責原則
  2. 開放封閉原則
  3. 里氏替換原則
  4. 介面隔離原則
  5. 依賴反轉原則

這些原則的目標(Robert C. Martin說)是幫助我們建構系統中的中間層級的結構,目的是為了:

  • 能容忍變化
  • 容易理解
  • 並成為許多軟體中元件能重複使用的基礎

這些元件要能獨立,因該朝向高內聚力、低耦合力為原則。

內聚力越高,越能讓自己獨立(內聚)運作,自己越不會受外在影響。
耦合力越低,與外在事物的關聯(耦合)越少,自己越不會影響到外在。

理想上,每個元件越獨立越邊緣越好,不受別人影響,也不會影響別人,讓系統元件替換與更動變得靈活,讓程式碼不會發生改A壞B,改B壞A。原則是一種理念是一種價值,提倡者希望依這些原則寫出良好的程式碼。以下開始介紹SOLID的五個原則

單一職責原則 Single Responsibility Principle (SRP)

一個模組應該只有一個需要改變的理由

以上是最初理念,隨者時間演變Martin將版本改為:

一個模組應該只對一個角色負責。

模組是一個抽象概念可以是類別、命名空間或是一個.NET組件。每個模組應該只要負責一項職責。提高內聚力,專注於一個職責。(若一個類別有太多職責,那應該拆成多個類別)

開放封閉原則 Open Closed Principle (OCP)

一個軟體製品應該對於擴展是開放的,但對於修改是封閉的。

中文是翻譯成開放與封閉,在我理解上是允許與禁止。允許新增程式,禁止更改現有程式。任何需求的挑整,應該重新撰寫程式,而不是更改原有的程式。

里氏替換原則 Liskov Substitution Principle (LSP)

原文:

若針對型別S的每一個物件O1,都存在一個型別為T的物件O2,使得在所有針對T編寫的程式P中,將O2替換為O1,程式P的行為功能不變,則型別S是型別T的子型別。

Martin將里氏論文中的原文理解並改為以下解釋:

子類別可以被替換為其父類別

LSP最初被是為是繼承的使用方式,後來衍生至介面與實作,變成廣泛的設計原則。要確實的實作多型與繼承,避免LSP中子型別替換成父型別時,導致程式P的結果異常。

介面隔離原則 Interface Segregation Principle (ISP)

客戶應該不應該強迫相依於沒有使用的方法。

白話一點是指,一個介面若有眾多方法,應該拆成多個介面,避免客戶擁有(拿到或是繼承)用不到的方法。

依賴反轉原則 Dependency Inversion Principle (DIP)

  1. 高層次的模組不應該依賴於低層次的模組,兩者都應該依賴於抽象介面。
  2. 抽象介面不應該依賴於具體實現。而具體實現則應該依賴於抽象介面。

避免依賴會容易變動的類別,應該相依於類別的抽象,形成鬆散耦合,達到易更動的靈活性。
白話意思,使用某個子類別時,應宣告為子類別的抽象類別或抽象介面,讓更改或發生其他子類別時能更簡易的更改或複用。


上一篇
物件模型
下一篇
因為這個設計模式,終於讓我看懂static要怎麼用
系列文
我要轉職成 C# / .NET 工程師34
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

1
長庚
iT邦新手 3 級 ‧ 2020-04-11 08:04:45

大部分人寫code時間是debug多還是寫code時間多
SOLID教你怎麼寫出好的Code,不是講對或錯,而是講程式的好與壞
實務開發都會先綁程式碼寫在一起,驗鎮邏輯是否成功,再進行重構
抽象是理解需求,簡化概念,抽象有分等級的

我要留言

立即登入留言