我在《The Pragmatic programmer》中读到了这条建议。这本书,但我不懂。
如果您需要更改对象的状态,请获取要更改的对象你。
对象状态的含义是什么,如何让对象自己去做?
考虑这个Person
类:
class Person {
private String firstName;
private String lastName;
private Integer age;
public void Person(String firstName, String lastName, Integer age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
public void changeName(String newName, String lastName) {
this.firstName = newName;
this.lastName = lastName;
}
public void celebrateBirthday() {
this.age += 1;
}
}
对象状态的含义
对象的状态是其字段的值。在上面的Person
类中,如果创建了一个实例:
Person john = new Person("John", "Smith", 42);
则john
对象当前的状态为firstName="John"
、lastName="Smith"
和age=42
和如何让对象做它自己?
这是流行的OOP格言"告诉,不要问"的另一种措辞。(如果你想的话,你可以在谷歌上搜索到很多点击)。
OOP的主要目标之一是尝试和最小化可变数据的范围。实现这一点的方法之一是将数据隐藏在类中,并且只允许该类上选定数量的公共方法对数据进行修改。在上面的Person
类中,改变其状态的唯一方法是通过公共方法changeName
和celebrateBirthday
。当您在对象上调用导致该对象状态发生变化的方法时,例如
john.celebrateBirthday(); // John is now one year older!
你正在"让对象自己做"通过调用对象的一个方法。
这与不是要求对象自己通过从其他地方直接改变john
的状态形成对比,例如:
public main() {
Person john = new Person("John", "Smith", 42);
// Celebrate birthday. Just for demonstration. Doesn't actually work.
john.age += 1;
}
通过减少可变变量的作用域,并使用&;tell, don't ask&;请记住,您通常会使您的程序更容易推理,并且在需要时可能会进行调试。