2011-08-14 41 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的输出。

是不是太奇怪,有一个叫做的setColor功能,却没有一个叫的getColor?

回答

7

这取决于你是否希望你的类的用户可以得到会员的价值。

如此不同寻常或没有,你要坚持你的设计要求是什么。

+0

虽然我同意尊重你的设计,在这种情况下没有(如图所示)强迫你使用重载上的setColor; setColorFrequency和setColorName也是明智的。 –

+3

@JürgenStrobel setColorFrequency和setColorName听起来像他们会更新两个不同的*事物 - 而他们不会。也许setColorFromName或setColorFromFrequency如果超载是要避免... – 2011-08-14 05:56:21

+1

@pst怎么样 '的setColor(双colorFreq)' 和 'SetColorFromName(字符串colorName)'。我更清楚地描述发生了什么。 – BrandonSun

3

一个众所周知的设计,你可能需要SetModel()功能,但GetModel()没有意义是:模型 - 视图 - 演示者(MVP)模式或其变体(如MVC,MVVM等)

去年有一年我主要从事UI的工作,我已经在Prism架构(WPF和Silverlight)之后实现了MVP。我们的设计是这样的:

//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); 
    } 
} 

也就是说,它它调用自己设置为模型视图的视图的SetModel功能演示,但在视图类没有GetModel功能,因为它不”没有任何意义。

所以,是的,这完全取决于设计的用户可能需要一套功能,但得到的功能可能没有意义。通常这样的设置函数被用来“配置”以某种其他方式使用的对象,比如在MVP模式中。设置功能也可以用于少数类以协作方式工作的设计中。这些类别可以是彼此的friend,以便他们可以互相访问private成员(如果需要)。

0

我不确定它有多奇怪,但有人可能会考虑将mutators重命名为changeColor(或类似的不同),以使其更清晰,因为没有getter/setter“配对”。

就个人而言,我宁愿离开转换完全indepent的Circle,让来电处理:

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类独立不管你选择作为颜色的人类可读格式。

相关问题