내 개인적인 연습은 다음과 같습니다.
- 종료 점이 여러 개인 함수가 마음에 들지 않으며 유지 관리 및 추적이 어렵다는 것을 알았습니다. 코드 수정은 본질적으로 약간 부주의하기 때문에 내부 논리를 손상시킵니다. 복잡한 계산 일 때 시작 부분에 반환 값을 만들고 끝 부분에 반환합니다. 이렇게하면 각 if-else, switch 등 경로를 신중하게 따르고 올바른 위치에 값을 올바르게 설정해야합니다. 또한 기본 반환 값을 설정할지 또는 시작할 때 초기화되지 않은 상태로 둘지 결정하는 데 약간의 시간을 소비합니다. 이 방법은 논리 또는 반환 값 유형 또는 의미가 변경 될 때도 도움이됩니다.
예를 들면 다음과 같습니다.
public bool myFunction()
{
// First parameter loading
String myString = getString();
// Location of "quick exits", see the second example
// ...
// declaration of external resources that MUST be released whatever happens
// ...
// the return variable (should think about giving it a default value or not)
// if you have no default value, declare it final! You will get compiler
// error when you try to set it multiple times or leave uninitialized!
bool didSomething = false;
try {
if (myString != null)
{
myString = "Name " + myString;
// Do something more here...
didSomething = true;
} else {
// get other parameters and data
if ( other conditions apply ) {
// do something else
didSomething = true;
}
}
// Edit: previously forgot the most important advantage of this version
// *** HOUSEKEEPING!!! ***
} finally {
// this is the common place to release all resources, reset all state variables
// Yes, if you use try-finally, you will get here from any internal returns too.
// As I said, it is only my taste that I like to have one, straightforward path
// leading here, and this works even if you don't use the try-finally version.
}
return didSomething;
}
- 유일한 예외 : 시작시 (또는 드물게는 프로세스 내부에서) "빠른 종료". 실제 계산 논리가 입력 매개 변수와 내부 상태의 특정 조합을 처리 할 수 없거나 알고리즘을 실행하지 않고 쉬운 솔루션이있는 경우 모든 블록을 if 블록으로 캡슐화 (때로는 깊게)하는 데 도움이되지 않습니다. 이것은 핵심 로직의 일부가 아닌 "예외 상태"이므로 감지 한 즉시 계산에서 벗어나야합니다. 이 경우 다른 분기가 없으며 정상적인 조건에서는 단순히 실행이 계속됩니다. 물론, "예외 상태"는 예외를 던져서 더 잘 표현할 수 있지만 때로는 지나치다.
예를 들면 다음과 같습니다.
public bool myFunction()
{
String myString = getString();
if (null == myString)
{
// there is nothing to do if myString is null
return false;
}
myString = "Name " + myString;
// Do something more here...
// not using return value variable now, because the operation is straightforward.
// if the operation is complex, use the variable as the previous example.
return true;
}
"one exit"규칙은 계산에 해제해야하는 외부 리소스가 필요한 경우 또는 함수를 떠나기 전에 재설정해야하는 상태를 나타내는 경우에도 도움이됩니다. 때로는 개발 중에 나중에 추가되기도합니다. 알고리즘 내에 여러 개의 엑시트가 있으면 모든 브랜치를 올바르게 확장하는 것이 훨씬 어렵습니다. (예외가 발생할 경우 드문 예외적 인 경우 부작용을 피하기 위해 릴리스 / 리셋도 finally 블록에 넣어야합니다 ...)
귀하의 사례는 "실제 작업 전에 빠른 종료"범주에 해당하는 것으로 보이며 예 2 버전과 같이 작성합니다.