이 SESE ( Single Entry, Single Exit) 개념은 C 및 어셈블리와 같은 명시 적 리소스 관리 기능이있는 언어 에서 비롯됩니다 . C에서 다음과 같은 코드는 리소스를 누출시킵니다.
void f()
{
resource res = acquire_resource(); // think malloc()
if( f1(res) )
return; // leaks res
f2(res);
release_resource(res); // think free()
}
이러한 언어에서는 기본적으로 세 가지 옵션이 있습니다.
정리 코드를 복제하십시오.
어. 중복성은 항상 나쁩니다.
a goto
를 사용 하여 정리 코드로 이동하십시오.
이를 위해서는 정리 코드가 함수의 마지막 항목이어야합니다. (그리고 이것이 일부 사람들 goto
이 그 자리를 차지 한다고 주장하는 이유 입니다. 그리고 실제로 – C에서)
지역 변수를 소개하고이를 통해 제어 흐름을 조작하십시오.
단점은 (생각 구문을 통해 조작하는 제어 흐름이다 break
, return
, if
, while
변수의 상태를 통해 조작 제어 흐름 (당신이 알고리즘에서 볼 때이 변수가 어떤 상태가 없기 때문에)보다 따라하기가 훨씬 쉽다).
어셈블리에서는 함수를 호출 할 때 함수의 주소로 이동할 수 있기 때문에 더 이상합니다. 효과적으로 거의 모든 함수에 대한 진입 점이 거의 없습니다. (때로는 이것이 도움이됩니다. 이러한 썽 크는 컴파일러가 C ++의 다중 상속 시나리오에서 함수 this
를 호출하는 데 필요한 포인터 조정 을 구현하는 일반적인 기술입니다 virtual
.)
리소스를 수동으로 관리해야하는 경우 어디에서나 함수를 시작하거나 종료하는 옵션을 활용하면 코드가 더 복잡해져 버그가 발생합니다. 따라서 더 깨끗한 코드와 버그를 줄이기 위해 SESE를 전파하는 사고 방식이 나타났습니다.
그러나 언어에 예외가있는 경우 (거의) 모든 기능이 (거의) 어느 시점에서 조기에 종료 될 수 있으므로 어쨌든 조기 반환을위한 준비를해야합니다. (내 생각은 finally
주로 자바가 사용되며 using
구현할 때 ( IDisposable
, finally
기타) C #에서, C + +를 대신 사용 RAII를 .)이 작업을 완료 한 후에는 할 수없는 때문에 초기에 자신 뒤처리에 실패 return
성명, 어떤 일이 아마 SESE를지지하는 가장 강력한 주장은 사라졌다.
가독성이 남습니다. 물론, 십여 개의 return
문이 무작위로 뿌려진 200 LoC 함수 는 좋은 프로그래밍 스타일이 아니며 읽을 수있는 코드를 만들지 않습니다. 그러나 그러한 함수는 조기 수익이 없으면 이해하기 쉽지 않습니다.
자원을 수동으로 관리하지 않거나 관리하지 않아야하는 언어에서는 이전 SESE 규칙을 준수 할 가치가 거의 없습니다. 위에서 언급 한 바와 같이, OTOH는 종종 코드를 더 복잡하게 만듭니다 . 공룡은 (C 제외) 오늘날 대부분의 언어에 잘 맞지 않습니다. 코드의 이해를 돕는 대신 방해합니다.
Java 프로그래머는 왜 이것을 고집합니까? 잘 모르겠지만 Java (외부) POV에서 Java는 C (많은 의미가있는 곳)에서 많은 규칙을 취하여 OO 세계 (그들이 쓸모 없거나 완전히 나쁜 곳)에 적용했습니다. 비용에 관계없이 (범위의 시작 부분에서 모든 변수를 정의하는 규칙처럼)
프로그래머는 비이성적 인 이유로 모든 종류의 이상한 표기법을 고수합니다. (깊숙히 중첩 된 구조적 설명 –“화살촉”–은 파스칼과 같은 언어에서 한때는 아름다운 코드로 여겨졌습니다.) 이것에 순수한 논리적 추론을 적용하는 것은 대다수의 사람들이 확립 된 방식에서 벗어나도록 설득하지 못하는 것 같습니다. 그러한 습관을 바꾸는 가장 좋은 방법은 아마도 기존 습관이 아닌 최선을 다하도록 일찍 가르치는 것입니다. 프로그래밍 교사 인 당신은 당신의 손에 있습니다.:)