假设我们有工厂特性
trait Factory {
def createObject(paramA, paramB)
}
现在我们已经在运行时选择了Factory - FactoryV1和FactoryV2的实现。 FactoryV2使用两个参数创建对象,而FactoryV1仅使用paramA。因此,当我们调用FactoryV1的createObject方法时,我们在paramB中传递一个不必要的参数。传递额外参数有多糟糕?一些替代方案:
改进它的一种方法是将paramB作为Scala选项,并根据所使用的工厂,我们为FactoryV1.createObject传递None
,为FactoryV2.createObject传递Some
。
另一种选择是在基本特征中有两个方法,一个只有paramA,另一个有两个参数。根据所使用的工厂(V1或V2),我们使用1/2参数调用适当的方法(虽然我没有看到非常干净的方法)。
还有什么其他选择?我倾向于为工厂的所有实现中不需要的那些参数提供具有选项参数的单一工厂方法。
基本上,当Factory实现不需要Factory方法的所有参数时,我们该怎么做?
答案 0 :(得分:0)
我说这一切都取决于您需要如何处理缺少第二个参数的地方。
val factory: Factory = new FactoryV2 // this is the one that needs both params to create an object
// Assuming signature createObject(param1, param2 = default)
// if you use default parameter, is it ok to create an object with default value? THis may be difficult to notice.
factory.createObject(param1)
// Assuming signature createObject(param1, Option[param2])
// Is it ok to fail when second param not supplied?
factory.createObject(param1, None)
根据所需的语义选择解决方案。