一、關於內聚和耦合
內聚
內聚是一個模塊的內部功能相互關聯的緊密程度
執行某個特定的任務或相關任務組的模塊是具有高內聚性的,而沒有核心功能只是將大量功能湊到一起的模塊有低聚性
耦合
各模塊間相互聯系緊密程度的一種度量。
模塊之間聯系越少,耦合性越低,也就是模塊的獨立性越強
二、可讀性好的特點
可讀性不僅與代碼是不符合編碼規范有關,還與代碼邏輯的清晰程序,代碼利用了多少編程語言的標准風格以及功能的模塊化程序有關.
結構規整、文檔齊全的代碼:同時符合編程語言規范和編程實踐規范,具有可讀性高、簡單簡潔、容易閱讀和修改等好處
1. 寫得好(well-written)
寫得好的代碼能准確展現它的功能。
一段代碼如果用簡單的語法,用最鮮明的編程語言風格寫成,且邏輯清楚,變量、函數、類和模塊等命名明了易懂,就認為編碼寫得好。
2. 文檔齊全(well-documented)
所謂的文檔齊全通常指代碼中的注釋齊全。
一段有良好注釋的代碼能清晰的表達它的功能、輸入參數和輸出值以及編寫邏輯或算法。
注釋也可以包含引用的外部庫或相關API的用法,以及運行此行代碼或此段代碼需要的環境配置
3. 結構規整(well-formatted)
大多數編程語言,尤其是開源的編程語言,都是由分布在不同地理位置卻緊密相連的編程社區通過網絡發展起來的,這也決定了編程語言往往都有良好的注釋風格規范。一段符合注釋風格的代碼由於結構規整,更易於理解。
三、可讀性-反模式
反模式,就是導致編程難以閱讀或不可讀的代碼的做法。
一種編程語言的最佳實踐一般來自開發者社區中多年使用該語言的經驗以及它產生的有效反饋。
最佳實踐總結了解決問題的最佳編程方式,更進一步講是總結了該語言的一些慣用法和常見模式
沒有經驗程序員或“跨界”程序員往往沒有遵守這些規范
意大利面代碼(spaghetti code)
沒有清楚結構和控制流的代碼。
無條件的跳轉、無序的異常處理、設計糟糕的並發結構等,往往都會導致混亂的結構和不清晰的控制流
大泥團(big ball of mud)
由不能展示整體結構和目標的代碼構成的系統。
大泥團一般包括很多段的意大利面代碼,通過指很多人寫成的代碼,經過多次修補,但只有少量說明文檔或是沒有文檔
復制-粘粘編程(copy-paste programming)
若一味為了代碼的交付方便而不對整體進行周到的設計,往往會產生復制-粘貼程序。
復制-粘貼程序中有長而重復的代碼塊,這些代碼大體上沒有什么不同,只有一點小修改,基本處理相同的事情 。
自負編程(ego programming)
自負編程是指某個程序員(通常是一個經驗豐富的程序員)喜歡把他的個人風格在已有的最佳實踐或組織機構的編程規范之上,這有時候會產生對其他人而言隱晦和難以閱讀的代碼。
四、提高可修改性的一些方法
可修改性是指對一個系統進行修改的容易程度,以及系統適應這些修改的靈活性,處軟件的可讀性緊密聯系。
只提供必須開放的接口
這里的接口可以理解成api,也可以理解成一個類的方法,簡單地說,就是能用private或protected的就不要設置成public。
減少雙向依賴
雙向引用簡單地說就是A調用了B,B又調用了A。
如果耦合的方向是單身的,兩個軟件模塊之間的耦合是可以管理的,而雙向依賴的模塊會造成難以維護。
比如python采用的是基於引用的垃圾回收機制,如果存在雙向耦合,可能會導致變量與對象之間的隱式循環引用鏈,進而導致垃圾回收運行結果不理想。
打破雙向依賴的方法:
- A模塊總是使用B模塊之外的函數,B也一樣
- 將A和B模塊共同使用的函數封裝到一個新的模塊中
抽取公共服務
抽取出模塊中的重復功能,減少共用代碼的重復封裝
還可以一個模塊中與核心函數關系不大的函數移動到一個輔助模塊中,提高模塊的內聚性
可以使用組合或繼承這樣的方式