物件導向的SOLID

更新 發佈閱讀 5 分鐘

說到物件導向就必須提五個原則,統稱SOLID,它被認為是物件導向的重要概念。這五個原則並不只適用於物件導向,事實上它很像函數式編程的習慣。它的命名很奇怪且容易讓人混淆,所以我會用我自己的翻譯解釋。


Single Responsibility Principle 是「單一職責原則」,認為一個模組應該只有一個職責。模組是將相同功能的函式和類別搜集起來的實體,我們應該根據「職責」將函式裝進一個模組,這樣能提升程式的可維護性。當你想要寫一個網路服務時,你應該要將有關連線的部分拆出來包成一個模組,這樣當程式出錯時更容易找到問題點。類別本身也是一個小模組,因此也適用於這個原則,但它的範圍非常小,所以職責應該也要特別單一,例如管理特定連線狀態。在函數式編程,資料結構沒有職責,畢竟它不會自帶行為,所有關聯方法都是藉由特性系統附加上去的,若要封裝也應該是對這些特性的實作封裝。但資料結構還是應該只有單一語義,複用相同的類型會使程式的可讀性降低。單一職責不代表一定要隱藏實作細節,它只是提供一個組織程式碼的判斷準則。它很常跟「單一功能」(do one thing well)搞混,這是指一個函式應該只做一件事,並把它做到最好。「職責」是指一系列相關的操作,而非一件事,複雜的系統通常需要多個操作才能完整使用。


Open-Closed Principle 是「擴充修改原則」,認為軟體應該是對於擴充開放的,但是對於修改封閉的。當一個公開的函式定義後,就不應該再修改,如果要修改也不應該違反定義函式時文件所描述的特性。這些特性描述是這個函式的承諾,它告訴使用者這個函式在做什麼。如果因為當初設計問題導致承諾本身就是不合理的,應該標示函式為過時並另外定義新的函式取代。如果想要擴充這個函式的功能,則應該另外定義新的函式,並把原本的函式轉接過去,而不應該直接修改原本的函式。也可以透過多型擴充函式,讓原本的函式類型也被涵蓋其中,例如增加可選參數(多載)或是泛型化,但這種方法很容易讓依賴類型推論的情況出問題,因此並不推薦。因為承諾的關係,已經定義好的函式很難再透過修改擴充,因此在定義函式時就應該考慮未來需要擴充的狀況。可以透過泛型化和介面/特性把實作時所用到的方法抽離出來,讓使用者自己決定。這個規則可以應用在任何實體上,例如類型、介面、模組和類別。這個原則將實體的語義與承諾分離出來,強調函式實作應該更著重於實現承諾而非完成業務目標。


Liskov Substitution principle是「子類替換原則」,認為程式中的對象應該是可以在不改變程式正確性的前提下被它的子類所替換的。它描述了子類關係的定義,我們已經在前幾篇文章討論過,在此不再贅述。


Interface-Segregation principle是「介面細分原則」,認為多個特定客戶端介面要好於一個廣泛用途的介面。如果介面包含太多功能,就會使依賴此介面的函式或類別依賴太多無關的方法,使得我們必須為不需要的功能實作方法。透過將功能細分成多個介面,我們可以更容易掌握誰真的依賴於這個方法,從而減少耦合。這對於物件導向來說更重要,因為類別本身就是一個介面,但是當我們增加一些方法給他時,就會讓依賴此類別的函式也增加依賴關係。透過在他們之間定義細分的介面,可以讓函式不會直接受到實作改變的影響,從而起到隔離的作用。


Dependency Inversion Principle是「依賴抽象原則」,認為一個方法應該依賴於抽象而不是一個實例。高階、複雜的操作是由多個低階、特定的操作組成,因此一般來說高階邏輯總是依賴於低階的實作,但這麼做會讓高階的方法很難抽象化。因此應該反過來讓低階的實作依賴於高階的實體,例如透過定義高階的介面讓低階的部分去實作它,而非寫死在高階的方法實作裡。反轉的目的不是為了解決循環依賴的問題,而是為了讓高階的模組更容易抽象化與重用。事實上不是只有高階模組需要抽象化,低階操作不代表它必須寫死成特定實作,具體與抽象的分類和高階與低階的分類並不衝突。解決因依賴造成難以抽象化的方法就是讓實作依賴於抽象,而非直接依賴於實作,具體來說可以參數化依賴的部分讓使用者自己傳入(依賴注入),或是將依賴的特性抽取成介面,並讓具體類別實作這個介面。可以說依賴抽象是一種進階的參數化方法,它把程式碼裡面需要開放的特性作為參數抽取出來,讓程式碼不會直接依賴具體的方法,而是依賴這個參數。


