鮑勃大爺:SOLID概念解釋
SOLID原則與90年代(甚至更早於20世紀90年代)一樣,在今天同樣重要。這是因為軟體在這些年中並沒有發生太大變化:因為自1945年Turing編寫電子計算機的第一行程式碼以來,軟體並沒有發生太大變化。軟體仍然是if語句,while迴圈和賦值語句、Sequence,Selection和Iteration。
每次新一代都喜歡認為自己的世界與前一代大不相同。這是錯誤的。
因此,讓我們一步一步地講解這些原則。以下是針對Dan North在SOLID上的觀點:為什麼SOLID的每個元素都不正確?只需編寫簡單的程式碼即可。”
SRP)單一責任原則。
將因相同原因而發生變化的事物聚集在一起。將因不同原因而改變的事物分開。
很難想象這個原理與軟體無關。我們不會將業務規則與GUI程式碼混合在一起。我們不會將SQL查詢與通訊協議混合使用。我們將因不同原因而更改的程式碼分開存放,以便對一個部分進行更改而不會破壞其他部分。我們確保因不同原因而更改的模組不具有使它們糾纏的依賴性。
微服務無法解決此問題。如果您混合了由於不同原因而更改的程式碼,則可以建立一個複雜的微服務或一個複雜的微服務集。
丹·諾斯(Dan North)的幻燈片完全錯過了這一點,並讓我確信他根本不瞭解該原理。他對SRP的回答是“寫簡單程式碼”。我同意。SRP是我們使程式碼保持簡單的方法之一。
OCP)開放-封閉原則。
一個模組應該可以擴充套件,但是可以關閉以進行修改。
在所有原則中,任何人都會對此提出質疑的想法使我對我們行業的未來充滿了恐懼。當然,我們希望建立無需擴充套件即可擴充套件的模組。您能想象在沒有裝置獨立性的系統中工作嗎?在該系統中,寫入磁碟檔案與寫入印表機,螢幕或管道根本不同?我們是否希望看到if語句分散在我們的程式碼中以處理所有小細節?
還是……我們要將抽象概念與詳細概念分開嗎?我們是否要使業務規則與GUI的煩瑣細節,微服務通訊協議以及資料庫的任意行為隔離開來?當然可以!
同樣,Dan的幻燈片完全錯了。當需求更改時,僅現有程式碼的一部分是錯誤的。現有的許多程式碼仍然正確。而且,我們希望確保不必為了使錯誤的程式碼再次起作用而更改正確的程式碼。丹的答案是“編寫簡單的程式碼”。我再次同意。而且,具有諷刺意味的是,他是對的。 簡單的程式碼既是開啟的又是關閉的。
LSP)Liskov替代原則。
使用介面的程式一定不要與該介面的實現混淆。
人們(包括我)都犯了一個錯誤,那就是繼承。它不是。它是關於子型別的。介面的所有實現都是介面的子型別。所有Duck型別都是隱式介面的子型別。並且,基本介面的每個使用者,無論是宣告的還是隱含的,都必須同意該介面的含義。如果實現使基本型別的使用者感到困惑,則if/switch語句將激增。
這個原則是關於使抽象保持清晰和定義良好。不可能相信這是一個過時的概念。
丹的幻燈片在該主題上是完全正確的。他只是錯過了原則的要點。簡單程式碼是保持清晰的子型別關係的程式碼。
ISP)介面隔離原理。
保持介面較小,以使使用者最終不必依賴於他們不需要的東西。
我們仍然使用編譯語言。我們仍然依靠修改日期來確定應重新編譯和重新部署哪些模組。只要這是真的,我們就必須面對這樣一個問題:當模組A在編譯時依賴於模組B ,而在執行時不依賴於模組B時,對模組B的更改將迫使模組A重新編譯和重新部署。
在靜態型別的語言(例如Java,C#,C ++,GO,Swift等)中,此問題尤其嚴重。動態型別的語言受到的影響要小得多。但仍然不能倖免。Maven和Leiningen的存在就是證明。
丹在這個主題上的幻燈片被證明是錯誤的。客戶端確實依賴於他們不呼叫的方法,如果在修改其中一種方法時必須重新編譯和重新部署它們的話。就此原則而言,Dan關於此原則的最終觀點是可以的。是的,如果您可以將具有兩個介面的類拆分為兩個單獨的類,那麼這樣做(SRP)是個好主意。但是這種分離通常是不可行的,甚至是不希望的。
DIP)依賴倒置原則。
取決於抽象的方向。高階模組不應依賴於低階細節。
很難想象沒有大量使用此原理的體系結構。我們不希望我們的高階業務規則取決於低階詳細資訊。我希望這是顯而易見的。我們不希望那些為我們賺錢的計算受到SQL或低階驗證或格式問題的汙染。我們希望將高階抽象與低階細節隔離開來。這種分離是透過仔細管理系統中的依賴關係來實現的,以便所有原始碼依賴關係(尤其是那些跨越體系結構邊界的原始碼)都指向高階抽象而不是低階細節。
在以上每種情況下,Dan的幻燈片都以結尾:只編寫簡單的程式碼。這是個好建議。但是,如果這些年來教會了我們什麼,那麼簡單需要有簡單的原則。正是這些原則約束了程式設計師生成傾向於簡單的程式碼。
使一個複雜的混亂變得最好的方法是告訴每個人“簡單”,不要給他們進一步的指導。
相關文章
- 鮑勃大叔:SOLID原則適合函式程式設計嗎?Solid函式程式設計
- 鮑勃大爺:敏捷是讓經理面對慘淡的現實!是不是這種試錯成本太高?敏捷
- 鮑勃大爺:將if/else中每個條件變為邏輯並列互拆而不依賴執行順序。
- ASM 常用概念解釋ASM
- 分散式快取 - 概念解釋分散式快取
- 鮑勃大爺:物件是更關注行為,資料庫表則是簡單的資料結構,if/else/switch有使用依據物件資料庫資料結構
- 鮑勃大爺:軟體架構類似房子,物件導向是房子的結構,水管線管是函數語言程式設計架構物件函數程式設計
- 《爺爺的城市》:一個設計師手工搭建的解謎世界
- 「Kafka應用」名詞概念解釋Kafka
- 用Iterator解釋Rust所有權概念Rust
- 領域知識與SOLID單一責任原則的解釋Solid
- SOLID 五大設計原則Solid
- 六大設計原則(SOLID)Solid
- 前端非同步的解釋-概念性前端非同步
- [luogu3709][大爺的字串題]字串
- sh江西小城的大爺大媽炒起了比特幣比特幣
- 鮑勃大爺:“如果您不喜歡結對程式設計,就不要結對, 但是要做好準備讓那些已經使用配對技巧的人飛越您。”程式設計
- 谷歌大腦提出概念啟用向量,助力神經網路可解釋性研究谷歌神經網路
- 鮑勃大叔為敏捷正名敏捷
- 360手機釋出會 周鴻禕暗諷紅米3像大老爺們穿黑絲
- 九爺帶你瞭解Tomcat優化Tomcat優化
- 領域驅動設計的概念解釋 -DEVdev
- 案例版名詞解釋:機器學習中的概念漂移!機器學習
- 通俗易懂解釋Rust所有權和借用概念Rust
- 架構思維實現promise,大爺,來瞅瞅架構Promise
- 唱衰這麼多年,PHP 仍然還是你大爺!PHP
- 趣圖圖解SOLID軟體開發原則圖解Solid
- 【日記】遇到了一個很奇怪的大爺(845 字)
- SOLID原則Solid
- SOLID 原則Solid
- react父子元件,兄弟元件,爺爺到孫子元件筆記React元件筆記
- 架構設計的五大原則-SOLID架構Solid
- parallel並行度的相關操作、概念、引數解釋Parallel並行
- 鮑勃大爺調查提問:兩者哪個更昂貴?A.在程式碼中新增難以更改的功能。B.保持程式碼足夠靈活性以輕鬆新增新功能。
- 多型體驗,和探索爺爺類指標的多型性多型指標
- 漏洞安全相關概念解釋?網路安全入門學習
- 密碼學中的愛麗絲與鮑勃密碼學
- 修理東西﹐絕不強求――從爺爺那學到的經驗