使用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; }
而前者需要的样板代码要少得多。
DataStructure和Object之间存在差异。
数据结构应该暴露其内部而不是行为。
一个物体不应该暴露其内部,但它应该暴露其行为,这也被称为德米特定律
大多数DTO被认为是一种数据结构,而不是对象。他们应该只公开自己的数据,而不是行为。在数据结构中设置Setter/Getter将暴露行为,而不是其中的数据。这进一步增加了违反德梅特定律的可能性。
鲍勃叔叔在他的《干净的代码》一书中解释了得墨忒耳定律。
有一种著名的启发式方法叫做得墨忒耳定律,它说:模块不应该知道它的对象的内部结构操纵。正如我们在上一节中看到的,对象隐藏其数据并暴露操作。这意味着对象不应公开其通过访问器的内部结构,因为这样做是为了暴露,而不是隐藏其内部结构。更准确地说,德米特定律说C类的方法f应仅调用以下方法:Cf创建的对象作为参数传递给f的对象保存在C的实例变量中的对象该方法不应在任何允许的函数返回的对象上调用方法。换句话说,与朋友交谈,而不是与陌生人交谈。
因此,根据这一点,LoD违规的例子是:
final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();
在这里,函数应该调用它的直接朋友的方法,这里是ctxt,它不应该调用它直接朋友的朋友的方法。但该规则不适用于数据结构。所以在这里,如果ctxt、option、scratchDir是数据结构,那么为什么要用一些行为包装它们的内部数据,并违反LoD。
相反,我们可以这样做。
final String outputDir = ctxt.options.scratchDir.absolutePath;
这满足了我们的需求,甚至没有违反LoD。
灵感来源于Robert C.Martin(Bob叔叔)的“清洁代码”
来自数据隐藏的获取者和设置者。数据隐藏意味着我们正在向外部人员或外部人员/事物隐藏无法访问的数据这是OOP中一个有用的特性。
例如:
如果您创建了一个公共变量,您可以访问该变量并在任何地方(任何类)更改值。但如果创建为私有,则该变量无法在除声明的类之外的任何类中查看/访问。
public和private是访问修饰符。
那么我们如何在外部访问该变量:
这是获得者和获得者的地方。您可以将变量声明为private,然后可以为该变量实现getter和setter。
示例(Java):
private String name;
public String getName(){
return this.name;
}
public void setName(String name){
this.name= name;
}
优势:
当任何人想要访问或更改/设置平衡变量的值时,他/她必须获得许可。
//assume we have person1 object
//to give permission to check balance
person1.getName()
//to give permission to set balance
person1.setName()
您也可以在构造函数中设置值,但稍后需要时要更新/更改值,必须实现setter方法。