簡體   English   中英

C / C ++(也是其他語言?)有條件的提前返回良好代碼慣例

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM