使用getter和setter(只获取和设置)而不是简单地为这些变量使用公共字段有什么好处?
如果getter和setter所做的不仅仅是简单的get/set,我可以很快地解决这个问题,但我不是100%清楚如何做到:
public String foo;
比:
private String foo;
public void setFoo(String foo) { this.foo = foo; }
public String getFoo() { return foo; }
而前者需要的样板代码要少得多。
它可以用于延迟加载。假设所讨论的对象存储在数据库中,除非您需要,否则您不想获取它。如果该对象由getter检索,则内部对象可以为空,直到有人请求它,然后您可以在第一次调用getter时获取它。
我在交给我的一个项目中有一个基本页面类,它从几个不同的web服务调用加载一些数据,但这些web服务调用中的数据并不总是用于所有子页面。Web服务具有所有的优点,它开创了“慢”的新定义,因此如果不需要,您不想进行Web服务调用。
我从公共字段转到getter,现在getter检查缓存,如果缓存不存在,则调用web服务。因此,通过一点包装,许多web服务调用被阻止了。
因此,getter使我不必在每个子页面上找出我需要什么。如果我需要它,我打电话给吸气器,如果我还没有,它会帮我找到它。
protected YourType _yourName = null;
public YourType YourName{
get
{
if (_yourName == null)
{
_yourName = new YourType();
return _yourName;
}
}
}
它可以用于延迟加载。假设所讨论的对象存储在数据库中,除非您需要,否则您不想获取它。如果该对象由getter检索,则内部对象可以为空,直到有人请求它,然后您可以在第一次调用getter时获取它。
我在交给我的一个项目中有一个基本页面类,它从几个不同的web服务调用加载一些数据,但这些web服务调用中的数据并不总是用于所有子页面。Web服务具有所有的优点,它开创了“慢”的新定义,因此如果不需要,您不想进行Web服务调用。
我从公共字段转到getter,现在getter检查缓存,如果缓存不存在,则调用web服务。因此,通过一点包装,许多web服务调用被阻止了。
因此,getter使我不必在每个子页面上找出我需要什么。如果我需要它,我打电话给吸气器,如果我还没有,它会帮我找到它。
protected YourType _yourName = null;
public YourType YourName{
get
{
if (_yourName == null)
{
_yourName = new YourType();
return _yourName;
}
}
}
代码不断演变。private非常适合需要数据成员保护的情况。最终,所有的类都应该是一种“小程序”,它有一个定义良好的接口,你不能只使用它的内部结构。
也就是说,软件开发并不是要设置课程的最终版本,就好像你在第一次尝试时按下了一些铸铁雕像一样。当你使用它时,代码更像粘土。它随着你的发展而发展,并进一步了解你正在解决的问题领域。在开发过程中,类之间可能会发生不应有的交互(您计划排除的依赖关系)、合并或拆分。因此,我认为争论归结为人们不想虔诚地写作
int getVar() const { return var ; }
所以你有:
doSomething( obj->getVar() ) ;
而不是
doSomething( obj->var ) ;
getVar()不仅在视觉上很嘈杂,而且给人一种错觉,认为getingVar(()在某种程度上是一个比实际更复杂的过程。如果你的类有一个passthrough setter,那么你(作为类编写者)如何看待var的神圣性对你的类的用户来说尤其令人困惑——那么你似乎在设置这些门来“保护”你坚持认为有价值的东西,(var的神圣性)但即使你承认,任何人只要进来并将var设置为他们想要的任何值,而你甚至不去偷看他们在做什么,那么var的保护就没有多大价值。
所以我按如下方式编程(假设采用“敏捷”类型的方法——即当我编写代码时不知道它将要做什么/没有时间或经验来规划一个复杂的瀑布式界面集):
1) 从具有数据和行为的基本对象的所有公共成员开始。这就是为什么在我所有的C++“示例”代码中,你会注意到我到处使用结构而不是类。
2) 当对象对数据成员的内部行为变得足够复杂时(例如,它喜欢以某种顺序保存内部std::list),就会编写访问器类型函数。因为我是自己编程的,所以我并不总是立即将成员设置为私有,但是在类的进化过程中,成员将被“提升”为受保护或私有。
3) 完全充实并对其内部有严格规则的类(即,它们确切地知道自己在做什么,你不能“操”(技术术语)它的内部)被赋予类名称,默认为私有成员,只有少数成员被允许公开。
我发现这种方法可以让我避免在一个类进化的早期阶段,当大量数据成员被迁移、转移等时,坐在那里虔诚地编写getter/setter。