我目前参与的一个项目有一个这样的界面:
public interface RepositoryOperation {
public OperationResult execute(Map<RepOpParam, Object> params);
}
该接口有大约 100 个实现者。
要调用实施者,需要执行以下操作:
final Map<RepOpParam, Object> opParams = new HashMap<RepOpParam, Object>();
opParams.put(ParamName.NAME1, val1);
opParams.put(ParamName.NAME2, val2);
现在我认为任何带有 a 的东西显然都有问题<Something, Object>
通用声明。
目前,这会导致调用者OperationImpl
必须实际阅读操作代码才能知道如何构建参数映射。 (这甚至不是最糟糕的问题,但我不想全部引用,因为它们相当明显)
经过一番讨论,我设法说服同事让我进行一些重构。
在我看来,最简单的“修复”就是更改界面,如下所示:
public interface RepositoryOperation {
public OperationResult execute(OperationParam param);
}
毕竟,所有具体操作都将定义(扩展)自己的操作参数,并且所需的参数对每个人都可见。 (恕我直言,这是做类似事情的“正常方式”)
因此,在我看来,由于接口实现者非常多,我有几种选择:
尝试更改接口并重写所有操作调用以使用对象而不是映射。这看起来是最干净的,但我认为由于操作很多,实践中可能工作量太大。 (大概需要 2 周的测试)
-
向接口添加一个附加方法,如下所示:
public interface RepositoryOperation {
public OperationResult execute(Map<String, Object> params);
public OperationResult execute(OperationParam params);
}
并在功能实现过程中每当遇到地图调用时修复它们。
忍受它(请不要!)。
所以我的问题是。
有没有人看到更好的“修复”地图的方法,如果你这样做了,你会用方法 1 或 2 修复它们,或者根本不修复它们。
EDIT:感谢您的精彩回答。如果可以的话,我会接受Max和Riduidel的答案,但由于我不能,所以我更倾向于Riduidel的答案。