[英]C/C++ (Other Languages Too?) Conditional Early Return Good Code Practice
最近,我正在查看自己維護的一些代碼,並且發現一種做法與以前不同。 結果,我想知道在執行函數的早期返回時使用哪種方法。
這是一些例子:
版本1:
int MyFunction(int* ptr)
{
if(!ptr) { // oh no, NULL pointer!
return -1; // what was the caller doing? :(
}
// other code goes here to do work on the pointer
// ...
return 0; // we did it!
}
版本2:
int MyFunction(int* ptr)
{
if(!ptr) { // oh no, NULL pointer!
return -1; // what was the caller doing? :(
} else { // explicitly show that this only gets call when if statement fails
// other code goes here to do work on the pointer
// ...
return 0; // hooray!
}
}
結果,我想知道對於那些忍受(並幸存)許多代碼審查的人,哪種方法被認為是“最佳實踐”。 我知道每個人實際上都在做同一件事,但是“其他”是否在可讀性和清晰度方面增加了很多? 謝謝您的幫助。
如果else子句很短,最多只有幾行代碼,則else只會增加清晰度。 而且,如果您要檢查幾個初始條件,則信號源會很快變得混亂。
如果這是一個很小的函數,而另一個函數很小,這意味着只有不到10條源代碼行,並且沒有其他任何初始檢查,我只能使用else。
在某些情況下,我使用了一個循環,因此一系列初始檢查可以使用中斷離開。
do {
...
} while (0);
我不喜歡使用goto,它實際上可以保證至少讓goto的一位真正信奉者減少編程。
很大程度上取決於您組織的任何代碼標准。 我傾向於極簡主義,因此我使用您提供的第一個版本而不使用其他版本。
我可能還會在較小的函數中執行以下操作,例如少於20或30行:
int MyFunction(int* ptr)
{
int iRetStatus = -1; // we have an error condition
if (ptr) { // good pointer
// stuff to do in this function
iRetStatus = 0;
}
return iRetStatus; // we did it!
}
函數主體中返回的唯一問題是,有時人們在掃描該函數時並沒有意識到存在返回。 在小型功能中,幾乎可以在單個屏幕上看到所有內容,錯過回報的機會非常小。 但是,對於大型功能,可能會錯過中間的回報,尤其是大型復雜功能,這些功能已經經歷了多個維護周期,並且要花很多精力和周全的精力。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.