2013-04-01 3 views
0

다음은 행렬에 연산을 수행하는 데 사용하는 클래스에 포함 된 함수입니다. 이 함수는 부울 값을 반환합니다. 첫 번째 IF 문은 TRUE가 아닌 경우 false를 반환하므로이 값을 반환하면 나머지 함수는 이미 값을 반환했기 때문에 실행하지 않습니다.행렬 연산 코드에 대한 모범 사례

함수를 작성한 경우 원래 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

[ '함수에 return 문이 하나만 있어야합니까?'] [1] - 좋은 경험 법칙을 제공합니다. [1] : http://stackoverflow.com/a/733858/2231703 – HikeMike

+0

@Soner : 사회자가 나에게 _CODE Review_로의 이적을 거부 메모를 남겼습니다. 이유가 주어지지 않았습니다. – halfer

답변

1

당연히 return 문은 해당 지점에서 함수의 실행을 중지하며 for 루프는 실행되지 않습니다.

else 문을 사용하지 않는 것은 좋지 않지만 조건이 실패 할 경우에만 루프가 실행된다는 점을 분명히했을 수 있습니다.

내가 코드에 대해 좋아하는 점은 break 논리를 구분한다는 것입니다. 기술적으로 if(this.IsSquareMatrix()){ <loop> }; return false;은 상당했을 것이다 그러나 이것은 재귀 함수이기 때문에, 브레이크 상태가 명확하게 표시되어, 게다가 거기에 하나 개 들여 쓰기 수준 이하 :

0

그래서 그것을 함수의 나머지 아무튼이 값을 반환하면 가정 이미 값을 반환했기 때문에 실행하지 마십시오.

맞습니다. 사실 Resharper와 같은 IDE 생산성 추가 기능을 사용하면 과도한 중첩 (코드 냄새를 유발할 수 있음)을 방지하기 위해 이러한 방식으로 코드를 구조화하라는 메시지가 표시됩니다.

2

"early return"로직은 매우 일반적이며 "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; 
}