“軟件自有其美感所在” --《重構》
@圖片:崇禮瀚海梁的山花??拍攝于2022年8月13日?@攝影師:劉先生
這篇內容寫作于4年前(2018年),是自己多年軟件開發工作的一點感悟,現在看來雖有偏頗,但總體思想方向上并沒有改變,抽象是高層次代碼的評判標準,誠然,過度的抽象會造成理解困難,但現實情況是,我們的開發人員對代碼抽象層次普遍偏低,盡最大的能力向更高一層抽象,能夠讓代碼提升一個水平。不僅僅是代碼,整個軟件開發過程,包括需求分析,產品設計,架構設計,都可以用抽象程度判斷其工作水平的高低。
01
—
抽象是代碼水平的標準
朋友指著自己寫的代碼問:你看我寫的代碼怎么樣,有沒有問題,哪里需要修改?
以寬泛的標準講,只要代碼沒有邏輯錯誤,沒有明顯性能問題,就沒有問題,但我知道,他問的不是這些,而是問代碼有沒有可以更進一步優化的可能,我看他的代碼做了清晰的分層,提取了基類,使用了模板模式,總體上算是不錯了。
問題來了,究竟什么樣的代碼算得上是好代碼呢?
面對這個問題,可能大多數程序員首先想到的是:高內聚,低耦合,高效率,易維護,易擴展。這些是對的,但這些原則過于模糊,對大部分IT從業者(尤其是剛入行的新人)來說,無法通過一個具體的標準去衡量。
拋開框架和具體技術細節,單純從編碼的角度講,依我的觀點:
面向對象編程,考察的是抽象化的能力。
第一層級的抽象是類。
從實際業務需求入手,將現實世界中的事物,抽象成類,通過類,對象之間的相互調用,完成業務需求,這是面向對象編程最基礎的抽象的能力。
第二層級的抽象是基類。
發現類之間的共性,提取基類,抽象類,基類負責處理共性的邏輯,子類負責處理個性的邏輯,從而實現代碼的復用,邏輯更清晰,代碼更易于維護。
再高一層級的抽象是接口。
接口定義一組標準規范,而不包含任何實現邏輯(C#8.0之后,接口也可以有默認實現了),因此,接口比抽象類的適用范圍更廣。面向對象開發原則中的“依賴倒置原則”,簡單來說,就是要面向接口編程。
更高一層級的抽象是泛型。
為什么將泛型放到比基類和接口更高一層級,因為基類和接口,都只是對其繼承者的單一類型的抽象,而泛型,是對多個相互協作類型的抽象,泛型不僅僅是對類型的抽象,還抽象出了多個類型間相互協作行為,正確的使用泛型,能夠讓代碼變得更精煉,邏輯更嚴謹規范。
好了,以上四個層級,也是簡單地給代碼劃分等級的標準,看看自己寫的代碼,處于哪一個層級呢。
02
—
后記
當然,并非所有的代碼都需要提取基類,定義接口,任何規則都有適用范圍。
以上關于抽象化的觀點,算是自己多年從事軟件開發的一點小小的感悟,希望對你有一定幫助。
更為大家廣泛接受的,區分好代碼的標準是“面向對象開發原則”和“設計模式”,強烈建議小伙伴們學習掌握,這里不做展開,有興趣的朋友可以自行搜索。
喜歡的朋友可以點贊,轉發,加關注