(撇开你应该让他们在所有的问题。)
我一直喜欢只使用函数重载给你相同的名称getter和setter方法。
int rate() { return _rate; }
void rate(int value) { _rate = value; }
// instead of
int getRate() { return _rate; }
void setRate(int value) { _rate = value; }
// mainly because it allows me to write the much cleaner
total( period() * rate() );
// instead of
setTotal( getPeriod() * getRate() );
当然我是正确的,但我不知道是否该库的作家有什么好的理由吗?
Answer 1:
我宁愿了get / set版本,因为它是作为对正在发生的事情更清晰。 如果我看到率()和速度(10),我怎么知道率(10)不是简单地用10在计算返回率是多少? 我不这样做,所以现在我要开始寻找弄清楚是怎么回事。 单一功能的名称应该做的一件事,而不是两个对立的东西。
此外,正如其他人所指出的,有些人更喜欢省略“得到”,离开“设置”,即,
int Rate( );
void SetRate( int value );
该公约是相当清楚的还有,我不会有任何问题读取。
Answer 2:
我一直喜欢忽略我的干将的“得到”,因为你这样做,用rate()
代替getRate()
但超载的制定者似乎并不像一个很不错的主意,我起名字rate
不传达的对象被突变。 考虑:
total(period() * rate()); // awesome, very clear
rate(20); // Looks like it computes a rate, using '20'...but for what? And why ignore the return value?
Answer 3:
如何int rate();
和void setRate(int value);
? 这样做的优点并不具有相同名称的两个函数做不同的事情,并且仍然允许period() * rate()
Answer 4:
几年前,我会完全同意。 最近,一个疑问开始做它的方式,因为这使服用getter或setter暧昧的地址。 有了这样TR1 ::绑定的工具,这实在是烦人。
例如:
struct A
{
void Foo(int);
int Foo()const;
};
std::vector<A> v = ....;
std::vector<int> foos;
// Extract Foo
std::transform(
v.begin(), v.end(),
std::back_inserter(foos),
//Ambiguous
// std::tr1::bind(&A::Foo)
//must write this instead. Yuck!
std::tr1::bind(static_cast<int(Foo::*)()>(&A::Foo));
);
撇开你应该让他们在所有的问题;-)
Answer 5:
我会继续前进,何况这应该是一个社区维基问题。
当我开始学习C ++我看了风格指南,和谷歌的好一些要点:
- 大写的方法(这只是漂亮)。
- GETTERS清楚和lowecase(
rate
)。 - 明确制定者和小写(
setRate
)。
Answer 6:
作为简洁是非常重要的,但不是在不完整或具误导性的成本。 出于这个原因,我更喜欢的getFoo()和setFoo()来富()和美孚(INT FOO)。
Answer 7:
有几个层次的“获取”和“设置”
- 我使用get和set“快”的操作。
- 如果有什么需要较长的时间来执行,那么它往往是一个计算器,因为这些名字所暗示的,有些工作必须做检索结果。
- 对于较长的操作,你开始进入像加载/保存,查询/存储,读/写,搜索/查找等前缀
因此,获取/设置可以归因有用的意义,是一个更大的,一致的命名策略的一部分。
Answer 8:
尽管埃德的评论是真实的,我更喜欢的setter /吸气反模式的实际性能。 当您的域图的方法,1/3是已经Eclipse生成虚拟方法,这里有些不对劲。
没有一流的性能,但是,我相信反模式是最有意义的。
此外,它使代码更容易完成。
obj.set (control shift space)
为设置器
obj.get (control shift space)
用于吸气剂
Answer 9:
就个人而言,我觉得干将和对发现的制定者是从“视觉”的语言和他们的“属性”结转一个代码味道。 在“好”类,数据成员是只写或只读,但不读/写。
我认为getter和setter的最常见原因是没有携带对象模型不够深。 在你的榜样,为什么总被传递的周期和速度? 他们不是类的成员? 所以,你应该只设置期限和利率,你应该只总共得到。
可能有例外,但我只是讨厌看一类和寻找“的getX / setX的,的getY /塞蒂,等等,等等” 它只是似乎没有足够的思想付诸类如何应使用,而笔者提出的类EASY在数据获取,这样他就不必考虑类应该如何使用。
当然我是正确的。
Answer 10:
没有人提到的另一个问题是函数重载的情况下。 借此(做作和不完全)例如:
class Employee {
virtual int salary() { return salary_; }
virtual void salary(int newSalary) { salary_ = newSalary; }
};
class Contractor : public Employee {
virtual void salary(int newSalary) {
validateSalaryCap(newSalary);
Employee::salary(newSalary);
}
using Employee::salary; // Most developers will forget this
};
如果没有using
条款,用户Contractor
无法查询,因为超载的薪水。 我最近添加-Woverloaded-virtual
的警告设定的一个项目,我的工作的,你瞧,这显示出了所有的地方。
Answer 11:
我执行惯例,其中一个方法应该始终是动词而一个类应始终是名词(除了函子,出于显而易见的原因)。 在这种情况下,一个get / set前缀必须用于一致性。 话虽如此,我还与埃德Swangren完全同意。 这总计为我为使用这些前缀是显而易见的。
Answer 12:
我倾向于避免get和set标签,不需要编译器做对大部分这些简单的特性作业的信息。
你可以有问题:
class Stuff {
void widget( int something ); // 'special' setter
const Widget& widget( int somethingelse ) const; // getter
}
Stuff a;
a.widget(1); // compiler won't know which widget you mean, not enough info
Answer 13:
如果你消气剂只需rate()
编译器会抱怨它的其他的重新定义rate
的象征,只要你给你的领域的良好有意义的名称那样。 在这种情况下,你需要做一些愚蠢的类似名称的成员_rate
或一些其他类似的方法。 我个人讨厌看到/输入的下划线,所以往往要与getRate()
方法。
这显然是主观的,这恰好是我个人的喜好。
文章来源: getters and setters style