伪代码在JavaScript中。我有一个类Animal
和方法typeMatches
,它使用包含动物类型的私有变量_type
:
function Animal()
{
this._type = "dog";
}
Animal.prototype.getAnimalType = function()
{
return this._type;
}
Animal.protytype.typeMatches = function(animalType)
{
//option 1 - accessing private variable directly
return this._type === animalType;
//option 2 - accessing private through public method
return this.getAnimalType() === animalType; //accessing private through public method
}
我总是直接在类中使用私有变量(选项1),但最近我被告知这是一个不好的做法,我应该使用公共方法来获取私有变量,只要我有机会这样做(选项) 2)。但我质疑这个建议的理由是变量是私有的,我在类中使用它,所以我没有违反任何约定,而直接访问使我的代码更清晰。我错了吗?
答案 0 :(得分:3)
在绝对需要时(尽可能避免使用它)。
getter的唯一任务是返回数据,可能是在转换之后使其更容易使用。
例如支持字段
long _ticks = 500000000000L;
可以有一个吸气剂
public long GetTicks()
{
return _ticks;
}
确实正确的是,在这种情况下,使用支持字段和吸气剂之间没有区别。但是,使用getter的问题在于,您现在正在使外部和对数据的内部表示形式保持不变。
我们可以非常轻松地表达这是一个问题:如果我们想将_ticks
作为string
返回外部世界会怎样?现在我们拥有来破坏内部功能,否则我们就无法像公共界面那样改变普通的东西。
确实:我们试图通过封装我们的私有字段来完成的事情现在已经破坏,因为您将尝试在内部功能中使用外部表示。
此代码现在将破坏我们类中的其他代码,这些代码依赖于传递数字类型而不是string
。
public string GetTicks()
{
return _ticks.ToString();
}
在非常非常少的情况下,我会提倡在课堂内使用一个吸气剂(如@ Noel' s GetAge()
这样的计算字段),如果我这样做的话,那就是#39 ;因为它是最后一个可行的选择。保持内部和外部表示分离,这将使您免于头痛。
(我对Javascript不是很熟悉,但我相信代码示例已经足够清楚了。我意识到Javascript不太关心确切的类型,但这仅仅是一个例子:有许多不同类型的转换可能。)子>
答案 1 :(得分:1)
作为@Jeroen Vannevel pointet,它只是"必不可少的"如果获取/设置背后有一些逻辑。
例如,如果您有两个属性:
1)BirthYear:
2)年龄
最简单的方法是在设置BirtYear时计算年龄。 你可以做1个setter来为每个属性设置两个属性和2个getter。
人们建议您始终使用getter / setter的原因是您的代码中始终具有相同的结构,并且永远不会破坏任何功能改变一个吸气剂/二传手。另外您在访问属性和功能时不必区分(您只有函数)
我用em'几乎总是。它更加一致。