最近,在代码审查期间,我遇到了一个新同事写的代码,其中包含带有气味的模式。我怀疑我同事的决定是基于著名的《清洁法规》(也许还有其他类似书籍)提出的规则。
据我了解,类构造函数完全负责创建有效对象,并且其主要任务是分配对象的(私有)属性。当然,可能会通过类构造器以外的方法设置可选属性值,但是这种情况很少见(尽管不一定是错误的,只要类的其余部分都考虑了此类属性的可选性)。这很重要,因为它可以确保对象始终处于有效状态。
但是,在我遇到的代码中,大多数属性值实际上是由构造方法以外的其他方法设置的。计算得出的值被分配给属性,以便在整个类的多个私有方法中使用。作者似乎在使用类属性,好像它们是应在整个类中访问的全局变量一样,而不是将这些值参数化为需要它们的函数。此外,应按特定顺序调用类的方法,因为否则该类不会做很多事情。
我怀疑这段代码是受建议的启发而提出的,即应保持方法简短(<= 5行代码),以避免大的参数列表(<3个参数),并且构造函数一定不能工作(例如执行某种计算)这对于对象的有效性至关重要。
现在,如果可以证明当未按特定顺序调用方法时,可能会出现各种不确定的错误,那么我当然可以反对这种模式。但是,我预测对此的响应将是添加验证,以验证一旦调用需要设置那些属性的方法,就必须设置属性。
但是,我宁愿建议完全更改代码,以使该类成为实际对象的蓝图,而不是应按特定顺序调用(过程上)的一系列方法。
我觉得我遇到的代码有异味。实际上,我相信在何时将值保存在类属性中以及何时将其保存到参数中以供不同方法使用方面存在明显的区别-我真的不相信它们可以彼此替代。我正在寻找这种区别的词。