2011-08-14 4 views
2

의 내가 클래스가 (이름 원이 무작위로했다 아무 의미가 없습니다) 있다고 가정 해 봅시다 : 한편자체 get 메서드가없는 set 메서드를 사용하는 것은 나쁜 습관입니까?

Class circle{ 
    double colorFrequency_; 
public: 
    void setColor(double colorFrequency){ colorFrequency_=colorFrequency; } 
    void setColor(string colorName){ colorFrequency_=colorNameToFrequency(string colorName); } 
    double getColorFrequency() 
    string getColorName(){ /* converts color frequency into a string containing the name of a color it's close to, like "red" */ } 

} 

를,이 방법이라고 setColor를하지만 getColor에서 호출되지 하나를 가지고 일관성 보이지만, 다른 한편으로 만약에 setColorFrequency와 setColorName이라는 함수를 대신 사용한다면 setColorName은 getColorName의 출력뿐만 아니라 setColorFrequency의 출력에도 영향을 미칠 것이기 때문에 그 이름은 완전히 설명 할 수 없습니다.

getColor라는 함수가 아니라 setColor라는 함수를 사용하는 것이 이상한가요?

답변

7

클래스의 사용자가 구성원 값을 가져올 지 여부에 따라 달라집니다.

비정상적이든 아니든 디자인 요구 사항에 충실해야합니다.

+0

나는 당신의 디자인을 존중하는 데 동의하지만,이 경우에는 아무 것도 (표시되지 않음) setColor에서 오버로드를 사용하도록 강요합니다. setColorFrequency와 setColorName도 의미가 있습니다. –

+3

@ Jürgen Strobel setColorFrequency 및 setColorName은 두 개의 다른 * 것들을 업데이트하는 것처럼 들리지만 그렇지 않은 경우에는 소리가납니다. 오버로드가 발생하지 않도록하려면 setColorFromName 또는 setColorFromFrequency를 사용하십시오. –

+1

@pst SetColor (double colorFreq) 및 SetColorFromName (string colorName)은 어떻습니까? 무슨 일이 일어나고 있는지 설명하는 것이 더 분명해 보입니다. – BrandonSun

3

당신이 이해가되지 않습니다 SetModel() 기능 만 GetModel()을해야 할 수도 있습니다 하나는 잘 알려진 디자인입니다 모델 - 뷰 - 발표자 (MVP) 패턴 또는 마지막의 경우 (예 등 MVC, MVVM 등) 그 변종

1 년 전 UI에서 주로 일하고 있는데 프리즘 아키텍처 (WPF 및 Silverlight)에 따라 MVP를 구현했습니다. 우리의 디자인은 이런 식입니다 :

, 뷰 모델로 자신을 설정하는 뷰의 SetModel 함수를 호출의 발표자이지만 '아무튼 때문에 뷰 클래스에는 GetModel 기능이없는
//C# code, but this design can written in C++ as well 
public class QueryPresenter : IQueryPresenter, /*other interfaces */ 
{ 

    public QueryPresenter(IQueryView view, /*other parameter*/) 
    { 
    //... 
    view.SetModel(this); 
    } 
} 

전혀 이해가되지 않는다.

그렇습니다. 설정 기능이 필요할 수도있는 디자인에 따라 달라 지지만 기능이 올바르지 않을 수 있습니다. 일반적으로 이러한 집합 함수는 MVP 패턴과 같이 다른 방식으로 사용될 객체를 "구성"하는 데 사용됩니다. 집합 함수는 협동 적으로 작동하는 클래스가 거의없는 디자인에서도 사용할 수 있습니다. 이러한 클래스는 서로 friend 일 수 있으므로 서로 액세스 할 수 있습니다 (필요한 경우) private.

0

나는 그것이 얼마나 이상한지는 잘 모르겠지만, 균등자를 changeColor (또는 이와 비슷하게 다른 이름)으로 바꾸면 getter/setter "pairing"이 없다는 것을 명확하게 알 수 있습니다.

개인적으로, 나는 Circle 완전히 indepent 변환을 떠나 선호 호출자가 그것을 처리하도록 :

double colorNameToFrequency(const string& name) { ... } 
string colorFrequencyToName(double frequency) { ... } 

class Circle 
{ 
    double colorFrequency_; 
public: 
    void setColor(double colorFrequency); 
    double getColor() const; 
}; 

// Client code 
Circle c; 
c.setColor(colorNameToFrequency("mint-green")); 
string name = colorFrequencyToName(c.getColor()); 

이것은 당신이 색상 사람이 읽을 수있는 형식으로 무엇을 선택 독립적 Circle 클래스를 만든다.

관련 문제