這周也幫其他人看了看代碼锌历,發(fā)現(xiàn)大家對一些規(guī)范不以為然,所以我想借這個機會聊聊峦筒。代碼規(guī)范的重要性說的太多了究西,我來說說代碼不規(guī)范的危害。
為什么要統(tǒng)一勘天、規(guī)范的命名
舉個例子怔揩,我們有公寓表 suites
捉邢、房間表 rooms
,rooms
里有個關(guān)聯(lián)到公寓的字段叫 suite_id
商膊。試問把 suite_id
改成 house_id
是否合理伏伐?
單從這個例子來說,好像并無不妥晕拆,suite
和 house
都能表示公寓的意思藐翎。
但是如果我告訴你我們現(xiàn)在還有額外的兩張表:
-
house_resources
信息采集端的外部房源,是外部房源進入收房系統(tǒng)的入口 -
resource_house
樓盤字典中的公寓实幕,沉淀下來的外部房源吝镣,暫定
這個時候,假如你是非直接開發(fā)人員昆庇,比如其他工程師末贾、需要看數(shù)據(jù)庫的運營、財務(wù)或是 BI
整吆,你第一感覺拱撵,rooms
表的 house_id
是到哪個表的關(guān)聯(lián)?我覺得猜到 house_resources
的人會多一些表蝙,但如果是 suite_id
拴测,再輔之以注釋,就會好很多府蛇。可即便如此集索,BI 同學(xué)也經(jīng)常過來問字段的關(guān)系。汇跨。
這個例子想說明务荆,當(dāng)你的系統(tǒng)已經(jīng)復(fù)雜到無法靠簡單的 “望文生義” 去識別&區(qū)分時,你就得靠統(tǒng)一的規(guī)范去保證大家不會亂扰法。我們約定所有的 xx_id
都是到 xx
表的關(guān)聯(lián)蛹含,大家就不會再困惑。
如果只是自己私下寫一個二三十行的小腳本塞颁,你用 abcdefg
命名沒啥問題浦箱,但在這里,你 hold 不住的祠锣。
信息采集端的幾個表前綴都是
house_resource
酷窥,渠道就是house_resource_users
,渠道費就是house_resource_bills
伴网,也算一個識別標(biāo)記蓬推。其實從更大的角度來說,房源和客源的跟進澡腾,也都該放一起沸伏,歷史遺留問題糕珊。。
為什么要抽象和封裝
思考:為什么我和孟德都沒有參與過合同毅糟、活動的開發(fā)红选,但都能在幾分鐘內(nèi)添加一個可以自定義規(guī)則的新活動?答案是姆另,因為現(xiàn)有的封裝已經(jīng)滿足現(xiàn)階段的需要喇肋,我們無須關(guān)注整個實現(xiàn)邏輯,只需要改一個文件里的一小段(其實就一個 array
)就能實現(xiàn)了迹辐。
如果之前沒有做這些工作蝶防,那么市場部今天下午告訴你12點前要上一個活動,你要從頭熟悉整個代碼明吩,要熟悉每個節(jié)點的處理方式间学。恐怕你就是不吃飯不睡覺也來不及贺喝。
其他的系統(tǒng)里菱鸥,遇到的問題也是一樣的:
- 做支付平臺,能否在不涉及業(yè)務(wù)邏輯的情況下躏鱼,快速添加一個支付平臺
- 做分期平臺,能否在不涉及業(yè)務(wù)邏輯的情況下殷绍,快速添加一個分期公司
- 做房源對接染苛,能否在不涉及業(yè)務(wù)邏輯的情況下,快速添加一個信息平臺
- 做供應(yīng)商管理主到,能否在不涉及業(yè)務(wù)邏輯的情況下茶行,快速添加一個供應(yīng)商
如果你為了省一天的時間,在將來卻給每個人加了一天的工作量登钥,那么你的代碼就是有毒的畔师。
誠然有很多情況,你并不能預(yù)測將來發(fā)生的情況牧牢,但是按照軟件工程的原則看锉,你應(yīng)該留有擴展的空間。如果其他人已經(jīng)幫你預(yù)料到接下來會有一個類似的東西時塔鳍,你就必須考慮了伯铣。
小故事,退轉(zhuǎn)換上線前的一個晚上轮纫,10點多腔寡。我在那里吐槽又要改需求,高靖聽到了就跑出來跟我說掌唾,你們的系統(tǒng)要做的模塊化放前,在碰到這種情況的時候就能快速組合幾個模塊達到他們的目的忿磅,我們以前巴拉巴拉省略500字。凭语。
我當(dāng)時一陣驚訝贝乎,一個不寫代碼的人都懂這個道理,可為什么我們這些“專業(yè)人員”卻要對幾十年的行業(yè)經(jīng)驗嗤之以鼻叽粹。
為什么會有必讀源碼
必讀源碼最大的用處就是讓新人知道這個系統(tǒng)是怎么運作的览效。
當(dāng)時我挑了好多個文件才決定選用這幾份代碼,有幾個考慮:
- 里面包含了
laravel
虫几、orm
的基本用法和文檔锤灿,能讓你快速上手 - 有我們沉淀下來的各種輪子,能讓你快速實現(xiàn)常用的功能
- 有我們最一般最一般的產(chǎn)品設(shè)計規(guī)范辆脸,避免你為了達到某一個效果費勁腦汁
看這三份代碼花不了個把小時但校,但是不看呢,有幾個人都踩了坑啡氢,其結(jié)果是本來幾十行代碼的事状囱,花了幾百行才搞完。費時費力還有坑
分享兩例小故事倘是,
有天雷雷一激動說我們能不能把完成標(biāo)成紅色(好像是喜慶的意思)亭枷,我還沒開口,旁邊一個銷售就說我們習(xí)慣綠色了搀崭,然后我才說我們把紅色作為警告的意思叨粘。
還有我們的列表里按鈕一般都在首列,結(jié)果就是無論第一列是“編輯”還是一個圖標(biāo)瘤睹,大家都知道那個修改的地方升敲。
紅和綠、行首或行尾轰传,都不是什么原則問題驴党。但是在現(xiàn)有環(huán)境下,隨機改動就增加了其他人的識別和使用成本获茬,那就屬于不合理的設(shè)計港庄。
系統(tǒng)內(nèi)部的 Error、Flash(小提示)锦茁、Confirm 以及 DataEditor 的錯誤提醒攘轩,都是統(tǒng)一的組件,即能提高你的開發(fā)效率码俩,也能保證絕大多數(shù)人快速上手你的作品度帮。
總結(jié)就是,強調(diào)代碼規(guī)范,不是閑的蛋疼去滿足個人的代碼潔癖笨篷,而是不想讓大家再去踩之前已經(jīng)踩過的坑瞳秽,提升整個團隊的效率。
至于什么是代碼潔癖率翅,我可以分享一下我的一些潔癖:
- 我不喜歡一大行從半截折開练俐,我自己設(shè)的最大寬度是160,后來妥協(xié)于
psr
規(guī)范冕臭,改成了120腺晾,出現(xiàn)了很多我覺得奇丑無比的折行。而且經(jīng)過“科學(xué)試驗”辜贵,我認為我們的項目設(shè)140比較合適悯蝉,為此和張衛(wèi)還爭論過。托慨。 - 我寫
json
鼻由,key/val
之間的冒號我要對齊,工具不支持我就手動對齊厚棵,但是為了統(tǒng)一蕉世,我也放棄了。絕大多數(shù)工具是冒號左邊有空格婆硬,右邊卻沒空格狠轻,我也覺得丑,但柿祈。哈误。你懂的。 - 一個表達式
a + b*c
躏嚎,仔細看,+
兩邊有空格菩貌,但*
兩邊沒有空格卢佣,這是Go
官方fmt
工具的標(biāo)準格式,它會把優(yōu)先級高的運算放一起箭阶,低的才有空格虚茶。在接觸Go
之前,我自己其實也這么干仇参,特長的表達式嘹叫,幾個空格、幾對括號的情況都有過诈乒。就為了閱讀清晰罩扇。 - 有貝原名
uubee
,我在后臺都寫的Ubee
,是因為首字母要大寫喂饥,我覺得Uubee
又極丑無比消约,所以就省了u
。好在有namespace
擋著员帮,應(yīng)該不會干擾其他人或粮。
所以,不要覺得我是在故意刁難捞高,為了遵循psr
規(guī)范我已經(jīng)很委屈了氯材。。
其實說這些東西硝岗,并不是因為水平多么厲害才提氢哮,這些規(guī)范都和技術(shù)本身無關(guān)。提到的東西辈讶,也都是一路顛簸的血淚教訓(xùn)命浴。誰沒被自己的代碼惡心過幾回?
今天這些更多的是想說為什么要好好設(shè)計你的代碼贱除,至于怎么設(shè)計生闲,以后一點點的整理吧 _
最后
我堅信,寫代碼不是砌磚月幌,不是畫條線放塊磚就完成任務(wù)了碍讯。奧對了,即便是砌磚工人扯躺,發(fā)現(xiàn)有塊磚爛掉了也會毫不猶豫的扔掉捉兴,也不會以“趕工期”為由說“就這樣吧,反正又不會塌”录语。