내가 할 수있는 언어로 함수를 중첩해야합니까? 아니면 피해야합니까?


12

JavaScript, PL / SQL 및 다른 언어에서는 함수를 중첩 할 수 있습니다 (예 : 다른 함수 내에 선언). 이것은 큰 기능을 더 작은 조각으로 나누는 데 사용될 수 있지만 더 큰 기능의 맥락 내에서 그 조각을 유지합니다.

function doTooMuch() {
    function doSomething () {
       ...
    }
    function doSomethingElse() {
       ...
    }
    function doYetAnotherThing() {
       ...
    }

    // doTooMuch body

    doSomething();
    doSomethingElse();
    doYetAnotherThing();
}

경우에 따라 작은 함수가 큰 함수의 로컬 변수를 사용하지 않으면 모든 함수가 중첩되지 않은 버전으로 쉽게 변경 될 수 있습니다.

function doSomething () {
   ...
}
function doSomethingElse() {
   ...
}
function doYetAnotherThing() {
   ...
}
function doTooMuch() {
    doSomething();
    doSomethingElse();
    doYetAnotherThing();
}

이러한 중첩 함수를 다른 곳에서 사용하지 않는다고 가정하면 큰 함수의 컨텍스트 내에서 유지하는 것이 더 좋습니까, 아니면 큰 함수를 정확하게 만드는 것이므로 나쁜 것입니까?

답변:


8

그것은 의견의 문제이지만 실제로 디자인에 필요하고 의도적 인 부분이 아니라면 중첩 함수를 피할 것입니다.

대부분의 언어에서 함수를 중첩하면 일종의 기계적 효과가 생깁니다. 가장 일반적이고 흥미로운 것은 몸 안에서 사용할 수있는 변수의 어휘 범위를 닫는 것이지만 다른 것 (예 : 함수의 가시성)도 때때로 나타납니다.

그것들은 일반적으로 올바르게 사용될 때 훌륭한 도구이지만 복잡한 코드입니다. 코드를 처음 보았을 때 로컬이 아니거나 명백하지 않은 영향을 줄 수 있기 때문입니다.

그것들을 사용하지 않으면 많은 사람들이 코드를 읽고 아무것도하지 않을 것입니다. 따라서 코드를 놓쳤다 고 가정하고 별도의 범위가 아닌 왜 그런 식으로했는지 알아 내려고 시도합니다.

또한 미래의 프로그래머가 의도하지 않은 것을 의도적으로 또는 우연히 닫을 위험이 있습니다.

마지막으로, 함수 선언이 이름 지정된 함수를 묶는 함수의 범위 밖에서 선언하면 피하십시오. 그것은 모두에게 혼란을줍니다.

마지막 주에 관해서는 : 각 기능의 도움말를 단락 코드, 중첩 기능은 하나의 거대한 기능보다 작은 골칫거리이지만, 궁극적으로는 때문에 않습니다 이해하는 것이 훨씬 더 많은 코드를 읽는 평균 doTooMuch()- 당신이 중첩 된 함수 선언 사이에 코드를 숨길 수 있습니다 특히, 또는 아무도하지 않았는지 확인해야합니다.


-1 : Javascript가 "대부분의 언어"가 아닙니다. 자바 스크립트에서 중첩 함수는 일반적인 방법입니다.
kevin cline

2
JavaScript의 @kevincline 중첩 함수는 일반적인 나쁜 습관입니다
Raynos

@Raynos : 중첩하지 않으면 어디에 놓을 것인가? 당신을 포함 할 수업이 없습니다. 다음은 전형적인 코드입니다.jquery(function($){ $('#id').click(function(){...}); }
kevin cline

@kevincline ... 멍청한 놈들을위한 전형적인 코드, 당신은 깊은 곳에 중첩 된 함수가 필요합니다. 그리고 자바 스크립트에는 모듈 범위가 없기 때문에 익명 클로저가 필요합니다.
Raynos

그리고 클릭이 완료 콜백과 함께 Ajax 호출을 실행하면? 이제 두 레벨로 중첩 된 함수가 있습니다. 물론 익명 클로저를 변수에 할당하여 중첩을 제한 할 수 있습니다. 정말 좋은가요?
케빈 클라인

2

이것은 정답이없는 질문 중 하나이며 "개인 취향", "팀 연습"과 같은 단어가 떠 오릅니다. 내 의견으로는, 어디에도 사용되지 않는 작은 기능 (이제 또 다른 주관적인 것이 있습니다)은 특히 이름을 지정할 수없는 경우 부모 기능 내부에 속합니다.


0

어떤 선택도 캡슐화를 최대화하지 않기 때문에이 질문에는 정답이 없습니다. 당신이 그것들을 중첩 시키면, 그들은 그들이해서는 안되는 변수에 여전히 액세스 할 수 있습니다. 그렇지 않은 경우 다른 기능은 사용하지 말아야 할 기능에 액세스 할 수 있습니다. 어느 쪽이든, 당신은 잃습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.