高質量編程


一、高質量編程

1、為什么存在這個話題?

(1)問題
  在實際開發中,高質量編程大多數情況下難以實現。
  一方面,大部分年輕的程序員開發經驗少(初級程序員),寫程序僅僅是滿足設計文檔上的功能性要求,離高質量程序相差甚遠。
  另一方面,程序員離最終用戶距離較遠,對程序上線后出現的很多問題並沒有切身體會,無法編寫出一些 看似稀奇古怪 卻又合乎常理的需求。

(2)實際編碼中的差異

【差異:】
    對於同一個功能需求,高手 與 菜鳥 的差異將非常明顯:
        高手 代碼量 會明顯低於  菜鳥 的代碼量。
        高手 編碼效率 會明顯高於 菜鳥 的效率。
        高手 代碼性能 明顯高於 菜鳥 的性能。
        高手 代碼可閱讀性、安全性、可靠性 明顯高於 菜鳥的代碼。
注:
    高質量編程 是每個優秀的程序員應該具備的。
    每個程序員都經歷過 菜鳥 的階段,有的很快能夠蛻變,而有的卻一直無法改變,
    那么如何令自己具備這種能力呢?    
    最重要的還是 培養自己的意識(學習優秀代碼的思想,總結自己代碼的不足)。
    正所謂:學而不思則罔,思而不學則殆。

【程序員的變化:】
菜鳥:
    能力:能夠編寫基本符合功能需求的程序。
    態度:追求交差。

老手:
    能力:能夠長期穩定編寫出高質量的程序。
    態度:追求卓越。

高手:
    能力:能夠長期穩定編寫出高質量、高難度的程序。
    態度:追求完美。

 

2、高質量編程

(1)高質量編程具體是什么?

【高質量編程:】
    可以從三個方面(編程風格、程序運行、后期拓展)來 描述 高質量編程。

編程風格:
    整齊、簡潔、易讀。

程序運行:
    正確運行、可靠、安全、高效、兼容
    
后期拓展:
    可移植、可復用、可維護、可拓展。

 

(2)編程風格

【整齊:】
統一縮進:
    通過縮進可以明確看出代碼的層次結構。

合理分段:
    可使用空行分隔 代碼邏輯,將邏輯不緊密的代碼隔開。
    
【簡潔:】
減少冗余:
    對於重復的代碼,可以將其抽取成一個共通方法進行調用。

避免重復造輪子:
    熟悉常用的庫函數 以及 項目中自定義的 共同方法,避免重復編碼(減少代碼冗余)。

刪除無用代碼:
    對於無用代碼可以直接刪除,無需在源文件中保留無用代碼。
    git、svn 等版本控制系統中會有歷史提交記錄,通過歷史記錄可以很方便的查看修改情況。
    
精簡代碼:
    在保證解決需求的情況下,盡量優化代碼,以較少的代碼解決實際需求。
    
【易讀:】
合理注釋:
    編寫代碼時添加上適當注釋,方便 自己 或者 其他人 理解代碼的含義。

合理命名:
    根據命名規約,正確拼寫。

合理規划項目結構:
    使用合理的目錄層次划分代碼、文件,不同目錄應具備不同的意義。

合理規划代碼內部結構:
    代碼內部適當換行,避免 函數、代碼 在一行上過長。
    統一代碼編寫風格(比如:規定變量聲明必須在函數或者方法第一行,避免在任意位置聲明變量)。

 

(3)程序運行

【正確運行:】
滿足基本需求:
    能夠滿足基本設計需求。

滿足默認規則:
    滿足有些屬於軟件常規操作但沒有在設計中描述的需求。比如:TAB 鍵在頁面上的順序。

【可靠:】
持續穩定運行:
    保證一些異常出現后,程序仍能正常運行(可以處理異常),不會崩潰。    

並發安全:
    保證程序並發執行時,系統內部執行邏輯不會出錯。

無資源泄露:
    持續工作時,不會出現內存溢出、內存泄露等不斷消耗系統資源的問題。
    
【安全:】
完善日志處理:
    對於核心操作,需要進行日志記錄,確保修復 Bug 時可以快速定位錯誤位置。

保護敏感信息:
    對於 用戶密碼 等敏感信息進行加密處理,不以明文方式進行保存。

防范常見攻擊:
    SQL 注入。
    XSS 攻擊(指的是 Cross Site Scripting,即 跨站腳本)。
    CSRF 攻擊(指的是 Cross Site Request Forgery,即 跨站請求偽造)。
    
【高效:】
循環代替遞歸:
    遞歸資源消耗較大,盡量改為 循環實現。

精簡循環代碼:
    循環無關代碼 提取到 循環外,避免重復執行。

選取合適算法、數據結構:
    根據數據特點,選取合適的數據結構以及算法 進行編碼。
    根據實際需求,盡量在 時間效率 以及 空間效率 上取得平衡。

發現並改善性能瓶頸:
    比如采用 緩存機制 提高查詢效率。