除了子類替換原則,其他的原則基本上都跟物件導向沒有直接關係,它可以應用於任何軟體開發上。這些概念對應於函數式編程的一些習慣用法:OCP擴充修改原則強調承諾的重要性,這對於注重規則的函數式程式語言尤其重要;ISP介面細分原則強調依賴關係的管理,函數式編程常常依據規則建立介面而非依據功能,因此不常遇到這種問題;DIP依賴抽象原則對函數式編程來說只是一種參數化方法,這與高階還是低階、是否反轉依賴關係無關。對於函數式編程,健全的機制往往可以避免生產出不好的程式碼,而非依賴於開發者的素養。或者說當你理解函數式編程的特性,就更容易掌握將業務邏輯轉換成程式設計的邏輯思路的方法。

留言
avatar-img
have bear的沙龍
4會員
28內容數
這不是教你如何從物件導向到函數式編程的入門教程。我會深入探討物件導向與函數式編程的差異,並討論為什麼你應該使用函數式編程並徹底放棄物件導向。
have bear的沙龍的其他內容
2024/02/15
這個系列的文章主要專注於物件導向到函數式編程的差異與分析,並針對概念與機制上的不同進行比較。很多人說物件導向和函數式編程沒有哪個比較好的問題,只有哪個比較適合的問題,然而我並不這麼認為,我透過這一系列的文章從各個角度討論它們之間的優缺點就是為了闡述我的觀點。物件導向錯在沒有理論基礎,但它贏在熟悉性,
2024/02/15
這個系列的文章主要專注於物件導向到函數式編程的差異與分析,並針對概念與機制上的不同進行比較。很多人說物件導向和函數式編程沒有哪個比較好的問題,只有哪個比較適合的問題,然而我並不這麼認為,我透過這一系列的文章從各個角度討論它們之間的優缺點就是為了闡述我的觀點。物件導向錯在沒有理論基礎,但它贏在熟悉性,
2024/02/08
前一篇文章中所提的函數式的三個機制明確說明了它關注的規則與能力具體是什麼。然而這套對於函數式編程的定義主要基於特定的類型系統,作為一個編程範式來說過於狹隘(物件導向的定義也是這樣)。更廣義的,我認為函數式編程主要依循三個原則,它們可以應用於任何程式語言,就算沒有靜態類型系統的支援也可以。例如在不管類
2024/02/08
前一篇文章中所提的函數式的三個機制明確說明了它關注的規則與能力具體是什麼。然而這套對於函數式編程的定義主要基於特定的類型系統,作為一個編程範式來說過於狹隘(物件導向的定義也是這樣)。更廣義的,我認為函數式編程主要依循三個原則,它們可以應用於任何程式語言,就算沒有靜態類型系統的支援也可以。例如在不管類
2024/02/04
前面談了那麽多函數式編程與物件導向的差異,但我們還沒定義函數式編程。就像物件導向,函數式編程沒有明確的定義,每個人對於什麼是函數式編程都有不同的看法。在這裡我會總結前面的討論,給出我對於函數式編程的觀點。 物件導向注重封裝與延展性,因此一般基於三個機制:繼承、多型、封裝,它們代表了物件導向所重
2024/02/04
前面談了那麽多函數式編程與物件導向的差異,但我們還沒定義函數式編程。就像物件導向,函數式編程沒有明確的定義,每個人對於什麼是函數式編程都有不同的看法。在這裡我會總結前面的討論,給出我對於函數式編程的觀點。 物件導向注重封裝與延展性,因此一般基於三個機制:繼承、多型、封裝,它們代表了物件導向所重
看更多
你可能也想看
Thumbnail
債券投資,不只是高資產族群的遊戲 在傳統的投資觀念中,海外債券(Overseas Bonds)常被貼上「高資產族群專屬」的標籤。過去動輒 1 萬甚至 10 萬美元的最低申購門檻,讓許多想尋求穩定配息的小資族望而卻步。 然而,在股市波動劇烈的環境下,尋求穩定的美元現金流與被動收入成為許多投資人
Thumbnail
債券投資,不只是高資產族群的遊戲 在傳統的投資觀念中,海外債券(Overseas Bonds)常被貼上「高資產族群專屬」的標籤。過去動輒 1 萬甚至 10 萬美元的最低申購門檻,讓許多想尋求穩定配息的小資族望而卻步。 然而,在股市波動劇烈的環境下,尋求穩定的美元現金流與被動收入成為許多投資人
Thumbnail
透過川普的近期債券交易揭露,探討債券作為資產配置中「穩定磐石」的重要性。文章分析降息對債券的潛在影響,以及股神巴菲特的操作策略。並介紹玉山證券「小額債」平臺,如何讓小資族也能低門檻參與海外債券市場,實現「低門檻、低波動、固定收益」的務實投資方式。
Thumbnail
透過川普的近期債券交易揭露,探討債券作為資產配置中「穩定磐石」的重要性。文章分析降息對債券的潛在影響,以及股神巴菲特的操作策略。並介紹玉山證券「小額債」平臺,如何讓小資族也能低門檻參與海外債券市場,實現「低門檻、低波動、固定收益」的務實投資方式。
Thumbnail
解析「債券」如何成為資產配置中的穩定錨,提供低風險高回報的投資選項。 藉由玉山證券的低門檻債券服務,投資者可輕鬆入手,平衡風險並穩定財務。
Thumbnail
解析「債券」如何成為資產配置中的穩定錨,提供低風險高回報的投資選項。 藉由玉山證券的低門檻債券服務,投資者可輕鬆入手,平衡風險並穩定財務。
Thumbnail
相較於波動較大的股票,債券能提供固定現金流,而玉山證券推出的小額債,更以1000 美元的低門檻,讓學生與新手也能參與全球優質企業債投資。玉山E-Trader平台即時報價、條件式篩選與清楚的交易流程等特色,大幅降低投資難度,對於希望分散風險、建立穩定現金流的人來說,玉山小額債是一個值得嘗試的理財起點。
Thumbnail
相較於波動較大的股票,債券能提供固定現金流,而玉山證券推出的小額債,更以1000 美元的低門檻,讓學生與新手也能參與全球優質企業債投資。玉山E-Trader平台即時報價、條件式篩選與清楚的交易流程等特色,大幅降低投資難度,對於希望分散風險、建立穩定現金流的人來說,玉山小額債是一個值得嘗試的理財起點。
Thumbnail
這個單元我一直很想學習,物件導向 Object Oriented Programming 以前一直以為是一種程式碼,其實是設計程式的觀念,文中我分享了程式碼還有自己想的比喻讓讀者更好理解。除了物件導向,我還介紹其他四種風格的程式碼設計,跟大家一起學習。
Thumbnail
這個單元我一直很想學習,物件導向 Object Oriented Programming 以前一直以為是一種程式碼,其實是設計程式的觀念,文中我分享了程式碼還有自己想的比喻讓讀者更好理解。除了物件導向,我還介紹其他四種風格的程式碼設計,跟大家一起學習。
Thumbnail
物件導向(Object-Oriented Programming,OOP) 可以用來提高程式碼的可讀性、可維護性和可擴展性,同時還能夠促進程式的重用和組織。
Thumbnail
物件導向(Object-Oriented Programming,OOP) 可以用來提高程式碼的可讀性、可維護性和可擴展性,同時還能夠促進程式的重用和組織。
Thumbnail
  物件導向說到這邊其實修飾詞不只有之前所提的public、private這些,還有可能遇到抽象(abstract)、虛擬(virtual)、覆寫(override)、隱藏(new)、密封(sealed)、介面(interface)等等,我們就來看一下它們的差異吧~
Thumbnail
  物件導向說到這邊其實修飾詞不只有之前所提的public、private這些,還有可能遇到抽象(abstract)、虛擬(virtual)、覆寫(override)、隱藏(new)、密封(sealed)、介面(interface)等等,我們就來看一下它們的差異吧~
Thumbnail
單一職責原則(Single Responsibility Principle) 里氏替換原則(Liskov Substitution Principle) 依賴反轉原則(Dependence Inversion Principle) 最少知識原則(得墨忒耳定律)(Law Of Demeter)
Thumbnail
單一職責原則(Single Responsibility Principle) 里氏替換原則(Liskov Substitution Principle) 依賴反轉原則(Dependence Inversion Principle) 最少知識原則(得墨忒耳定律)(Law Of Demeter)
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News