假设我有一个班级(名称圈是随机的,没有意义):
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的函数吗?
答案 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
类独立于您选择的任何颜色的人类可读格式。