我有一些数据要用单一方法查询。 它已经到了成为箭头反模式的地步。 它看起来像这样:
void queryData()
{
int masterIndex = getMasterIndex();
if (masterIndex != -1)
{
byte[] pageData = getMasterPage(masterIndex);
if (pageData) != null)
{
Item1 i1 = getItem1(pageData);
Item2 i2 = getItem2(pageData);
if (i1 != null && i2 != null)
{
showResults(i1, i2);
}
}
}
}
想象一下以上但更大。更多的 if 语句和被调用的每个方法都有相当数量的逻辑。
现在我能做的是重构上面的方法,所以所有 if 语句都是肯定的,如果为真则提前返回。
不过,我觉得将每个查询和有效性检查分解到它们自己的类中会更清晰。 每个操作都将继承/实现如下接口(interface):
public interface Action
{
public void run();
public boolean wasSuccessful();
}
我会创建一个所需操作的列表,并一次执行一个操作。 这样很明显可以看出每个 Action 属于什么逻辑。
这是过度架构了吗?以上是我还不知道的现有模式吗?
提前致谢。
最佳答案
我将从滥用您的 IDE(如果有的话)的“提取方法”功能开始,将每个逻辑分支提取到它自己的方法中。这样您就可以使代码更具可读性。
您可能希望先开始编写单元测试,以确保重构的结果不会破坏或更改代码本身的业务逻辑。一旦您重构为更小的方法并确信代码仍能按最初的预期工作,您就可以查看是否可以创建类并将代码提取到其中。
我不会说创建类来进行查询和有效性检查会过度设计,只要它有意义且可读即可。正如你所说,你可以有一个 List<Action>
然后循环调用 run()
每个方法,然后检查wasSuccessful()
在每个上并根据需要输出信息。
这样,如果您想要更改给定操作的验证或查询,只需更改封装功能的类,而不必更改实际的执行代码。
关于java - 重构箭头反模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10379036/