亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么一個功能應該只有一個出口點?

為什么一個功能應該只有一個出口點?

紅顏莎娜 2019-09-24 10:01:52
我一直都聽說過單個出口點函數是一種不好的編碼方式,因為這樣會降低可讀性和效率。我從未聽說過有人在爭論另一面。我以為這與CS有關,但是這個問題在cstheory stackexchange上被否決了。
查看完整描述

3 回答

?
烙印99

TA貢獻1829條經驗 獲得超13個贊

有不同的思想流派,這在很大程度上取決于個人喜好。

一個是如果只有一個出口點,那么它會減少混亂-您在方法中只有一條路徑,并且知道在哪里尋找出口。在不利的一面,如果您使用縮進來表示嵌套,則代碼最終將大量縮進到右側,并且很難遵循所有嵌套作用域。

另一個是您可以檢查先決條件并在方法開始時提早退出,這樣您就可以在方法主體中知道某些條件是正確的,而整個方法主體都不會向右縮進5英里。通常,這可以最大程度地減少您需要擔心的作用域數量,從而使代碼易于遵循。

第三點是您可以隨心所欲地退出。在過去,這曾經使人更加困惑,但是現在我們有了語法著色的編輯器和編譯器可以檢測無法訪問的代碼,因此處理起來要容易得多。

我正好在中間營地。強制執行單個出口點是毫無意義甚至適得其反的限制,恕我直言,盡管整個方法中的隨機出口有時會導致混亂的邏輯難以遵循,在邏輯上很難確定給定的代碼是否會執行。但是“控制”您的方法可以顯著簡化方法的主體。


查看完整回答
反對 回復 2019-09-24
?
慕哥9229398

TA貢獻1877條經驗 獲得超6個贊

我的一般建議是,在可行的情況下,return語句應位于具有任何副作用的第一個代碼之前,或位于具有任何副作用的最后一個代碼之后。我會考慮類似:


  if(!argument)//檢查是否為非null

    返回ERR_NULL_ARGUMENT;

  ...處理非空參數

  如果(確定)

    返回0;

  其他

    返回ERR_NOT_OK;

比:


  int return_value;

  if(argument)//非null

  {

    ..處理非空參數

    ..適當設置結果

  }

  其他

    結果= ERR_NULL_ARGUMENT;

  返回結果;

如果某個條件會阻止某個功能執行任何操作,那么我寧愿在該功能可以執行任何操作的位置上方的某個位置早點退出該功能。但是,一旦函數執行了帶有副作用的操作,我更愿意從最底層開始,以明確必須處理所有的副作用。


查看完整回答
反對 回復 2019-09-24
?
慕無忌1623718

TA貢獻1744條經驗 獲得超4個贊

單一入口和出口點是結構化編程與分步Spaghetti編碼的原始概念。人們認為,多個出口點函數需要更多代碼,因為您必須適當清理分配給變量的內存空間。考慮一種情況,其中函數分配變量(資源),并且過早地退出該函數并且沒有適當的清理會導致資源泄漏。另外,在每個出口之前構造清理將創建大量冗余代碼。


查看完整回答
反對 回復 2019-09-24
  • 3 回答
  • 0 關注
  • 750 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號