gpt4 book ai didi

java - 重构建议 : maps to POJOs

转载 作者:行者123 更新时间:2023-12-04 06:39:30 25 4
gpt4 key购买 nike

我目前是一个项目的一部分,其中有一个这样的界面:

public interface RepositoryOperation {

public OperationResult execute(Map<RepOpParam, Object> params);
}

这个接口(interface)有大约 100 个实现者。

要调用实现者,需要执行以下操作:
final Map<RepOpParam, Object> opParams = new HashMap<RepOpParam, Object>();
opParams.put(ParamName.NAME1, val1);
opParams.put(ParamName.NAME2, val2);

现在我认为 <Something, Object> 的任何内容显然有问题。泛型声明。

目前这会导致调用者 OperationImpl必须实际阅读操作代码才能知道如何构建参数映射。 (这甚至不是最糟糕的问题,但我不想全部引用它们,因为它们相当明显)

经过一番讨论,我设法说服我的同事让我做一些重构。

在我看来,最简单的“修复”是像这样更改界面:
public interface RepositoryOperation {

public OperationResult execute(OperationParam param);
}

毕竟,所有具体操作都将定义(扩展)它们自己的 OperationParam,并且每个人都可以看到所需的参数。 (这是做类似恕我直言的“正常方式”)

因此,正如我所看到的,由于接口(interface)实现者很多,我有几个选择:
  • 尝试更改接口(interface)并重写所有操作调用以使用对象而不是映射。这似乎是最干净的,但我认为由于操作很多,因此在实践中可能工作量太大。 (大约需要 2 周的测试)
  • 向接口(interface)添加一个附加方法,如下所示:
    public interface RepositoryOperation {
    public OperationResult execute(Map<String, Object> params);
    public OperationResult execute(OperationParam params);
    }

    并在功能实现过程中遇到 map 调用时修复它们。
  • 忍受它(请不要!)。

  • 所以我的问题是。

    有没有人看到“修复” map 的更好方法,如果你这样做了,你会用方法 1 或 2 修复它们还是根本不修复它们。

    编辑:
    感谢您的精彩回答。如果可以的话,我会接受 Max 和 Riduidel 的答案,但由于我不能,所以我更倾向于 Riduidel 的答案。

    最佳答案

    我可以看到第三种方式。

    你有一张由 <RepOpParam, Object> 组成的 map .如果我对您的理解正确,那么困扰您的是没有类型检查的事实。显然,这并不理想。但是,可以将类型检查问题从整个参数(您的 OperationParam )移动到单个 RepOpParam .让我解释一下。

    假设您的 RepOpParam接口(interface)(目前看起来像 tagging interface)被修改为:

    public interface RepOpParam<Value> {
    public Value getValue(Map<RepOpParam, Object> parameters);
    }

    然后,您可以通过替换旧调用来更新现代代码
    String myName = (String) params.get(ParamName.NAME1);

    有新的来电
    String myName = ParamName.NAME1.getValue(params);

    明显的附带优势是您现在可以为参数设置默认值,隐藏在其定义中。

    但是,我必须明确指出,这第三种方式只不过是将第二种方式的两个操作合并为一个,尊重旧代码原型(prototype),同时在其中添加新功能。因此,我个人会采用第一种方式,并使用现代对象重写所有“东西”(此外,考虑查看配置库,这可能会引导您找到解决这个问题的有趣答案)。

    关于java - 重构建议 : maps to POJOs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4440198/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com