getter和setter风格(getters and setters style)

2019-08-31 13:15发布

(撇开你应该让他们在所有的问题。)

我一直喜欢只使用函数重载给你相同的名称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