2010-05-27 3 views
0

클래스 멤버 변수를 클래스 메서드와 함께 사용하는 방법은 무엇입니까?클래스 멤버 변수, 메서드 및 해당 상태

'someData'라는 멤버 변수를 가진 'C'클래스가 있다고 가정 해 보겠습니다.

  1. 나는 값을 반환하지 않고 C.someData에 데이터를 넣는 C.getData()를 호출합니다. 'C'를 인스턴스화 한 클래스는 먼저 C.getData를 호출 한 다음 멤버 변수 C.someData에 액세스하여 데이터를 사용합니다.

  2. 데이터를 반환하는 함수 인 'C'를 인스턴스화 한 클래스에서 C.getData()를 호출합니다.

나 자신이 두 번째 방법을 선호합니다. 그러나 그것은 또한 상황에 달려 있으며 그것은 작은 차이입니다. 클래스의 내부 상태에 의존하는 클래스 메소드를 갖는 것이 '나쁘다'고 할 수 있습니까? 최고의 컨벤션은 무엇입니까?

답변

1

C.someData는 public get으로 작성된 속성이어야합니다. C.someData를 처음 호출 할 때 someData에 값을 지연로드 할 수 있습니다.

public class C 
{ 
    public C() { } 

    string someData = string.Empty; 
    public string SomeData 
    { 
     get 
     { 
      if (string.IsNullOrEmpty(someData)) 
       this.LoadSomeData(); 
      return someData; 
     } 
    } 

    private void LoadSomeData() 
    { 
     this.someData = "Hello world"; 
    } 
} 
3

누구나 이것에 대한 의견이 있지만, 경험적으로 볼 수있는 것은 국가가 악하다고합니다. 주 (State)는 클래스의 동작이 이제 상태에 의해 암시 적으로 영향을 받기 때문에 클래스의 작동 방식을 이해할 때 더 많은 정보를 고려해야합니다. 당신의 공연만큼이나 피하십시오. 나는 당신이 언급 한 두 번째 방법을 강력하게지지합니다. 첫 번째 방법은 버그와 두통을 일으킬 수 있습니다.

일반적으로 내가 본 최악의 방법 중 일부는 void DoSomething()과 같은 서명이 있습니다. 매개 변수를 사용하지 않고 값을 반환하지 않습니다. 메소드의 전체적인 부분은 부작용에 있으며, 메소드가 잘못 명명 된 경우에는 분명하지 않을 수 있습니다.

첫 번째 방법은 다른 사람에게 얼마나 명백할까요? 실제로 어떤 데이터도 반환하지 않는 getData이라는 것을 사용하는 것이 합리적입니까? getData이 개체의 상태를 조작한다는 것은 의미가 있습니까? 때로는 네, 캐싱을 위해 객체를 조작하는 것이 합리적입니다. 그러나 실제로 반환해야하는 값을 저장하기 위해 객체를 조작하는 것은 문제를 요구하고 있습니다.

첫 번째 버전으로 이동해야한다고 생각하면 void calculateValue() 또는 void calculateCachedValue()과 같이 더 정확하게 말하면 실제로 아무 것도 반환하지 않아야하며 그 전체 목적이 다른 것을 계산하는 것임을 나타냅니다. .

+0

글쎄. @CodeMonky : DevExpress CodeRush와 같은 다른 개발자와 리팩토링 애드 인의 코드 리뷰는 DevExpress CodeRush와 같은 최상의 접근 방식을 식별하고 코드를 신속하게 변경하는 데 필요한 노력을 줄이는 데 도움이됩니다. 좋은 네이밍과 일관된 코딩은 코드베이스에 대한 지속적인 지원의 열쇠입니다. –

관련 문제