매개 변수 분석법 대 전역 변수


10

코드가 커지기 시작할 때 잠시 동안 나를 괴롭히는 매우 간단한 질문이 있습니다.

중첩 된 함수 호출의 긴 경로를 통과 할 때 매개 변수를 전역 변수로 바꿔야합니까?

많은 함수가 공유 변수를 수정할 수 있기 때문에 전역 환경으로 인해 프로그램 상태를 예측할 수 없게 만들 수 있지만 여전히 전역 공간으로 인해 작업이 매우 쉽다는 것을 알고 있습니다.

설명해 드리겠습니다 :

functionA(){
   x = something
   functionB(x)
}
functionB(x){
   functionC(x)
}
functionC(x){
   finallyDoSomethingWithX(x)
}
finallyDoSomethingWithX(x){
  x += 1 //Very dummy example ignoring pass by value, not reference.
}

로 교체되다:

globalX;
functionA(){
   globalX = something
   functionB()
}
...
...
...
finallyDoSomethingWithX(){
   globalX += 1
}

두 번째 방법은 매개 변수가 쉽게 누적되고 코드를 재사용해야 할 때 때로는 매우 제한적이므로 프로그래밍에 많은 자유를 준다고 생각하지만 동시에 변수와 관련하여 함수가 모듈성을 느슨하게하는 것처럼 느낍니다. 예를 들어, finallyDoSomethingWithX다른 변수로 다른 변수 로 작동하려고 할 때 글로벌 환경에서 재사용 성을 잃어 버립니다 globalX.

나는 자바 스크립트로 프로그래밍하고 있기 때문에 실제로 디자인 패턴을 사용하지 않기 때문에 이것이 일어나고 있다고 생각합니다. 중간 프로젝트의 경우 하나의 스크립트 거래와 모든 언어가 같은 느낌입니다.

조언이 있습니까? 패턴? 필요한 경우 더 구체적으로 지정할 수 있습니다.


5
일반적으로 변수를 매우 깊이 전달하면 문제가 올바르게 해결되지 않은 것입니다. 시스템의 다른 곳에서 상태를 구동하는 전역 변수는 전염병처럼 피하십시오. 특정 시점에서 관리하는 것은 불가능하며 무작위로 예상하지 않은 함수에 의해 일부 상태가 변경되기 때문에 임의로 중단되는 것을 찾을 수 있습니다.
mgw854

전염병처럼 피하십시오. 이해했다. "문제를 올바르게 분류하지 않았습니다"에 대해 좀 더 자세히 설명해 주시겠습니까? 나는 일반적인 생각을 이해하지만 그것을 이해하기 위해 예나 무언가를 생각 해낼 수는 없습니다.
AFP_555

2
많은 레이어에 인수를 전달할 때 일반적인 해결책 은 매개 변수를 전달하는 함수에 해당하는 메소드를 갖는 새 클래스의 오브젝트 인 메소드 오브젝트 를 작성하는 입니다. 그런 다음 매개 변수는 객체의 로컬 변수가 될 수 있으며 해당 메서드는 더 이상 값을 전달할 필요가 없습니다.
Kilian Foth

@KilianFoth 감사합니다. 답변을 확인할 수 있도록 일부 코드를 자세히 설명해 주시겠습니까?
AFP_555

1
다른 언어 (예 : "실제"클래스를 사용하는 언어)에서와 마찬가지로 JavaScript 코드 구조를 처리하는 것이 좋습니다. SO에 관한이 관련 질문에 대한 유용한 링크 : stackoverflow.com/questions/927651/…
Ben Cottrell

답변:


7

전역 변수를 사용하지 마십시오.

또한 함수 체인에 매개 변수를 전달하지 마십시오!

실제 예제를 사용하지 않기 때문에 어렵습니다. 그러나 일반적으로 더 나은 접근 방식이 있습니다.

다양한 저수준 기능에 의해 사용되는 api를 호출하는 데 필요한 암호 변수가 있다고 가정 해 봅시다.

글로벌 접근 (의사 코드)

var pass;

function multiply(a,b) {
   return apiMultiply(pass,a,b);
}

파라미터 전달 접근법

function multiply(a,b,pass) {
    return apiMultiply(pass,a,b);
}

객체 접근

class math {
    var api;
    constructor(pass) {
        api = new api(pass);
    }

    function Multiply(a,b) {
        api.Multiply(a,b); //uses pass from constructor
    }
}

엑센트. 이 방법으로 전달은 전역 환경에 있지 않으며 개체 속성에서 가져올 수있는 여러 함수에 대한 매개 변수도 아닙니다. 감사.
AFP_555

3

전염병과 같은 세계를 피하십시오.

모든 코드는 전역을 수정할 수 있습니다. 따라서 체인 A (x)-> B (x)-> C (x)-> ...-> Z (x)가 있고 x를 전역 X에 저장하면 체인 A- > B-> C-> ...-> Z를 누른 다음 해당 긴 체인의 모든 단계에서 또는 완전히 독립적 인 코드에서 누군가가 X를 변경할 수 있습니다. Z가 사용하는 값과 A의 값이 완전히 다를 수 있습니다. 시작했다.

코드가 수행해야 할 작업을 수행하거나 생각하는 작업을 수행하려는 경우 악몽입니다.


1
전적으로 동의합니다. 전역을 사용하여 문제를 해결하면 두 가지 문제가 있습니다.
Caleb Mauer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.