문제

나는 최근에 다른 사람의 코드로 작업을 하다가 이 사람이 개인 변수와 메서드 매개 변수에 관해 나와는 매우 다른 철학을 가지고 있다는 것을 깨달았습니다.나는 일반적으로 개인 변수는 다음과 같은 경우에만 사용해야 한다고 생각합니다.

  1. 나중에 호출할 수 있도록 변수를 저장해야 합니다.
  2. 변수에 저장된 데이터는 클래스에서 전역적으로 사용됩니다.
  3. 변수를 전역적으로 조작해야 하는 경우(모든 클래스 메서드에서 변수를 읽어야 하는 것과는 확실히 다른 것).
  4. 프로그래밍이 훨씬 더 쉬워질 때.(분명히 모호하지만 구석에 몰리는 것을 피하기 위해서는 많은 상황에 처해 있어야 합니다).

(위의 내용 중 많은 부분이 약간 반복적이라는 점을 인정하지만, 각각은 그런 취급을 받을 만큼 충분히 달라 보입니다...)

이는 실수로 변수가 변경되는 것을 방지하는 가장 효율적인 수단인 것 같습니다.또한 이러한 표준을 따르면 외부 참조를 최종적으로 조작할 수 있으므로(클래스가 최종적으로 수정되는 경우) 향후 추가 옵션이 제공됩니다.이것은 단순히 스타일 문제(예: 하나의 진정한 괄호 또는 헝가리어 명명 규칙)입니까, 아니면 이러한 믿음에 대한 정당성이 있습니까?이 경우 실제로 모범 사례가 있습니까?

편집하다
나는 이것을 바로잡아야 한다고 생각한다.실제로 위에서는 "전역적으로"라는 말을 사용했는데, 이는 "어디서든 무엇이든 전역적으로 액세스할 수 있는" 것이 아니라 "인스턴스 메서드에 의한 전역적으로"를 의미했습니다.

편집2
다음과 같은 예가 요청되었습니다.

class foo
{
    private $_my_private_variable;

    public function __constructor__()
    {
     }

    public function useFoo( $variable )
    {
        // This is the line I am wondering about,
        // there does not seem to be a need for storing it.
        $this->_my_private_variable = $variable; 
        $this->_doSometing();
    }

    private function _doSomething()
    {

        /*
          do something with $this->_my_private_variable.
        */
        // This is the only place _my_private_variable is used.
        echo $this->_my_private_variable;
    }
}

이것이 내가 한 방법입니다:

class foo
{

    public function __constructor__()
    {
     }

    public function useFoo( $variable )
    {
        $this->_doSometing( $variable );
    }

    private function _doSomething( $passed_variable )
    {
        /*
          do something with the parameter.
        */
        echo $passed_variable;
    }
}
도움이 되었습니까?

해결책

일반적으로 클래스 멤버는 대표해야합니다 상태 클래스 객체의.

메소드 매개 변수의 임시 위치가 아닙니다 (이것이 메소드 매개 변수의 것).

다른 팁

나는 그것이 스타일 문제가 아니라 가독성/유지 가능성 문제라고 주장합니다. 하나의 변수에는 하나의 사용이 필요하고 하나는 사용해야합니다. 동일한 유형이 필요하기 때문에 다른 목적으로 "재활용"변수는 의미가 없습니다.

설명에서 다른 모든 용도는 기본적으로 목록에 포함되므로 다른 사람의 코드가 정확히이 작업을 수행하는 것처럼 들립니다. 간단히 말해서, 개인 멤버 변수를 사용하여 상황에 따라 임시 역할을합니다. 내가 이것을 가정 할 권리가 있습니까? 그렇다면 코드는 끔찍합니다.

주어진 변수의 어휘 범위와 수명이 작을수록 잘못된 사용의 가능성이 적고 자원 처리가 더 좋습니다.

멤버 변수를 갖는 것은 메소드 호출 사이에 보관 해야하는 상태를 보유하고 있음을 의미합니다. 값이 통화 사이에 살 필요가 없으면 단일 통화 범위 외부에 존재할 이유가 없으므로 (전혀 존재하는 경우) 메소드 자체 내에서 변수가되어야합니다.

스타일은 항상 어려운 일입니다. 일단 당신이 일단 당신이 하나를 개발하면, 당신은 약간의 틀에 갇히게 될 수 있으며 왜 당신이하는 일이 가장 좋은 방법이 아닐지 알기가 어려울 수 있습니다.

필요할 때와 어디에 변수를 생성하고, 완료되면 변수를 처리해야합니다. 클래스가 클래스 수준 변수가 필요하지 않으면 단지 클래스 변수가 필요하지 않습니다. 변수가 필요하지 않은 곳에 변수를 만드는 것은 매우 나쁜 연습입니다.

클래스 멤버는 다음 중 하나 여야합니다.

  • 클래스의 종속성
  • 클래스의 상태를 나타내는 변수
  • 수업의 방법

글로벌 스코핑 변수를 사용하기위한 최상의 실습이 있는지, 항상 메소드 매개 변수로 전달되는지 확실하지 않습니다. ( "개인 변수"에 의해, 나는 당신이 전 세계적으로 범위를 가진 변수를 의미한다고 가정합니다.)

전 세계적으로 범위를 가진 변수를 사용하는 것이 .NET에서 속성을 구현하는 유일한 방법입니다 (자동 속성조차도 궁극적으로 전 세계적으로 범위를 가진 변수를 사용합니다.

메소드 매개 변수를 항상 사용하기위한 인수 라인이 있습니다. 값이 어디에서 나오는지 완전히 명확하게 설명합니다. 나는 그것이 방법이 기본 가치를 변경하는 것을 막는 데 실제로 도움이되지 않는다고 생각하지 않으며, 제 생각에는 때때로 읽기가 더 어려워 질 수 있습니다.

전역 액세스를 위해 구현하거나 프로그래밍을 더 쉽게 만드는 데 동의하지 않습니다.어떤 종류의 필터링도 없이 이를 전역적으로 노출하면 향후 액세스를 결정하기가 더 어려워집니다.

객체 속성은 다른 사람들이 언급 한 바와 같이 상태를 유지하기위한 것이므로, 내 정책은 노출할만한 충분한 이유가 없다면 기본적으로 모든 개인을 갖추어야합니다.

예를 들어 getter 방법을 작성하여 나중에 공개하는 것이 훨씬 쉽습니다 (수업을 시작할 때 바로 생각할 필요는 없습니다). 그러나 나중에 공공 재산을 삭감하려면 많은 양의 코드가 다시 작성되어야 할 수도 있습니다.

나는 이것에 대해 더 많이 생각할 필요가 없지만 유연하게 유지하는 것을 좋아합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top