2012-07-14 2 views
5

최근에는 인스턴스 변수에 전역 변수와 동일한 문제가 있다는 느낌이 들었습니다. 이것에 대해 봤는데 this old article은 내가 겪고있는 잠재적 인 문제를 더 많이 또는 더 적게 나타냅니다.인스턴스 변수가 새로운 전역 변수입니까?

글로벌 변수의 동일한 문제가 인스턴스 변수 또는 클래스 변수에 영향을 미치지 않도록하려면 어떤 우수 사례를 사용합니까?

답변

2

클래스는 전역 구조보다 훨씬 작으므로 인스턴스 변수의 영향은 훨씬 적습니다. 소규모 학급 규모를 유지하고 단일 책임 원칙을 철저히 준수함으로써 지구 변수의 많은 단점을 피할 수 있습니다. 인스턴스 변수가 전달 된 매개 변수에서 생성 된 경우에는 해당 매개 변수를 생성자에서 필수로 만들어 종속성을 명시 적으로 만듭니다. 또한 인스턴스 변수는 잘 캡슐화되어 인스턴스의 메서드 외부에서 직접 수정되지 않으므로 인스턴스 변수가 수정 된 위치를 쉽게 결정할 수 있습니다. 마지막으로 인스턴스 변수는 클래스 전체에 대해 의미가 있어야하며 그렇지 않으면 private이어야합니다.

0

인스턴스 변수는 특정 클래스에서만 액세스 할 수 있습니다. 따라서 인스턴스 변수가 너무 광범위하게 사용되는 것을 방지하려면 클래스를 작게 유지하십시오. 클래스가 커지면 원래 클래스가 사용하는 다른 클래스로 리팩토링 할 수있는 부분을 결정합니다.

0

Nor 인스턴스 변수 나 전역 변수 또는 모든 종류의 변수에는 "문제"가 있습니다 ... 모든 도구입니다. 문제는 때로는 많은 프로그래머가 "잘못된 도구"를 사용하기로 결정했다는 것입니다. 선택 사항이 무엇을 의미하는지 신중하게 생각해야하므로 올바른 선택을 할 수 있습니다.

CurrentUserName과 같은 전역 변수를 사용하는 중 ... CurrentUserName은 범용 적으로 알 수 있다고 말하는 것입니다. 그리고 "매번 CurrentUserName이 하나만있을 수 있습니다." 정말 운이 좋으면 두 사용자가 같은 이름을 가진 경우를 제외하고는 사용자가 동시에 로그온 할 수있게하려는 경우 아마 false가됩니다 ...

인스턴스 변수가 잘못 사용되었습니다. 사용자의 전자 메일 주소를 인스턴스 변수로 설정하면 각 사용자가 여러 개의 전자 메일 주소를 가질 수 있다는 것을 알게됩니다.

더 명확하게 이해할 것이기 때문에 상속을 예로 들겠습니다. 상속에 관련된 문제는 예를 들어 일반적인 학생, 교사 문제를 모델링하고 Student Person의 서브 클래스와 Teacher는 Person의 서브 클래스입니다. 그리고 어떤 사람들은 두 사람이 될 수도 있다는 것을 깨닫습니다. ...

학생은 Person에서 상속하는 정적 관계이며 런타임에는 변경할 수 없습니다. 학생과 교사는 정적 인 관계가 아닙니다. 한 사람도 학생이 아니기 때문에 학생이되기 시작한 다음 교사가되기 시작한 다음 두 가지가 모두 멈추게됩니다. 그러나 항상 같은 사람이됩니다. 그 모델은 그것을 처리 할 수 ​​없습니다 ....

사용자에게 돌아 오는 사용자는 여러 개의 전자 메일 계정에 "연결"됩니다 ... 인스턴스 변수를 넣으면 " 관련된 "하나의 전자 메일 계정으로, 그리고 당신은 문제가 도메인을 모순됩니다. 그 이유는 당신이 문제가있을거야 ...

그냥 세계적으로 알려진 현재 사용자 이름이있다면 동일하게 적용됩니다 .. ..

모든 경우의 문제는 t입니다. 모자에 문제 도메인이 있고 모델을 잘못 모델링했습니다 ... 프로그램과 모델을 문제 도메인과 비슷하게 작동시켜야합니다 ....하지 않으면 문제가 발생합니다 문제 해결을 위해 도구를 선택하십시오.

동의 : 전자 메일 주소 목록이있는 사용자도 잘못되었다고 생각하지만 완전히 다른 동기가 있습니다. 사실은 ...

객체는 단지 다른 개체를 "알고있다"... 그 구현 결정의 ...

class ContactInformation 
{ 
    User contact; 
    EMailAddress email; 
} 

을 사용하고 개체 "가"다른 개체를 "소유"도하지 않는 것이 기억 것

관련 문제