引語(yǔ):代碼風(fēng)格,是一個(gè)工程師長(zhǎng)期以來(lái)養(yǎng)成的一些編寫代碼的習(xí)慣,其實(shí)并無(wú)絕對(duì)的好壞之分!但是,基本上可以這么說(shuō),一個(gè)有很好的代碼風(fēng)格的人,技術(shù)水平絕不會(huì)太低;反之,一個(gè)沒(méi)有好的代碼風(fēng)格的人,技術(shù)水平也不會(huì)高到哪里去,即使是他已經(jīng)有很多年的編程經(jīng)驗(yàn)!因?yàn)椋跇I(yè)界有一個(gè)不成文的現(xiàn)象,那就是每個(gè)工程師都有一個(gè)追求技術(shù)提升,追求完美的夢(mèng)!結(jié)果就是,隨著個(gè)人技術(shù)水平的提高,風(fēng)格也越來(lái)越成熟,而這個(gè)風(fēng)格就體現(xiàn)著其個(gè)人水平!
本文以PHP語(yǔ)言的某微視角,說(shuō)幾個(gè)代碼風(fēng)格上的事,同理可推至其他語(yǔ)言,其他技術(shù),甚至其他通用道理!
本文將以從面到線再到點(diǎn)的過(guò)程,講述一些個(gè)人心得。僅供大家?jiàn)蕵?lè)參考,如有不對(duì),請(qǐng)多多指教。如有雷同,不勝榮幸!
本文就以一個(gè)虛擬項(xiàng)目作為線索吧!
1、面:所謂面,就是面對(duì)一個(gè)項(xiàng)目擺在眼前,怎樣去部署大方向的問(wèn)題的思路!準(zhǔn)確的說(shuō),這里并不是真正地體現(xiàn)一個(gè)代碼風(fēng)格,而是一個(gè)做事風(fēng)格!
風(fēng)格1:1. 我需要需求書,書上怎么寫,我就怎么做;2. 如果有一些未知的技術(shù),盡量讓需求上做一些讓步,以減少開(kāi)發(fā)難度;3. 找個(gè)牛逼的人,帶著自己或其他人一起做;4. 時(shí)間是多久?
風(fēng)格2:1. 我需要需求書,書上寫的東西,清楚嗎?有什么可要可不要的東西,有副作用嗎?2. 大概需要什么樣的輔助工具,在哪里可能會(huì)得到這些東西?3. 我怎樣組建自己的技術(shù)團(tuán)隊(duì)?4. 時(shí)間是多久?5. 后期可能會(huì)有什么樣的擴(kuò)展?
2、線:所謂線,可以理解為流水線吧。就是怎樣去完成這么一個(gè)計(jì)劃,怎樣調(diào)動(dòng)生產(chǎn)?
風(fēng)格1:1. 設(shè)計(jì)數(shù)據(jù)庫(kù); 2. 選擇代碼框架;3. 編碼;
風(fēng)格2:1. 設(shè)計(jì)服務(wù)架構(gòu);2. 模塊細(xì)化;3. 設(shè)計(jì)數(shù)據(jù)庫(kù); 4. 選擇代碼框架;5. 編碼;
3、 點(diǎn):所謂點(diǎn),其實(shí)才這里說(shuō)的真正的代碼風(fēng)格,將著重說(shuō)明一些。
風(fēng)格1:任性,隨意而為,沒(méi)有規(guī)則!
風(fēng)格2:著重講解!
3.1. 不一定非要使用現(xiàn)有成熟框架,但是一定要有MVC的概念,基本要拋棄面向過(guò)程編程方式,采用面向?qū)ο螅蝗涡裕?/p>
3.2. 結(jié)合多種設(shè)計(jì)模式進(jìn)行開(kāi)發(fā),如單例模式、工廠模式、抽象模式、觀察者模式等等,這些都是成熟的概念,都要盡量多用!優(yōu)雅,大氣,效率,易讀;
3.3. 類內(nèi)部變量定義以權(quán)限放第一位,變量修飾符放第二位,以重要程度分先后,如 public static function fun1(){} ;類名與文件名有某種特定程度的相同,方便查看;類名統(tǒng)一首字母大寫;私有變量或方法使用下劃線開(kāi)頭以區(qū)分,如 private function _doCut($data);文件以最能體現(xiàn)其功能的單詞命名,區(qū)分類型,如 IndexController.class.php, function.inc.php;
3.4. 文件內(nèi)部使用統(tǒng)一命名方式,要么使用下劃線方式命名,如 $get_child,$bind_value,要么使用駝峰式命名,如 $getChild,$bindValue;變量名盡量使用全名不要使用簡(jiǎn)寫,如 getCategory不要簡(jiǎn)寫成getCat;
3.5. 多個(gè)參數(shù)之間有逗號(hào)分隔時(shí),逗號(hào)后要留一個(gè)空格如 fun($param1, $param2);運(yùn)算符兩邊均有一個(gè)空格(數(shù)組對(duì)齊除外),如 $click = 123;
3.6. 避免使用global變量,尤其是有些不是公共初始化時(shí)產(chǎn)生的變量;
3.7. 杜絕函數(shù)內(nèi)部include方法文件,因?yàn)檫@樣很難找到真正起作用的方法,或者說(shuō)方法混亂;
3.8. 使用自動(dòng)加載方式,而非include方式;
3.9. 如果一定要包含文件,盡量使用include_once,require_once 避免一個(gè)文件被引入多次從而報(bào)錯(cuò)情況;
3.10. 對(duì)可能多次引用的全局變量,使用某類的靜態(tài)方法進(jìn)行獲取,如 ConfigClass::get(‘main’, ‘field’); 對(duì)于數(shù)據(jù)庫(kù)一類連接,使用靜態(tài)變量,保存首次連接時(shí)打開(kāi)的連接,從而多處使用DB實(shí)例時(shí),仍然不會(huì)重復(fù)實(shí)例化,如 $db = ConfigClass::getDbInstance();
3.11. 多使用isset(), empty()等系統(tǒng)函數(shù)進(jìn)行判斷空操作而非 !$var, $var == null;
3.12. 對(duì)于使用兩次以上方法,就應(yīng)該去考慮提出到公用地方或者類中;
3.13. 數(shù)據(jù)查詢先確認(rèn)當(dāng)前索引,配合寫SQL,特別地方,一定加上注釋;
3.14. 會(huì)使用文件鎖,數(shù)據(jù)庫(kù)鎖,會(huì)使用緩存如 memcache, redis, mongodb等;
3.15. 會(huì)適當(dāng)使用事務(wù);
。..
好吧,晚了,洗洗睡吧。有空再補(bǔ)補(bǔ)。總之,一些小細(xì)節(jié),總是要用經(jīng)驗(yàn)堆砌才會(huì)真的明白!
其實(shí),好與不好,大家已早有定論,只是作個(gè)參考,罷了!
習(xí)慣,就好!
-
工程師
+關(guān)注
關(guān)注
59文章
1570瀏覽量
68514 -
編程
+關(guān)注
關(guān)注
88文章
3615瀏覽量
93711 -
代碼
+關(guān)注
關(guān)注
30文章
4786瀏覽量
68564
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論