我应该使用公共方法来访问类中的私有变量吗?

时间:2014-06-04 14:24:43

标签: javascript oop encapsulation

伪代码在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)。但我质疑这个建议的理由是变量是私有的,我在类中使用它,所以我没有违反任何约定,而直接访问使我的代码更清晰。我错了吗?

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'几乎总是。它更加一致。