코딩 스타일 원칙-예 : 단일 종료 원칙
여전히 단일 출구 또는 다중 출구로가는 사람들은 1960 년대 후반에도 여전히 고착되어 있습니다. 당시 우리는 구조화 된 프로그래머의 초기 단계에 있었기 때문에 그러한 토론이 중요했으며, Bohm-Jacopini 구조적 프로그램 정리의 배후에있는 모든 발견이 모든 프로그래밍 구조에 보편적으로 적용되지는 않는다는 많은 캠프가있었습니다.
그것은 오래 전에 해결 되었어야 할 것입니다. 글쎄, 그것은 (아카데미아와 업계 모두에서 정확히 40 년 동안 정확하기 위해) 정착되었지만 사람들 (절대적으로 또는 반대하는 사람들)은주의를 기울이지 않았습니다.
나머지 답변은 모두 상대적입니다 (소프트웨어에없는 것은 무엇입니까?).
예. 대부분의 경우, 대부분의 경우에 특수한 경우와 언어 별 프로그래밍 구성에 대한 경고가 있습니다.
항상 또는 때로는?
대부분의 경우
실제로 얼마나 많은 차이가 있습니까?
다릅니다.
읽을 수있는 코드와 읽을 수없는 코드 복잡성 증가 (이제 우리가 알아야 할 오류 가능성) vs 단순성 복잡성 (그리고 오류 확률이 낮음) 컴파일러에서 암시 적 반환 (예 : Pascal, Java 또는 C #)을 추가하지 않는 언어 및 기본값은 int (C 및 C ++)입니다.
결국, 키보드 뒤에 사람 / 시간으로 연마 된 기술입니다. 때로는 다음과 같이 여러 개의 return 문을 사용할 수도 있습니다 (일부 Pascal'esque 의사 코드에서).
function foo() : someType
begin
if( test1 == true )
then
return x;
end
doSomethignElseThatShouldnHappenIfTest1IsTrue();
return somethingElse();
end;
의도는 명확하고 알고리즘은 작고 복잡하지 않아 단일 리턴 포인트에서 사용되는 최종 리턴 값을 보유하는 '플래그'변수의 작성을 보증하지 않습니다. 알고리즘에 오류가있을 수 있지만, 그 구조는 간단하기 때문에 오류를 감지하는 노력이 무시할 정도입니다.
때로는 그렇지 않습니다 (여기서는 C와 유사한 의사 코드 사용).
switch(someVal)
{
case v1 : return x1;
case v2 : return x2:
case v3 : doSomething(); // fall-through
case v4: // fall-through
case v5: // fall-through
case v6: return someXthingie;
...
...
default:
doSomething(); // no return statement yet
}
여기서 알고리즘은 간단한 구조를 갖지 않으며 switch 문 (C 스타일 코드)은 알고리즘의 일부로 의도적으로 수행되거나 수행되지 않는 폴 스루 단계를 허용합니다.
알고리즘이 정확하지만 잘못 작성되었을 수 있습니다.
또는 프로그래머의 능력을 넘어서는 외부의 힘에 의해 이것은 합법적으로 필요한 알고리즘의 실제 (정확한) 표현입니다.
어쩌면 잘못되었을 수도 있습니다.
이것의 진실을 밝히려면 이전 예보다 훨씬 많은 노력 이 필요합니다 . 그리고 여기에는 내가 강력하게 믿는 것이 있습니다 (이를 뒷받침 할 공식적인 연구가 없다는 것을 상기시킵니다).
올바른 것으로 간주되는 코드 스 니펫을 가정합니다.
스 니펫이 본질적으로 단순한 흐름 구조를 가진 간단한 알고리즘을 나타내는 경우 여러 개의 리턴 문이 이러한 코드 스 니펫의 가독성과 단순성을 증가시킵니다. 간단히 말해서, 나는 작은 것을 의미하지는 않지만 본질적으로 이해할 수 있거나 자기 증거를 의미합니다. 독립적 인 노력이 필요하지 않습니다 (사람들이 구토하거나 누군가의 어머니를 저주하거나 글 머리 기호를 읽을 때 총알을 삼키도록 유도하지 않습니다). )
단일 리턴 명령문은 알고리즘 실행 전체에서 리턴 값이 계산되거나이를 계산하는 알고리즘의 단계가 알고리즘 구조 내의 한 위치에 그룹화 될 수있는 경우 이러한 코드의 가독성과 단순성을 증가시킵니다. .
하나의 return 문은 하나 이상의 플래그 변수에 대한 할당이 필요한 경우 그러한 할당의 위치가 알고리즘 전체에 걸쳐 균일하게 위치하지 않으면 서 그러한 코드 조각의 가독성과 단순성을 감소시킵니다.
리턴 문이 알고리즘에 균일하게 분산되지 않고 크기 나 구조가 균일하지 않은 상호 배타적 인 코드 블록을 구분하는 경우 여러 리턴 문이 이러한 코드 조각의 가독성과 단순성을 떨어 뜨립니다.
이것은 문제가되는 코드 스 니펫의 복잡성과 밀접한 관련이 있습니다. 그리고 이것은 순환적이고 복잡한 복잡성 측정과 관련이 있습니다. 이를 통해 다음을 관찰 할 수 있습니다.
서브 루틴 또는 함수의 크기가 클수록 내부 제어 흐름 구조가 더 크고 복잡하며 여러 개의 return 문을 사용할지 아니면 단일 return 문을 사용할 지에 대한 의문이 생길 가능성이 커집니다.
이것의 결론은 함수를 작게 유지하고 한 가지만 수행하는 것입니다 (그리고 잘하는 것). 그것들이 명목상 작은 순환 적 및 반 복잡성 메트릭스를 나타내는 경우, 그것들이 가장 정확하고 이해 가능한 과제의 구현 일뿐 아니라, 내부 구조도 비교적 자명하다.
그런 다음에 만 수면을 잃지 않고 아주 쉽고 빠르게 할 수 있으므로 어느 쪽을 선택해도 오류가 발생할 위험이 크지 않은 상태에서 단일 반환 및 다중 반환을 사용할지 여부를 결정할 수 있습니다.
이 모든 것을 살펴보고 사람들이 단일 반품이나 여러 반품 문제로 어려움을 겪을 때, 경험 부족, 어리 석음 또는 업무 윤리 부족으로 인해 깨끗한 코드를 작성하지 않고 작성하는 경향이 있기 때문입니다. 사이클로 매틱 및 헐스 테드 측정을 완전히 무시한 괴물 기능.