在一個(gè)項(xiàng)目組里面频伤,經(jīng)常會(huì)互相review同事的代碼吹由,review的過程中相信會(huì)產(chǎn)生不少矛盾是牢,這篇文章記錄一下我對(duì)代碼review的一些看法复濒。首先是編碼規(guī)范的問題昵时,拿PHP來說汉买。比如命名規(guī)范瓷蛙,indent之類的即寡。這些都應(yīng)該在項(xiàng)目編碼開始之前大家立好規(guī)矩修然。是采用駝峰命名法還是用下劃線分割單詞笛钝,indent?是用tab還是用空格质况,大括號(hào)是換行:
function foo() {
}
還是不換行:
function foo()
{
}
這些最基礎(chǔ)格式規(guī)范一定要在最開始寫在一個(gè)wiki文檔上,項(xiàng)目組所有成員都需要熟記這個(gè)規(guī)范玻靡。這種規(guī)范结榄,兩上個(gè)技術(shù)骨干定一下就好了,定下來就按它執(zhí)行囤捻。這個(gè)東西其實(shí)只要統(tǒng)一就好臼朗,無需糾結(jié),孰好孰壞也并不影響項(xiàng)目質(zhì)量蝎土。
接下來我說一下我對(duì)關(guān)于一些實(shí)現(xiàn)邏輯的寫法review的個(gè)人理解视哑,比較經(jīng)典的是關(guān)于 if...else...?的用法的討論。如果一個(gè)函數(shù)中用if...else來做分支處理誊涯,代碼如下:
if($flag = 1)
{
.....
$result = 'A';
}else if($flag = 2) {
.....
.....
$result = 'B';
}else {
.....
.....
$result = 'C';
}
.....
.....
return $result;
這種情況挡毅,如果if...else語句下面的處理跟邏輯跟結(jié)果A或者B沒有什么關(guān)系的話 ,可以改寫成如下代碼醋拧,使得代碼邏輯更加清晰
if($flag = 1)
{
.....
return 'A';
}
if($flag = 2) {
.....
.....
return 'B';
}
.....
.....
.....
.....
return 'C';
簡單一句話就是慷嗜,適當(dāng)?shù)娜サ鬷f...else而換成if return結(jié)構(gòu),很多時(shí)候可以提高程序的可讀性丹壕,但也不能認(rèn)準(zhǔn)這個(gè)死道理庆械,比如下面這段(形式A)代碼
function foo($flag) {
if($flag) {
$var = 'A';
}else {
$var = 'B';
}
....
}
我的同事review的時(shí)候建議改成如下(形式B):
function foo($flag) {
$var = 'B';
if($flag) {
$var = 'A';
}
....
}
這其實(shí)并沒有意義,首先這并沒有增加程序的可讀性菌赖,其次形式A的代碼其實(shí)更符合人類的思維缭乘,它表述出$var變量非A既B的邏輯,而下面的代碼表述的是$var變量的默認(rèn)值是A琉用,當(dāng)flag為true的時(shí)候它被賦值B堕绩,給人一種它可能還會(huì)有其他情況被賦值為C、D ... 之類的值的預(yù)期邑时。
所以在review代碼的時(shí)候不能教條(簡單的認(rèn)為只要去掉else代碼就會(huì)變得更簡單易讀)奴紧,review需要關(guān)注的點(diǎn)應(yīng)該是是否有邏輯漏洞,潛在BUG晶丘,非常小可能性出現(xiàn)的異常沒有處理黍氮。而對(duì)于代碼的表述方式,不應(yīng)該過多關(guān)注浅浮。所以反之若是有人寫了形式B的代碼沫浆,也沒有必要在review的時(shí)候,讓他改成形式A滚秩。如果review的這么仔細(xì)专执,不但不會(huì)提高代碼質(zhì)量,反而會(huì)大大減慢項(xiàng)目的開發(fā)進(jìn)度郁油,增加溝通成本本股。
所以攀痊,review這件事,要有度拄显!