摘要:統(tǒng)一的編碼規(guī)范編碼規(guī)范往簡(jiǎn)單說其實(shí)就是三個(gè)方面換行空格變量命名放在里面,還有一些附加的地方,比如關(guān)鍵字大小寫,語法糖的使用與等的問題。這些都是規(guī)范代碼的重要手段。推廣給你的隊(duì)友團(tuán)隊(duì)項(xiàng)目中,隊(duì)友的配合對(duì)整個(gè)代碼的規(guī)范起著決定性的作用。
1. 統(tǒng)一的編碼規(guī)范
編碼規(guī)范往簡(jiǎn)單說其實(shí)就是三個(gè)方面:
換行
空格
變量命名
放在 PHP 里面,還有一些附加的地方,比如關(guān)鍵字大小寫,語法糖的使用(array() 與 [] 等)的問題。之前整理過 PSR 的標(biāo)準(zhǔn),也找過 php-cs-fixer 這樣的工具。這些都是規(guī)范代碼的重要手段。有統(tǒng)一的標(biāo)準(zhǔn),配合上工具的檢查,形成統(tǒng)一的編碼約束不是什么難題。
沒有規(guī)范,不同的人甚至同一個(gè)人在空格、換行和命名上都有可能是十分隨意的。代碼一長(zhǎng),回使整個(gè)文件看起來無比雜亂。
典型的例子比如:if 和 else 的組合,可以寫出無數(shù)種風(fēng)格,比如:
再比如變量函數(shù)命名的問題上,各種混搭風(fēng)格層出不窮:
這里并不探討各種寫法的優(yōu)缺點(diǎn),只是風(fēng)格需要保持統(tǒng)一,不要混用。
2. 良好的編碼習(xí)慣如果你仔細(xì)看過 PSR 的標(biāo)準(zhǔn),可能也會(huì)注意到某些地方其實(shí)是標(biāo)準(zhǔn)無法涉及到的。比如一個(gè)超長(zhǎng)的表達(dá)式在什么時(shí)候換行,如何縮進(jìn)等。
這里涉及到的就是編碼習(xí)慣的約束問題。
比如方法的鏈?zhǔn)降恼{(diào)用的問題,比如某些數(shù)據(jù)庫查詢的封裝:
db->select("id")->where("a", 1) ->groupBy("a")->orderBy("id", "DESC")->result(); # 這種情況下我建議是一個(gè)條件一行,保持縮進(jìn) $result = $this->db->select("id") ->where("a", 1) ->groupBy("a") ->orderBy("id", "DESC") ->result();還有數(shù)組定義,某些數(shù)組成員字符串很長(zhǎng)的情況下的寫法:
3. 尋找最優(yōu)的寫法寫代碼的過程中,最優(yōu)的寫法和編碼習(xí)慣又不是同一件事情。這里要說的指的是如何遵循 PHP 的語言特性或者框架的特征,充分發(fā)揮語言和框架的能力來減少冗余。
比如在獲取前端傳入的參數(shù)的時(shí)候,很多時(shí)候能見到這樣的代碼:
更有甚者一些框架將前端傳入的參數(shù)封裝了一層,比如 $this->request->data["param"],如果再去用 isset 或者 array_key_exists 判斷,整個(gè)獲取參數(shù)的語句就會(huì)變得很長(zhǎng)。
某些情況下使用三元運(yùn)算符的時(shí)候需要注意 ?: 是可以合并使用的。
其實(shí)我們應(yīng)該去嘗試封裝這種寫法,防止同樣的變量出現(xiàn)在一個(gè)語句中多次的情況。對(duì)于默認(rèn)值的賦予,可以調(diào)研框架是否有封裝提供,或者通過強(qiáng)制類型轉(zhuǎn)換的方式進(jìn)行。
還有一種情況是條件和循環(huán)嵌套的時(shí)候。比如從數(shù)組里抽取某一個(gè)字段,或者對(duì)某一個(gè)字段的值進(jìn)行處理的時(shí)候,善用 array_map 以及引用(&)往往能節(jié)省不少工作量。但是使用的時(shí)候也要注意數(shù)組指針最后的位置。
在根據(jù)條件返回結(jié)果時(shí),需要善用 return。還有就是合理的抽象與封裝。
4. review 自己的代碼除了以上提到的在日常開發(fā)中需要注意的一些問題。還有就是事后的工作。
我相信很多人在看自己以前的代碼的時(shí)候都有一種其實(shí)有更好的寫法的感覺。隨著時(shí)間的推移自己總會(huì)有更豐富的閱歷,更多的想法。偶爾 review 自己的代碼也是對(duì)過去的總結(jié),也許會(huì)有新的感知。
5. 推廣給你的隊(duì)友團(tuán)隊(duì)項(xiàng)目中,隊(duì)友的配合對(duì)整個(gè)代碼的規(guī)范起著決定性的作用。一個(gè)團(tuán)隊(duì)中有一個(gè)人不遵守規(guī)范,而又要到處修改代碼的時(shí)候,很快就能破壞到所有的約束。
有統(tǒng)一的標(biāo)準(zhǔn),有良好的執(zhí)行力才能完成這件工作。
私博地址:http://0x1.im
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/21378.html
摘要:將代碼寫的簡(jiǎn)潔并且易讀易懂是每一位優(yōu)秀的所應(yīng)該具備的基本功。前幾天在上看到這個(gè)項(xiàng)目,感覺很有收獲,于是在這里記錄一下。 將代碼寫的簡(jiǎn)潔并且易讀易懂是每一位優(yōu)秀的coder所應(yīng)該具備的基本功。 前幾天在github上看到clean-code-php這個(gè)項(xiàng)目,感覺很有收獲,于是在這里記錄一下。 使用有意義并且可讀的變量名稱 Bad: $ymdstr = $moment->format(y-...
摘要:使用和在中,通過為屬性或方法設(shè)置和關(guān)鍵字可以實(shí)現(xiàn)對(duì)屬性或方法的可見性控制。你的繼承表達(dá)了一個(gè)對(duì)等比如人類是動(dòng)物的關(guān)系,不是包含的關(guān)系比如用戶具有用戶詳情你能從基類中復(fù)用代碼你想通過修改全局類來對(duì)所有派生類進(jìn)行修改。 使用getter和setter 在 PHP 中,通過為屬性或方法設(shè)置 public, protected 和 private 關(guān)鍵字可以實(shí)現(xiàn)對(duì)屬性或方法的可見性控制。不過,...
摘要:超過三個(gè)參數(shù)會(huì)導(dǎo)致參數(shù)之間的組合過多,你必須對(duì)每個(gè)單獨(dú)的參數(shù)測(cè)試大量不同的情況。拆分這些函數(shù),可以讓代碼可重用性更高且更易測(cè)試。 函數(shù)參數(shù)不要超過兩個(gè) 限制函數(shù)的參數(shù)數(shù)量是非常重要的,因?yàn)樗鼓愕暮瘮?shù)更容易測(cè)試。超過三個(gè)參數(shù)會(huì)導(dǎo)致參數(shù)之間的組合過多,你必須對(duì)每個(gè)單獨(dú)的參數(shù)測(cè)試大量不同的情況。 沒有參數(shù)是最理想的情況,一個(gè)或兩個(gè)參數(shù)是可以接受的,三個(gè)以上則是應(yīng)該避免的。這很重要的。如果你...
摘要:是推薦的便于記憶的首字母簡(jiǎn)寫,它代表了命名的最重要的五個(gè)面對(duì)對(duì)象編碼設(shè)計(jì)原則單一職責(zé)原則開閉原則里氏替換原則接口隔離原則依賴反轉(zhuǎn)原則單一職責(zé)原則修改一個(gè)類應(yīng)該只為一個(gè)理由。別寫重復(fù)代碼這條原則大家應(yīng)該都是比較熟悉了。 SOLID 是Michael Feathers推薦的便于記憶的首字母簡(jiǎn)寫,它代表了Robert Martin命名的最重要的五個(gè)面對(duì)對(duì)象編碼設(shè)計(jì)原則 S: 單一職責(zé)原則 ...
摘要:權(quán)限中心的依賴聲明聲明依賴關(guān)系檢查代碼規(guī)范聲明開發(fā)依賴命名空間檢查代碼規(guī)范,執(zhí)行單元測(cè)試。單元測(cè)試持續(xù)交付一切都如此的完美,沒有測(cè)試,又如何可以證明這件事情的完美,又如何可以保障交付的質(zhì)量。 序 權(quán)限管理是無線運(yùn)營(yíng)系統(tǒng)中的核心模塊,通過訪問控制策略的配置,來約定人與資源的訪問關(guān)系。 本文著重講解如何通過PHP來構(gòu)建一個(gè)靈活、通用、安全的權(quán)限管理系統(tǒng)。 關(guān)于權(quán)限 首先我們來聊聊權(quán)限。 權(quán)...
閱讀 3452·2021-10-20 13:49
閱讀 2826·2021-09-29 09:34
閱讀 3734·2021-09-01 11:29
閱讀 3099·2019-08-30 11:01
閱讀 877·2019-08-29 17:10
閱讀 909·2019-08-29 12:48
閱讀 2807·2019-08-29 12:40
閱讀 1379·2019-08-29 12:30