2013-04-01 57 views
0

下面是一個包含在我用於在矩陣上執行操作的類中包含的函數。該函數返回一個布爾值,第一個IF語句如果NOT TRUE,它返回一個假值,所以我假設一旦它返回該值,該函數的其餘部分就不會執行,因爲它已經返回了一個值。矩陣運算代碼的最佳實踐

如果我已經寫了函數,我會在附加到原始IF語句的ELSE構造中包含FOR循環。我不是一個專業的程序員,所以我很抱歉,如果答案很明顯,我就不會用這種方式編寫代碼,我很好奇,如果改變這種方式編寫的所有函數是值得的。

public bool IsIdentityMatrix() 
{ 
    if (!this.IsSquareMatrix()) 
    { 
     return false; 
    } 

    for (int i = 0; i < this.RowCount; i++) 
    { 
     for (int j = 0; j < this.ColumnCount; j++) 
     { 
      decimal checkValue = 0; 
      if (i == j) 
      { 
       checkValue = 1; 
      } 

      if (mInnerMatrix[i, j] != checkValue) 
      { 
       return false; 
      } 
     } 
    } 
} 
+3

倒不如說是[codereview.se]? –

+0

請參閱['函數是否只有一個返回語句?'] [1] - 它提供了一個很好的經驗法則。 [1]:http://stackoverflow.com/a/733858/2231703 – HikeMike

+0

@Soner:主持人給我留下一張紙條拒絕轉會到_CODE Review_。沒有理由。 – halfer

回答

1

您當然是對的,return語句會停止該函數的執行,並且for循環將不會執行。

我不認爲它不使用else語句的壞風格,但它可能已經更清楚地表明,只有當條件失敗時纔會執行循環。

我喜歡的代碼是它將中斷邏輯從中分離出來。技術上的if(this.IsSquareMatrix()){ <loop> }; return false;將是等效的,但是因爲這是一個遞歸函數,休息條件明確表示,再加上有一個縮進級別少:)

0

,所以我認爲,一旦它返回值的函數的其餘部分沒有按不執行,因爲它已經返回一個值

這是正確的。實際上,當您使用IDE生產力加載項(如Resharper)時,它會提示您以這種方式構建代碼以防止過多的嵌套(這可能會導致代碼異味)。

2

像這樣的「早期返回」邏輯是非常普遍的,並且在「else」中不縮進方法的其餘部分是正常的。這確實傾向於僅適用於「早期回報」,它應該全部在方法的頂端。

嚴格地說,該方法可以分爲兩個聯合重組稍微使其更具可讀性(這是當然的主觀聲明!):

public bool IsIdentityMatrix() 
{ 
    if (IsSquareMatrix()) 
     return checkSquareMatrixForIdentity(); 
    else 
     return false; 
} 

private bool checkSquareMatrixForIdentity() 
{ 
    for (int i = 0; i < this.RowCount; i++) 
    { 
     for (int j = 0; j < this.ColumnCount; j++) 
     { 
      decimal checkValue = 0; 
      if (i == j) 
      { 
       checkValue = 1; 
      } 

      if (mInnerMatrix[i, j] != checkValue) 
      { 
       return false; 
      } 
     } 
    } 

    return true; 
}