java - 重构箭头反模式

标签 java refactoring

我有一些数据要用单一方法查询。 它已经到了成为箭头反模式的地步。 它看起来像这样:

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/

相关文章:

refactoring - 用多态替换条件 - 理论上很好但不实用

c# - 使用 Action 字典而不是 switch 语句

java - Web服务项目的重构

oop - 如何使重构更少 "destructive"?

java - 使用坐标在网格中查找图 block

java - 如何获取 JPopupMenu 的尺寸?

java - 如何在类路径中为 ant 脚本添加一个文件夹?

architecture - 在敏捷开发中,您如何处理 "less-well-architected"代码,这些代码源于以 sprint 为中心的心态

java - android以编程方式删除旧的缓存数据

java - 使用 Argparse4j 的命令行参数设置标志