重构建议:映射到 POJO

2024-01-01

我目前参与的一个项目有一个这样的界面:

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);  
}

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

因此,在我看来,由于接口实现者非常多,我有几种选择:

  1. 尝试更改接口并重写所有操作调用以使用对象而不是映射。这看起来是最干净的,但我认为由于操作很多,实践中可能工作量太大。 (大概需要 2 周的测试)

  2. 向接口添加一个附加方法,如下所示:

    public interface RepositoryOperation {
        public OperationResult execute(Map<String, Object> params);
        public OperationResult execute(OperationParam params);  
    }
    

    并在功能实现过程中每当遇到地图调用时修复它们。

  3. 忍受它(请不要!)。

所以我的问题是。

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

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


我可以看到第三条路。

你有一张由以下材料制成的地图<RepOpParam, Object>。如果我理解正确的话,让你烦恼的是没有类型检查。显然,这并不理想。但是,可以将类型检查问题从整个参数(您的OperationParam) 对个人RepOpParam。让我解释一下。

假设你的RepOpParam界面(目前看起来像一个标签接口 http://c2.com/cgi/wiki?TagInterface) 被修改为:

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

然后,您可以通过替换旧的调用来更新现代代码

String myName = (String) params.get(ParamName.NAME1);

有新的电话

String myName = ParamName.NAME1.getValue(params);

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

然而,我必须澄清,第三种方法只不过是一种将第二种方法的两个操作合并为一个的方法,尊重旧的代码原型,同时在其中添加新的功能。因此,我个人会采用第一种方法,并使用现代对象重写所有“东西”(此外,考虑查看配置库,这可能会给您带来对此问题的有趣答案)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重构建议:映射到 POJO 的相关文章

随机推荐

  • 扫描仪永远不会关闭

    我正在开发一款游戏 但我的扫描仪遇到了一些小问题 我得到了一个从未关闭的资源泄漏扫描仪 但我以为我的扫描仪之前可以工作而没有关闭它 但现在不是了 有人可以帮我吗 import java util Scanner public class M
  • Alembicbulk_insert 到带有模式的表

    我正在看这个例子批量插入 https alembic readthedocs org en rel 0 1 ops html alembic op bulk insert Create an ad hoc table to use for
  • 使用 psycopg2 连接到 Google Cloud SQL Postgres 实例

    我正在尝试使用 psycopg2 连接到 Google Cloud SQL Postgres 我创建了一个 postgreSQL 实例并使用默认数据库postgres目前 我可以从 pgadmin 工具以及 gcloud shell 进行连
  • PHP HTML 到 PDF 按比例转换 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在使用 PHP MySQL 和
  • 使用 CodeIgniter 通过 Google 帐户发送电子邮件

    我正在尝试使用 CodeIgniter 发送电子邮件smtp googlemail com 代码没有问题 但 Google 阻止我发送该电子邮件 这是我在 Google 帐户上收到的电子邮件 第三方最近尝试使用应用程序连接到您的 谷歌帐户
  • 使用管道屏障代替信号量

    我想确保我正确理解管道障碍 因此 只要第二个屏障的源阶段晚于第一个屏障的目标阶段 屏障就能够同步两个命令缓冲区 它是否正确 当然 如果命令缓冲区在管道的不同迭代期间执行 我将需要使用信号量 在我看来 同步是 Vulkan 中最难掌握的部分
  • ./configure --enable-shared 在 python altinstall 期间到底做了什么?

    当我使用 altinstall python 2 7 12 时 configure prefix opt python enable shared 它显示为 python 2 7 5 系统默认 python 但没有 启用共享 它显示为 2
  • 使用 data.table 查找重叠间隔组

    我有多个间隔 需要找到哪些间隔可以形成一个连续的组 在此 MWE 中 我有 Interval id Interval start 和 Interval end 我想计算 Wanted column DT lt data table Inte
  • Android:以编程方式创建滑动手势事件

    我一直试图在谷歌上找到这个特定案例的答案 但令人惊讶的是在任何地方都找不到它 只有关于检测的答案 而不是关于创建 滑动的答案 我想在屏幕上实际 运行 从右到左的模拟滑动 无论在哪里 但最好是从右边缘到左 我尝试了类似的方法 但我得到了 NP
  • Sed - 替换每行最后出现的匹配项

    所以我有以下文件 Carlton 3053 Carlton North 3054 Docklands 3008 East Melbourne 3002 Flemington 3031 Kensington 3031 Melbourne 30
  • ios9 中日期选择器不正确

    早上好 我在 ios 9 swift 2 中的日期选择器有问题 this is how my datepicker looks like in ios 8 swift 2 OK and this is my datepicker in io
  • 从 QuickTime MOV 文件解析 h.264 NAL 单元

    我正在尝试从 iPhone 上的 MOV 文件获取 h 264 NAL 单位 以便将 RTP h 264 视频从 iPhone 摄像头传输到服务器 Apple 的 API 不允许直接访问来自相机输出的编码比特流 因此我只能在写入 MOV 文
  • 在 EF4 中使用 NOLOCK 提示?

    我们正在评估 EF4 我的 DBA 说我们必须在所有 SELECT 语句中使用 NOLOCK 提示 因此 我正在研究如何在使用 EF4 时实现这一点 我读过关于如何在 EF4 中实现这一点的不同想法 但所有这些似乎都是一种变通方法 并未得到
  • 验证..让我发疯

    每次我运行我的应用程序 设备或模拟器是相同的 即使没有对代码进行任何更改 我也会从最大的 Activity 中得到每个方法 W art Verification of void com xyz abx setCredit boolean t
  • Python XML 解析网站

    我正在尝试从网站解析 我被困住了 我将在下面提供 XML 它来自一个网站 我有两个问题 从网站读取 xml 的最佳方法是什么 然后我在挖掘 xml 以获得我需要的速率时遇到了麻烦 我需要返回的数字是 Base OBS VALUE 0 12
  • 在 R 中创建桑基图;使绘图输出可解释

    我第一次使用 R 创建桑基图 显示前因事件和后继事件之间的联系以及它们发生的次数 这是我正在使用的数据类型的模拟示例 df creation df lt structure list Antecedent c Activity 1 Acti
  • 如何减少内存使用并加快代码速度

    我正在使用包含 5 列和超过 9000 万行的庞大数据集 该代码对于部分数据工作正常 但是当涉及到整个数据时 我得到了内存错误 我读过有关生成器的内容 但它对我来说似乎非常复杂 我可以根据这段代码得到解释吗 df pd read csv D
  • PowerShell - 在远程计算机上执行脚本时出现错误

    以下内容对我不起作用 WINDIR System32 WindowsPowerShell v1 0 powershell exe NoProfile Noninteractive command Invoke Command Compute
  • Android Honeycomb 中的操作栏样式

    我想使用主题和样式设置操作栏 蜂窝 的背景 你可以用代码来完成ActionBar setBackgroundDrawable Drawable 但是找不到对应的样式属性 我尝试过使用这个主题和风格Activity 但这会
  • 重构建议:映射到 POJO

    我目前参与的一个项目有一个这样的界面 public interface RepositoryOperation public OperationResult execute Map