一、高質量編程
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)需要重構代碼的特征
【特征:】
重構很重要,那么如何重構?
當發現代碼不對勁時,就說明需要重構了。
注:
此處不對勁指的是 代碼可以被優化。
即需要重構的代碼 具有某種可以被優化的特征。
比如:
重復代碼。
類過大。
函數過長、函數參數列過長等。
【重復代碼:】
重復代碼指的是 在多個地方看到相同的代碼段。
比如:
同一個類中存在兩個以上相同代碼段。
重構:
將代碼抽取成一個共通方法,並調用。
【函數過長:】
函數過長指的是 很多功能均寫在一個函數中,使函數變得復雜。
重構:
將函數中復雜的過程分解成若干個小函數。
注:
函數命名需要見名知意。最好做到 不閱讀函數內部代碼,僅通過函數名就能了解函數的功能。
函數功能最好單一,太復雜了可將其進行拆分。
......高質量編程當然不是這么簡單說說就了事了。
吾日三省吾身,想要代碼技術過硬,多學、多思考、多總結 是必備的。