大家來找碴之 Code Review 好好玩
試想一個情境,同事A被要求撰寫一個小模組,規格如下
在一個整數陣列中搜尋特定整數;
若尋得,返回該值位於陣列中的位移值;
若無得,返回-1
因此,同事A花了幾分鐘,寫出了以下這幾段程式碼,並且很貼心的提供兩種search實作方式,給一般人使用的while 版本 (binarySearch_int) 或給神人使用的 recursive 版本 (binarySearch_int_R).
現在問題來了,本團隊有採用 Code Review + Code Inspection 的習慣;現在請模擬你正處在會議室中,你是否有能力透過人腦編譯器你的專業能力,找出程式碼中可能有的問題或給予其他實質的建議?
好孩子請跟我一起宣誓:在code review期間,除了使用人腦編譯器外,我發誓絕不偷偷把程式碼貼上IDE編譯執行;並且我將秉持人飢己飢人溺己溺,同事出包就如同我出包,的精神,認真並負責的審查程式碼,決不胡亂使用 LGTM大法.
雖然說我猜不會有人回復,但還是假裝一下:一周後開獎,提出最有價值的修正或建議的網友,阿宅工程師可以請補休跟你一齊吃霜淇淋(第一支我請客),探討人生哲學或測試學.
void swap_int(int* pa, int* pb)
{
*pa = *pa xor *pb;
*pb = *pa xor *pb;
*pa = *pa xor *pb;
}
void selectionSort_int(int list[], int isize)
{
int imini_index = 0;
for (int i=0; i<isize-1; i++)
{
imini_index = i;
for(int j=i+1; j<isize; j++)
{
if (list[j] < list[imini_index])
{
imini_index = j;
}
}
if (imini_index != i) { swap_int(&list[i],&list[imini_index]); }
}
}
int binarySearch_int(int target[], int toFind, int isize)
{
if (NULL == target) { return -1; }
int ileft = 0; int iright = isize-1;
while(ileft < iright)
{
int imid_index = (iright + ileft) / 2;
if (target[imid_index] > toFind)
{
iright = imid_index - 1;
}
else if (target[imid_index] < toFind)
{
ileft = imid_index +1;
}
else { return imid_index; }
}
return -1;
}
int compare_int(int iop1, int iop2)
{
return (iop1>iop2?1:
(iop1==iop2?0:-1));
}
int binarySearch_int_R(int target[], int toFind, size_t ileft, size_t iright)
{
if (NULL == target || ileft > iright) { return -1; }
int imid = (ileft + iright) / 2;
switch( compare_int(toFind,target[imid]) )
{
case 0:
{ return imid; }
case 1:
{
return binarySearch_int_R(target,
toFind,
imid+1,
iright);
}
case -1:
{
return binarySearch_int_R(target,
toFind,
ileft,
imid -1);
}
default:
{ fprintf(stderr, "WARM: unexpected on compare_int()\n"); } break;
}
return -1;
}
沒有留言:
張貼留言