Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重构箭头反模式_Java_Refactoring - Fatal编程技术网

Java 重构箭头反模式

Java 重构箭头反模式,java,refactoring,Java,Refactoring,我用一个方法查询一些数据。 它已经到了成为箭头反模式的地步。 它看起来像这样: void queryData() { int masterIndex = getMasterIndex(); if (masterIndex != -1) { byte[] pageData = getMasterPage(masterIndex); if (pageData) != null) { Item1 i1 =

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

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语句都为正,如果为真,则提前返回

不过,我觉得将每个查询和有效性检查分解到它们自己的类中会更干净。 每个操作都将继承/实现如下接口:

public interface Action
{
    public void run();
    public boolean wasSuccessful();
}
我将创建一个所需操作的列表,并逐一运行。 通过这种方式,很明显可以看出每个动作的逻辑是什么

这是过度设计的吗?以上是我不知道的现有模式吗


提前谢谢

首先,我会滥用IDE的“Extract Method”功能(如果它有)并将每个逻辑分支提取到自己的方法中。这样可以使代码更具可读性

您可能希望首先编写一个单元测试,以确保重构的结果不会破坏或更改代码本身的业务逻辑。一旦您重构成更小的方法,并且确信代码仍然按照最初的预期工作,那么您就可以查看是否可以创建类并将代码提取到这些类中

我不会说创建类来进行查询和有效性检查会过于复杂,只要它有意义并且可读。正如您所说,您可以有一个
列表
,然后在每个上循环调用
run()
方法,然后在每个上检查
wassuctive()
,并根据需要输出信息


这样,如果您想要更改给定操作的验证或查询,您只需更改封装功能的类,而不必更改实际执行代码。

只需提前返回,就可以看到它有多干净:

void queryData()
{
    int masterIndex = getMasterIndex();
    if (masterIndex == -1) 
        return;
    byte[] pageData = getMasterPage(masterIndex);
    if (pageData == null)
        return;
    Item1 i1 = getItem1(pageData);
    Item2 i2 = getItem2(pageData);
    if (i1 == null || i2 == null)
        return;
    showResults(i1, i2);
}

我认为这是一种比创建附加类结构更好的方法。

我不会使用单独的类,除非您打算从继承中获得一些真正显著的好处。很多类的缺点是很难看到全局。另一个要考虑的重构是在同一个类中分解成多个方法。如果您正在使用Swing(或者将来在这个项目中),命名接口<代码>动作< /代码>可能不是一个好主意,因为有一个内置的接口作为Swing的一部分。不过有90多行。我还是觉得这个方法太单一了。我想下一步是将方法分解为多个子方法,如果它仍然太长,那么至少这种重构会使它处于更“可切片”的状态;多方法提取可能是下一步的最佳选择。或者,您可以将该方法移动到一个新类中,并生成所有(或部分)局部变量、字段;然后,这些方法更容易提取。