2

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

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();
}

我会创建一个所需操作的列表,并一次完成一个。通过这种方式,很明显可以看出每个操作属于什么逻辑。

这是过度架构吗?以上是我还不知道的现有模式吗?

提前致谢。

4

2 回答 2

4

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

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

我不会说创建类来进行查询和有效性检查会被过度设计,只要它有意义并且可读。正如你所说,你可以有一个List<Action>然后循环调用run()每个方法,然后检查wasSuccessful()每个并根据需要输出信息。

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

于 2012-04-30T06:23:53.867 回答
2

看看简单的早期回报有多干净:

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);
}

我认为这是比创建额外的类结构更好的方法。

于 2012-04-30T10:57:27.263 回答