当我创建私有方法时,我经常遇到同样的想法,应用程序是修改(通常初始化)类的范围内的现有变量。 我无法决定我更喜欢以下两种方法中的哪一种。
假设我们有一个带有字段变量Test
的课程x
。设为整数。你如何修改/初始化x
?
a)直接修改字段
private void initX(){
// Do something to determine x. Here its very simple.
x = 60;
}
b)使用返回值
private int initX(){
// Do something to determine x. Here its very simple.
return 60;
}
在构造函数中:
public Test(){
// a)
initX();
// b)
x = initX();
}
我喜欢它在 b)中清楚我们正在处理哪个变量。但另一方面, a)在大多数情况下似乎足够了 - 函数名称完全表明我们正在做的事情!
您更喜欢哪一个?为什么?
感谢你们的回答!我会把它变成一个社区维基,因为我意识到没有正确答案。
答案 0 :(得分:1)
我通常更喜欢 b),只是我选择了一个不同的名称,例如computeX()
。原因如下:
computeX()
声明为protected
,则子类可以通过一种简单的方式来说明其工作原理,但x
本身可以保留private
字段; < / LI>
final
,如果它们是这样的话;在这种情况下, a)不是一个选项,因为初始化必须在编译器中发生(这是特定于Java的,但你的例子看起来都是Java)。那就是说,这两种方法之间没有强烈的偏好。例如,如果我需要一次初始化几个相关字段,我通常会选择 a)选项。但是,只有当我不能或不想出于某种原因时,才能直接在构造函数中初始化。
答案 1 :(得分:1)
对于初始化,我更喜欢构造函数初始化,如果可能的话,
public Test():x(val){...}
,或在构造函数体中编写初始化代码。构造函数是初始化所有字段的最佳位置(实际上,它是构造函数的目的)。只有当X的初始化代码太长(仅为了可读性)并且从构造函数调用此函数时,我才使用private initX()
方法。我认为private int initX()
与初始化无关(除非你实现延迟初始化,但在这种情况下它应该返回&int
或const &int
),它是一个访问器。
答案 2 :(得分:1)
我更喜欢选项b),因为你可以用支持它的语言使它成为const函数。
使用选项a),新的,懒惰的或只是时间紧张的开发人员会开始在initX方法中添加一些额外的任务,而不是创建一个新任务。
此外,在b)中,您可以从类定义中删除initX(),因此对象的使用者甚至不必知道它就在那里。例如,在C ++中。
在标题中:
class Test {
private: int X;
public: Test();
...
}
在CPP文件中:
static int initX() { return 60; }
Test::Test() {
X = initX();
}
从头文件中删除init函数简化了必须使用它的人的类。
答案 3 :(得分:1)
既不?
我更喜欢在构造函数中进行初始化,如果我需要初始化大量字段和/或需要能够在实例的生命周期中的另一个点重新初始化(不需要通过自毁/构建体)。
更重要的是,60意味着什么?
如果它是一个有意义的值,请将其设为具有有意义名称的const:NUMBER_OF_XXXXX,MINUTES_PER_HOUR,FIVE_DOZEN_APPLES,SPEED_LIMIT,......无论您随后如何以及在何处使用它(构造函数,init方法或getter函数)。< / p>
使其成为命名常量使得该值本身可以重复使用。使用const更加“可查找”,特别是对于更普遍的值(如1或-1),然后使用实际值。
只有当你想把这个const值绑定到一个特定的类时,我才能创建一个类const或var,或者 - 它不支持那些 - 一个getter类函数。
使其成为(虚拟)getter函数的另一个原因是,后代类需要能够以不同的初始值开始。
编辑(回应评论):
对于涉及复杂计算的初始化,我还会提取出一种计算方法。使该方法成为直接修改字段值的过程(a)或返回应该给出的值的函数(b)的选择将由以下问题驱动:是否需要在其他时间进行计算。 “只是构造函数”。
如果只在构造函数初始化时需要,我更喜欢方法(a)。
如果计算也需要在其他时间进行,我会选择方法(b),因为它也可以将结果分配给其他字段或局部变量,因此可以由后代或其他使用该类的用户不会影响实例的内部状态。
答案 4 :(得分:0)
实际上只有a)方法的行为符合预期(通过分析方法名称)。方法b)在你的例子中应该命名为'return60',或者在一些更复杂的方法中命名为'getXValue'。
在我看来,这两个选项都是正确的。当选择某些设计时,这一切都取决于你的意图。如果你的方法只需要进行初始化,我宁愿a)因为它更简单。如果x值也用于逻辑中的其他地方,使用b)选项可能会导致更一致的代码。
您还应始终清楚地编写方法名称,并使这些名称与实际逻辑相对应。 (在这种情况下,方法b)名称令人困惑。)
答案 5 :(得分:0)
@Frederik,如果你使用选项b)并且你有很多字段变量,那么构造函数将成为一个非常笨重的代码块。有时你会忍不住在一个类中拥有大量的成员变量(例如:它是一个域对象,它的数据来自数据库中非常宽的表)。最实用的方法是根据需要对代码进行模块化。