gpt4 book ai didi

java - 重构建议和工具

转载 作者:行者123 更新时间:2023-11-30 07:36:29 27 4
gpt4 key购买 nike

我有一些代码包含很多(数百个 LOC)丑陋的条件,即

SomeClass someClass = null;

if("foo".equals(fooBar)) {
// do something possibly involving more if-else statments
// and possibly modify the someClass variable among others...
} else if("bar".equals(fooBar)) {
// Same as above but with some slight variations
} else if("baz".equals(fooBar)) {
// and yet again as above
}
//... lots of more else ifs
} else {
// and if nothing matches it is probably an error...
// so there is some error handling here
}

// Some code that acts on someClass
GenerateOutput(someClass);

现在我有了重构这类代码的想法:

abstract class CheckPerform<S,T,Q> {
private CheckPerform<T> next;
CheckPerform(CheckPerform<T> next) {
this.next = next;
}

protected abstract T perform(S arg);
protected abstract boolean check(Q toCheck);

public T checkPerform(S arg, Q toCheck) {
if(check(toCheck)) {
return perform(arg);
}

// Check if this CheckPerform is the last in the chain...
return next == null ? null : next.checkPerform();
}
}

并且为每个 if 语句生成一个 CheckPerform 的子类,例如

class CheckPerformFoo extends CheckPerform<SomeInput, SomeClass, String> {
CheckPerformFoo(CheckPerform<SomeInput, SomeClass, String> next) {
super(next);
}

protected boolean check(String toCheck) {
// same check as in the if-statment with "foo" above"
returs "foo".equals(toCheck);
}

protected SomeClass perform(SomeInput arg) {
// Perform same actions (as in the "foo" if-statment)
// and return a SomeClass instance (that is in the
// same state as in the "foo" if-statment)
}
}

然后我可以将不同的 CheckPerforms 注入(inject)彼此,以便进行相同的检查顺序并采取相应的操作。在原来的类中,我只需要注入(inject)一个 CheckPerform 对象。这是解决此类问题的有效方法吗?我项目中的类数量可能会激增,但至少我会得到更多模块化和可测试的代码。我应该以其他方式执行此操作吗?

因为这些 if-else-if-...-else-if-else 语句是我所说的代码库的反复出现的主题,所以我想尽可能自动地进行重构。那么我可以使用什么工具来自动化呢?

a) 我错过了隐藏在 IDE 某处的一些可自定义的重构功能(最好是在 Eclipse 或 IDEA 中)b) 一些可以解析 Java 代码并为我提供细粒度转换控制的外部工具c) 我应该使用 Scala 自己破解它吗?d) 我是否应该手动检查每个类并使用我在 IDE 中熟悉的功能进行重构?

理想情况下,重构的输出还应该包括一些我可以运行的基本测试代码模板(最好还有原始代码的测试用例,可以在新旧代码上运行,作为一种回归测试……但是我稍后离开)。

感谢您的任何意见和建议!

最佳答案

您描述的是 Chain of Responsibility Pattern这听起来像是您重构的不错选择。这可能有一些缺点。

  • 可读性 因为您将使用 spring 或类似工具注入(inject) CheckPerformers 的顺序,这意味着很难一眼看出代码实际会做什么。<
  • 维护 如果有人在您之后想要添加一个新条件,以及添加一个全新的类,他们还必须编辑一些 spring 配置。选择正确的位置添加新的 CheckPerformer 可能很困难且容易出错。
  • 许多类 根据您有多少条件以及在这些条件下有多少重复代码,您最终可能会得到很多新类。尽管 if else 的长列表非常漂亮,但它的逻辑在一个地方,这再次有助于提高可读性。

关于java - 重构建议和工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3554867/

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