没有自己的get方法有一个set方法是不好的做法吗?

时间:2011-08-14 05:39:26

标签: c++ class accessor

假设我有一个班级(名称圈是随机的,没有意义):

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的函数吗?

3 个答案:

答案 0 :(得分:7)

这取决于您是否希望您的班级用户获取成员价值。

如此不寻常,你应该坚持你的设计要求。

答案 1 :(得分:3)

一个众所周知的设计,您可能需要SetModel()函数但GetModel()没有意义:Model-View-Presenter(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成员(如果需要)。

答案 2 :(得分:0)

我不确定它有多奇怪,但有人可能会考虑将变换器重命名为changeColor(或类似的不同之处),以便更清楚地知道没有getter / setter“配对”。

就我个人而言,我宁愿将转换完全独立于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类独立于您选择的任何颜色的人类可读格式。