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

Is it bad practice to have a set method without its own get method?

本文关键字:方法 set 自己的 get      更新时间:2023-10-16

假设我有一个类(名称circle是随机的,没有意义):

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?

这取决于您是否希望成员值由您的类的用户获得。

无论是否与众不同,你都应该坚持你的设计需求。

您可能需要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函数,因为它根本没有意义。

所以,是的,这完全取决于你可能需要set函数的设计,但get函数可能没有意义。通常,这样的set函数用于"配置"对象,这些对象将以其他方式使用,如MVP模式。集合函数也可以用在很少类以协作方式工作的设计中。这些类可以是彼此的friend,这样它们就可以访问彼此的private成员(如果需要的话)。

我不知道这有多奇怪,但是可以考虑将mutator重命名为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类独立于您选择的任何人类可读的颜色格式。