对象具有属性和方法。每种方法都实现了对象整体目的的一部分。某些类型的方法,如构造函数、getter 和 setter,正在执行属性和对象本身的生命周期管理。其他方法返回对象的状态及其属性。这些方法通常是非无效的。
void 方法有两种形式: 1. 关于对象或属性的生命周期管理。2. 具有在方法内完全处理的输出,并且不应在其他任何地方引起任何状态的变化。
ad 1. 它们属于对象的内部工作。ad 2. 参数的信息用于在方法内执行一些工作。方法完成后,对象本身和参数之一的内部状态都没有变化。
但是为什么你应该让一个方法返回 void 并且为什么不让一个布尔值(成功与否)?方法返回 void(如在 setter 中)的动机是该方法旨在没有副作用。返回 true 或 false 可能是一个副作用。void 表示该方法在按设计执行时没有副作用。返回异常的 void 方法是好的,因为异常不是方法正常处理的副作用。
返回 void 的方法意味着根据定义它是一个孤立的工作方法。void 方法链是松散耦合的方法链,因为没有其他方法可以依赖其前身的结果,因为没有方法有任何结果。有一种设计模式,即责任链设计模式。链接不同的记录器是一个传统的例子,它调用了 servlet api 中的后续过滤器。
以有意义的方式链接 void 方法意味着这些方法在其上工作的共享对象在每个步骤之后处于对对象工作的 void 方法可以理解的状态。所有后续调用不得依赖于其前任的结果,也不会影响其自己调用之后的调用的工作。确保这一点的最简单方法是不让它们更改对象的内部状态(如记录器示例),或者让每个方法更改对象内部状态的另一部分。
在我看来,要链接的无效方法仅是那些具有风味 2 并共享某种处理类型的方法。我不会链接有关类生命周期的 void 方法,因为每个方法都是对象整个状态的不同部分的更改。这些方法的存在会随着类设计的任何变化而随时间而变化,因此我不建议链接这些方法。此外,第一种类型的 void 方法引发的所有异常都是相互独立的,而您可能会期望共享某种处理类型的第 2 类链式 void 方法引发的异常有一些共同点。