【兼容:】
確認程序運行環境:
    使用兼容的 庫函數 以及 API,保證程序在 各平台上兼容。

使用可兼容的組件:
    為了保證可移植性,在技術選型時選擇 具備良好兼容性的 組件、庫函數 等。

 

(4)后期拓展

【可移植】
移植到不同的平台:
    使用兼容性良好的組件、庫函數等,通過較少修改保證程序正常運行。

資源獨立:
    進行國際化處理,保證 語言容易被提取、翻譯、轉換。

【可復用】
接口通用:
    程序接口經過良好設計,具備通用性,不經修改即可用於其他系統。

【可維護】
完善日志機制:
    根據日志信息定位錯誤地方,方便排查錯誤。

【可拓展】
良好程序結構:
    定義良好程序結構,通過修改配置 或者 簡單修改 即可應用 新添加的功能。

 

(5)如何實現高質量編程

【如何實現?】
    編碼前 需要仔細閱讀 編碼規約,保證編碼風格一致(多人開發,風格難免有差異)。
    編碼時 需要不斷自測,不能盲目自信(老子代碼天下無敵 是不可取的)。
    編碼完成后 先自己思考一下能否繼續優化,進一步可以請別人 來指點一下是否有更好的代碼。
注:
    要下意識的學習優秀代碼的思想,總結自己代碼的不足。

 

二、重構

1、為什么進行重構?

(1)舉個例子

【舉個例子:(僅供娛樂、參考)】
    現有 A、B 兩個人,A 向 B 提問:你的夢想是什么?
    A 回答說:金錢和女人。
    ...
    B 愣了一會兒說:這個答案有點膚淺了,請你重新組織語言,再次回答。
    ...
    A 思考了一會后,回答說:事業和愛情。
注:
    A 的兩個回答,盡管表達的都是同一個意思,但是第二種回答 貌似比 第一種回答 更優雅一點。
    這就是重構。

 

(2)代碼重構

【代碼的重構:】
    在不改變代碼原有功能的基礎上,調整代碼的內部結構,提高代碼的可理解性,降低維護成本。
注:
    代碼重構后,基本功能肯定是與 原來的代碼 一樣的,
    但是重構后,代碼肯定優於 原來的代碼,否則重構沒有任何意義。
    所以重構 是有一定的 難度的,需謹慎(開發一時爽、重構火葬場)。

【為什么進行代碼的重構:】
不重構代碼可能遇到的問題:
    隨着項目迭代、添加新功能,不同的開發人員進行 一系列 猛如虎的操作后,項目代碼難免會臃腫、復雜、邏輯不清。
    而這又導致項目難以理解、維護起來麻煩,增加了開發難度。

而進行重構后:
    可以改進項目設計,給項目一個起死回生的機會(整理代碼,使代碼整體邏輯清晰)。
    代碼邏輯清晰后,便於閱讀、理解代碼,從而提高編程效率(排查 Bug 的效率也提高了)。
    
【重構的流程:】
Step1: 讀懂代碼,知道代碼的功能。
Step2: 重構代碼,保證原有功能。
Step3: 進行單元測試,保證代碼原有功能不能消失。

 

2、重構時機

(1)什么時候需要重構?
  對於首次開發的項目,經常會遇到重復性代碼操作,此時就需要考慮是否進行重構,復用一些代碼。
  對於維護、迭代的項目,添加一個功能困難時,就得考慮是否需要進行重構,保證原有功能的基礎上拓展新功能。
  Debug 排錯時,若不能一眼發現錯誤所在位置,就得考慮是否需要重構,使代碼邏輯清晰。
  代碼審查時,若發現可以優化的代碼,就得考慮是否需要重構,減少 BUG、提高執行效率。

(2)什么時候不能重構?
  代碼混亂、設計錯誤時,此時重構 將會帶來很多問題,慎重重構。
  代碼發布期臨近,重構會消耗大量時間時,慎重重構。

(3)需要重構代碼的特征

【特征:】
    重構很重要,那么如何重構?
    當發現代碼不對勁時,就說明需要重構了。
注:
    此處不對勁指的是 代碼可以被優化。
    即需要重構的代碼 具有某種可以被優化的特征。
比如:
    重復代碼。
    類過大。
    函數過長、函數參數列過長等。
    
【重復代碼:】
    重復代碼指的是 在多個地方看到相同的代碼段。
比如:
    同一個類中存在兩個以上相同代碼段。
重構:
    將代碼抽取成一個共通方法,並調用。
    
【函數過長:】
    函數過長指的是 很多功能均寫在一個函數中,使函數變得復雜。
重構:
    將函數中復雜的過程分解成若干個小函數。
注:
    函數命名需要見名知意。最好做到 不閱讀函數內部代碼,僅通過函數名就能了解函數的功能。
    函數功能最好單一,太復雜了可將其進行拆分。

 

......高質量編程當然不是這么簡單說說就了事了。

吾日三省吾身,想要代碼技術過硬,多學、多思考、多總結 是必備的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM