-
30-09-2020 - |
题
我刚开始编写一些新类,突然想到我添加了许多并非严格需要的方法参数。这是为了避免在类中具有特定于某些方法调用的状态,而不是类的一般配置或依赖项。
这样做意味着许多可能没有参数的方法以一个、两个或三个结尾。
我想听听您对这种权衡的看法,以及您如何决定在什么情况下采用哪种方法?
由于在描述代码时代码通常比英语更容易理解,因此我创建了一个包含两种变体的小要点:https://gist.github.com/JeroenDeDauw/6525656
解决方案
由于您的示例中唯一外部可见的方法是 updateTable
,因此我认为使用字段而不是方法参数很好。
如果这是一个更通用的类(例如 TableTools
)的一部分,我会将需要状态的辅助方法移动到隐藏的内部类中。
伪代码示例:
class TableTools {
...
public void updateTable(currentTable, newTable) {
TableUpdater u = new TableUpdater(schemaModifier, currentTable, newTable);
u.removeRemovedFields();
u.addAddedFields();
}
private class TableUpdater { ... }
}
这样,您可以避免仅由一种公共方法使用的字段。此外,代码是线程安全的,因为每次调用 updateTable 都使用自己的 TableUpdater 副本,因此也使用 TableUpdater 的实例变量。
其他提示
使用字段可以为使用这些字段的方法提供多线程功能。
从可重用性和可维护性的角度来看,使用这样的字段仅比使用全局变量好一点,这里的关键点是复杂的设置需要仔细和最新的文档,以了解哪些方法使用和/或破坏哪些字段;使用参数时不需要做的事情。
用外行的话来说:
- 方法应该有尽可能少的参数(Martin's Clean Code)
- 对象的特征之一是它们可以(并且应该)具有状态
- 不对对象状态进行操作的非静态方法,即接收所有内容作为参数,没有内聚性
- 非内聚方法也可以设为静态并在实用程序类中分组
同样,在我看来,非内聚方法属于实用程序类,而不属于具有域名的类。
在当前情况下不要使用字段!同时使用对象的两个“线程”会严重混淆对方。它们也不必是真实的、单独的线程(因此是引号)。如果您为一个表设置对象,然后调用将其用于另一个表的方法,然后尝试使用原始设置,则有问题。暂时坚持参数。
您在这里要做的是创建一个仅在一种情况下使用的新更新程序类。原始类可以有一个在需要时创建实例的方法。新类将具有字段。你拥有两全其美。有时仅坚持使用参数会更简单,但是在您的示例中,您已经到达了一个单独的类会更好的地方。
我认为,选择应该根据实际情况,如您所见。如果一个项目属于一个实例,它应该被视为它的字段。如果项目在实例外部,则应将其作为方法参数传递。
在这种情况下,我们不应该以有效性(无论如何差异微不足道)或(上帝保佑!)易于打字为指导,而是以代码的可理解性和自然性为指导。
在我看来,如果你正在编写对某事做某事的代码,那么它应该采用参数来定义它应该对它们做什么,并且它的名称应该尽可能地定义它对它做什么。
如果您正在编写将要执行的操作打包的代码,那么您应该将应该执行的操作包装在一个对象中,并将它们传递给您执行某些操作的事物。
然后,此操作将成为对第一个方法的调用的一种元描述,然后您可以在以后通过排队或什至出于某种原因决定根本不这样做来执行它。
所以你的问题转化为它是一个Action还是一个Function ?一个动作可以被推迟或取消,因此应该封装它所作用的内容。一个函数会立即发生,因此不需要顶部保留它的参数。
您可以撤消和操作,但不能使用Function 。