gpt4 book ai didi

java - 如何在大型遗留项目中将 String id 重构为 class Id?

转载 作者:行者123 更新时间:2023-12-02 10:30:27 27 4
gpt4 key购买 nike

在这个大型遗留项目中,有一个核心类 MyObject,它有一个 ID 属性,该属性已被编码为字符串。在整个项目的任何地方都可以访问此 ID。

public class MyObject {
private String id;

public String getId(){
return id;
}
}

我正在考虑使用以下方法将此 String 属性重构为类型类 Id 的可能性:

class Id implements Comparable<Id> {
String value
Id(String value)
String getValue()
int hashCode()
boolean equals(Object obj)
int compareTo(Id o)
String toString()
}

在重构时,我需要记住,虽然我可以以任何方式重构我们自己的项目,但有些客户使用该项目的 API,并且更改最好应该向后兼容。目前 String ID 的内部用法是:

  • 获取对象 ID,将其存储在变量中并稍后对其进行一些比较
  • 创建列表或设置并向其中添加对象 ID,或检查 ID 是否已包含(无需自定义比较器)
  • 将对象 ID 与字符串值(例如用户输入)进行比较,有时使用 equals(),有时使用 equalsIgnoreCase()
  • 比较两个对象 ID

具体来说,我想做的是:

  • 将 ID 类型从 String 重构为 Id
  • 将当前方法 String getId() 重构为 Id getUniqueID()
  • 如果直接使用 id.equals("String")id.equalsIgnoreCase("String") 将 ID 与字符串进行比较,请将其更改为 id.equals(new Id("String"))
  • 添加一个新方法(使用旧名称)String getId(),该方法将返回 getUniqueID().getValue()。这是为了向后兼容依赖于旧字符串 ID 的客户代码。

当然,我可以列出该属性的所有用法、它的 getter 和 setter,然后手动替换它们。有时,我可能可以使用正则表达式,但这可能不是一个好主意。此外,这简直令人望而生畏,因为有 500 多种用法需要在几十个类(包括子类)中进行编辑。

我看过IDEA的refactor: type migrate功能,但是好像做不到。我通常不在IDEA中工作,所以我可能做错了什么,但它告诉我有几百个冲突,并且它无法转换的列表相当长。

看起来我无法提供旧 getter getId() 到新 getUniqueID().getValue() 的映射,例如

myObject.getId().equalsIgnoreCase("test")

需要映射到

myObject.getUniqueID().getValue().equals(new Id("test"))

我想这种重构应该会相当流行,但到目前为止,我似乎必须主要通过手动和搜索+替换来完成。

有没有一种自动化的方法可以做到这一点?也许,一些重构工具可以指定旧的使用模式如何映射到新的使用模式?

最佳答案

一个简单的解决方案,用于向后兼容,不需要重大重构:

@Deprecated
String getId() { return getUniqueID().getValue(); }

ID getUniqueID() {
//TODO
}

仅在必要且具有明显好处的情况下手动编辑 getId().getValue().equals("test") 出现次数。

关于java - 如何在大型遗留项目中将 String id 重构为 class Id?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53644534/

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