淺談物件導向SOLID 原則對工程師的好處與如何影響能力
文章推薦指數: 80 %
SOLID 原則其實是物件導向「設計層面」的思維與定律。
大學時期程式設計課程中所學的物件導向,其實只是在介紹程式語言有提供物件導向的哪些特性,卻從未 ...
3
淺談物件導向SOLID原則對工程師的好處與如何影響能力
物件導向
solid
自學程式設計
solid原則
WadeHuang
2019-10-2212:16:12‧1607瀏覽
前言
為了感謝部落格一直以來都有人在閱讀,讓我一直有經營下去的動力。
所以想寫一個系列學習SOLID原則2年後的心得文章。
這心得文章包含自己使用SOLID兩年的總結,並且以自己的理解簡化SOLID原則,希望幫助新手工程師縮短「SOLID原則是文字天書」的時間。
從第一次接觸物件導向SOLID原則至今已經兩年了,一開始覺得「SOLID原則是文字天書」,到現在Coding時常融入SOLID的思想來「設計」程式。
所以SOLID原則到底是什麼?
》SOLID原則其實是物件導向「設計層面」的思維與定律。
大學時期程式設計課程中所學的物件導向,其實只是在介紹程式語言有提供物件導向的哪些特性,卻從未有人教導如何透過物件導向的特性撰寫程式碼,甚至沒人告訴你為什麼要用物件導向開發程式。
然而SOLID原則就是物件導向開發的指導方針,若以多個角度來看這些原則,會發現SOLID已經指出物件導向的優點以及程序式程式碼隱晦的缺點。
但這不代表物件導向沒有缺點,要是沒有妥善運用SOLID原則的話,物件導向對專案的傷害絕對不比程序式程式碼低!但這留給後續的文章來解釋,首先來看看SOLID的好處與重要性。
SOLID原則對專案的好處?
SOLID原則對專案的影響很大,當專案一點一滴的導入SOLID原則的程式碼,不少複雜的程式碼慢慢被簡化,被簡化的程式碼可以降低複雜度,讀懂程式碼的時間從原本需要花20分鐘閱讀,到只需要花費2分鐘閱讀。
縮短閱讀時間對專案來說是一件好事,一般來說工程師「閱讀程式碼」的時間常常大於「新增/修改程式碼」的時間,畢竟要先讀懂才能動手嘛,因此縮短閱讀程式碼時間等於**縮短「新增/修改程式碼」**程式碼的時間。
優點:降低程式碼複雜度=>縮短閱讀程式碼的時間=>減少維護專案程式碼的時間
你可能會覺得,為什麼SOLID原則可以降低程式碼的複雜度?
因為物件導向本身的目的就是管理「程式碼複雜度」,這也是為什麼這麼多人推崇使用物件導向開發的原因,然而SOLID原則是教導工程師應該如何透過物件導向的特性來管理程式碼的複雜度。
SOLID原則對工程師的好處?
由上述可知SOLID原則可以降低程式碼的複雜度,這是第一個好處,因為降低工程師開發過程的痛苦值!(應該沒人想一直面對醜陋複雜的程式碼)
再來的好處可多的呢!為什麼這麼說呢?
SOLID原則是踏入資深工程師階段的必學觀念。
大部分軟體開發的進階觀念,都建構在良好的物件導向程式碼之上。
要是沒辦法妥善運用物件導向,就沒辦法運用軟體開發的進階觀念/技巧。
》這相當重要,若工程師沒有能力學習進階觀念,很可能就會一直停留在碼農階段。
但是學會SOLID原則之後呢?
以下列出SOLID未來的應用,下列被提及的每個議題都是進階物件導向重要的基石,很值得花時間投資:
1.單元測試
用程式碼撰寫測試程式,取代手動測試。
替專案提供回歸測試,時時刻刻執行單元測試,檢查有沒有人改壞程式碼。
符合SOLID原則的程式碼可以輕易導入單元測試。
2.重構
在不改變程式碼外部行為的前提下,修改程式碼內部的結構,提升可讀性與擴充性。
重構必然會搭配測試,避免改壞程式碼。
低階重構:把爛Code重構成符合物件導向SOLID原則(敏捷開發)。
中階重構:把SOLID重構成設計模式(敏捷開發)。
高階重構:把SOLID重構成軟體架構(敏捷開發)。
3.設計模式
進階物件導向應用
學習物件與物件之間常見的組合模式。
用來管理程式碼的複雜度,或解決開發系統中的各種常見問題。
學過設計模式,在寫程式或閱讀程式的時候,會用更高一層的視角去思考。
最後會培養出根深蒂固的抽象觀念。
》但這些議題卻又基於SOLID原則之上
因為SOLID原則幫助專案建立一個乾淨、穩定、良好的物件導向程式碼,讓這些物件導向程式碼可以引入更進階的概念/技巧。
這裏引用UncleBob在物件導向原則、設計模式與C#實踐這本書說過的話:
我的書裡所教的觀念與技巧,都只對乾淨的Code有效益。
如果你的程式碼還很雜亂,請先學會怎麼整理程式碼。
-UncleBob(現代軟體界大神)
然而這本書也是SOLID的原點。
軟體開發的觀念幾乎就圍繞在上述幾個議題在發展,因此有沒有學會上述議題,基本上就是碼農跟中高階工程師的分水嶺。
如果持續努力學習這些議題,馬上就能凸顯跟大部分工程師的差異性,面試時可以談的條件也會變多。
我自己的學習路線如下:
SOLID>重構+單元測試>設計模式>測試驅動開發(TDD)>行為驅動開發(BDD)>領域驅動開發(DDD)
但是真實的學習過程其實經常交叉學習,不一定是先學完前者才往下學習下一個。
因為這些議題都是環環相扣,常常可以在後面的議題學習到前面議題的進階用法。
結尾:
以往學習SOLID原則時,大部分文章都專注在每個原則的介紹與範例,卻幾乎沒人提及SOLID原則與物件導向之間的關係,以及SOLID原則日後的發展為何?
因此我想在講解SOLID每個原則之前,先花篇幅琢磨在兩個問題上。
希望也能替其他人解開疑問。
接下來也將會陸續推出講解SOLID每個原則的文章出現,沒意外的話下次PO文是探討單一職責原則。
此文章也會同步到:我的部落格
系列文章
淺談物件導向SOLID原則對工程師的好處與如何影響能力
再談SOLID原則,WhySOLID?
物件導向設計原則:單一職責原則,定義、解析與實踐
物件導向設計原則:開放封閉原則,定義、解析與實踐
留言
追蹤
檢舉
尚未有邦友留言
立即登入留言
相關文章
中鳥階段-學習物件導向的精神。
再談SOLID原則,WhySOLID?
沒程式基礎也能懂~淺談物件導向與SOLID原則
中場回顧
單一功能原則SingleResponsibilityPrinciple
開放封閉原則Open-ClosedPrinciple
依賴反轉原則DependencyInversionPrinciple
里氏替換原則LiskovSubstitutionPrinciple
介面隔離原則InterfaceSegregationPrinciples
回顧SOLID設計原則
iT邦幫忙鐵人賽
參賽組數
1087組
團體組數
52組
累計文章數
20459篇
完賽人數
572人
鐵人賽最新文章
C#入门之正则表达式匹配并替换
[Bonus系列]-來看看ReactRouterv6有什麼新功能?和v5有哪些地方不同?
2021-11-24盤勢分析
做不好資金控管,一檔大賠,獲利全吐
DevFest'21Hsinchu&Taichung議程錄影上線啦!
建立第一個單元測試(golang)-2(Day21)
更新網格交易機器人
STM32的開發生態,Cube、HAL庫、LL庫
閒聊STM32CubeMX和STM32CubeIDE
建立第一個單元測試(golang)-1(Day20)
前往鐵人賽
技術推廣專區
[Day2]抓取每日收盤價
[Day1]基本工具安裝
利用python取得永豐銀行API的Nonce
[Day03]tinyML開發板介紹
永豐金融API測試員
[Day01]在享受tinyML這道美食之前
[Day3]使用ta-lib製作指標
[Day4]函數打包與買進持有報酬率試算
計算API所需要的參數:HashID
計算API所需要的參數:IV
前往鐵人賽
熱門問題
一台電腦可否同時安裝Win7和Win10作業系統嗎?
請提供台灣的資料庫社群、論壇、社團、技術交流
訂便當系統的table規劃設計討論
DELLServerRAID設定問題
響應式網頁漢堡選單打不開
Windows10裝在虛擬機上,微軟授權該怎麼買較划算
員工電腦採購的選擇桌電vs筆電
fortigate60E設定問題
IT鐵人賽自我挑戰組完賽獎狀...?
中華電信後面路由器的IPV6
IT邦幫忙
站方公告
2021iThome鐵人賽精彩文章超過2萬篇,預計12月揭曉本屆獲勝鐵人
熱門tag
看更多
13th鐵人賽
12th鐵人賽
11th鐵人賽
鐵人賽
2019鐵人賽
2018鐵人賽
javascript
2017鐵人賽
windows
php
python
windowsserver
linux
c#
程式設計
資訊安全
css
vue.js
sql
分享
熱門回答
訂便當系統的table規劃設計討論
員工電腦採購的選擇桌電vs筆電
除了PHP還有什麼方法可以連API取資料(API有驗證)
關於boolean預設值及while迴圈問題
一台電腦可否同時安裝Win7和Win10作業系統嗎?
Outlook2007寄件備份是空的
fortigate60E設定問題
IOS不能正常顯示CheckBox
詢問IpsecLanToLanToLan的問題(文長)
跳轉的時候postjson資料
熱門文章
做不好資金控管,一檔大賠,獲利全吐
[Bonus系列]-來看看ReactRouterv6有什麼新功能?和v5有哪些地方不同?
夜間模式真的對眼睛比較好嗎?詳細整理(上)
【必學】iPhone照片輕鬆轉移到另一支iPhone/iPad
2021-11-24盤勢分析
HTML筆記(01)-前端、後端和全端
【徵才】駐東南亞軟體工程師
快速用SpringBoot2建立第一個APIService
【C#群益API開發教學】官方範例下載與安裝環境#CH1
TorquePro(OBD2&Car)APKforAndroid
一週點數排行
更多點數排行
海綿寶寶(antijava)
㊣浩瀚星空㊣(yoching)
raytracy(raytracy)
ccenjor(ccenjor)
japhenchen(japhenchen)
mytiny(mytiny)
by2048(by2048)
一級屠豬士(hitomitanaka)
juck30808(juck30808)
fillano(fillano)
×
At
輸入對方的帳號或暱稱
Loading
找不到結果。
標記
{{result.label}}
{{result.account}}
關閉
延伸文章資訊
- 1solid - Yahoo奇摩字典搜尋結果
solid · adj. 固體的;密實的 · n. 立體圖形;固體 · npl. 固體食物;固形物 ...
- 2我該學會SOLID嗎?
什麼是SOLID. 簡單來說就是在物件導向設計上為了讓軟體維護、開發變得更容易的五個準則Principle的開頭縮寫. Single Responsibility Principle (SRP)...
- 3solid - 用法_例句 - 海词词典
solid作名詞時,意思是「固體」,也可指「立方體」。solid還可指「(液體中的)固形物」「固體食物」,這時通常要用複數形式solids。 詞義 ...
- 4SOLID (物件導向設計) - 維基百科,自由的百科全書
在程式設計領域, SOLID(單一功能、開閉原則、里氏替換、介面隔離以及依賴反轉)是由羅伯特·C·馬丁在21世紀早期 引入的記憶術首字母縮略字,指代了物件導向程式設計和 ...
- 5solid 的中文翻釋|影音字典- VoiceTube 看影片學英語
The ice felt solid enough. Support for the plan remained rock solid. If you put it in the freezer...