큰 방법 (또는 절차 또는 함수)을 나눌 때이 질문 은 OOP에만 국한된 것이 아니지만 OOP 언어로 99 % 작업을하므로 가장 편한 용어입니다. , 나는 종종 결과에 불만을 느낀다. 큰 메소드에서 코드 블록 일 때보 다 작은 메소드에 대해 추론하기가 더 어려워집니다. 추출 할 때 호출자의 컨텍스트에서 오는 많은 기본 가정을 잃기 때문입니다.
나중에이 코드를보고 개별 메서드를 볼 때 해당 메서드의 위치를 즉시 알 수 없으며 파일의 어느 곳에서나 호출 할 수있는 일반적인 개인 메서드로 생각합니다. 예를 들어, 초기화 방법 (생성자 또는 다른 방법)이 일련의 작은 것으로 나뉘어 있다고 상상해보십시오. 메소드 자체의 상황에서 객체의 상태가 여전히 유효하지 않다는 것을 분명히 알고 있지만 일반적인 개인용 메소드에서는 아마도 해당 객체를 가정했을 것입니다. 이미 초기화되었으며 유효한 상태입니다.
내가 본 유일한 해결책 where
은 Haskell 의 절로, "부모"함수에서만 사용되는 작은 함수를 정의 할 수 있습니다. 기본적으로 다음과 같습니다.
len x y = sqrt $ (sq x) + (sq y)
where sq a = a * a
그러나 내가 사용하는 다른 언어에는 이와 같은 것이 없습니다. 가장 가까운 것은 로컬 범위에서 람다를 정의하는 것입니다.
그래서 제 질문은 – 당신은 이것을 경험하고 있고, 이것이 문제라고 생각합니까? 그렇다면, 특히 Java / C # / C ++와 같은 "주류"OOP 언어에서 일반적으로 어떻게 해결합니까?
중복에 대한 편집 : 다른 사람들이 알았 듯이 이미 분할 방법과 작은 질문에 대한 질문이 하나 있습니다. 나는 그것들을 읽었으며, 호출자의 컨텍스트 (예 : 위의 객체가 초기화되고 있음)에서 파생 될 수있는 기본 가정 의 문제에 대해서는 논의하지 않습니다 . 그것이 내 질문의 요점이며, 내 질문이 다른 이유입니다.
업데이트 : 이 질문과 아래에 토론을했다면 John Carmack 이이 기사 를 특히 좋아할 것입니다 .
실제 코드 실행에 대한 인식 외에도 인라인 함수는 다른 위치에서 함수를 호출 할 수 없도록하는 이점도 있습니다. 어리석게 들리지만 요점이 있습니다. 코드베이스가 수년에 걸쳐 사용됨에 따라 바로 가기를 수행하고 필요한 작업 만 수행하는 함수를 호출 할 수있는 기회가 많이 있습니다. PartialUpdateA () 및 PartialUpdateB ()를 호출하는 FullUpdate () 함수가있을 수 있지만, 일부 경우 PartialUpdateB () 만하면된다는 사실을 깨닫거나 생각할 수 있으며 다른 것을 피함으로써 효율적입니다 작업. 많은 버그가 이것에서 비롯됩니다. 대부분의 버그는 실행 상태가 정확하게 생각한 결과가 아닌 결과입니다.