为什么方法体内的布尔标志是个坏主意?

Why is boolean flag within the method body a bad idea?

假设我有如下内容,其中 DataImporter 是一个用于从文件系统检索数据的实用程序,其中包含子数据导入器,用于根据类别字符串从子文件夹中检索数据:

        List<String> categories = getCategories();
        boolean doesChildImporterExist = false;
        for (String category : categories)
        {
            DataImporter childDataImporter=importer.getChild(category);
            if (childDataImporter != null)
            {
                doesChildImporterExist = true; 
                populateImportedData(childDataImporter.importData());
            }
        }
         if(!doesChildImporterExist)
            populateImportedData(importer.importData());  

我知道另一种选择是构建一个 List 子数据导入器并检查其大小(如果为 0 或不为 0)并基于此使用所需的导入器导入数据。但是,我想了解在这里使用布尔标志有什么问题?

假设上面的代码在一个方法中并且使用 Java 1.7.

当您在方法中使用 boolean 标志作为分支决策器时(不是最好的术语), 您实际上是在利用两种不同方法的功能并将它们粉碎成一种方法。

经常, 更好的解决方案是为共享功能提供一种方法,为超集功能提供第二种方法。

例如:

public DataImporter doYourCategoryStuff()
{
    List<String> categories = getCategories();
    ... blah including the for loop.

    return theDataImporter;
}


public void doAllTheStuffs()
{
    final DataImporter theDataImporter;

    theDataImporter.doYourCategorStuff();

    populateImportedData(theDataImporter.importData());
}

编辑 更重要的是你的代码。

在你的代码中, 布尔标志表示 "I did something to a child importer and need to update parent importer"。 在这种情况下,您将 "identify things to update" 和 "do the update" 粉碎在一起; 分开他们。

考虑这样的事情:

Set<DataImporter> updateSet = new HashSet<>();

for (category for loop)
{
    final DataImporter child = importer.getChild(category);
    if (child != null)
    {
        updateSet.add(child);
        updateSet.add(importer);
    }
}

for (final DataImporter current : updateSet)
{
    current.importData();
}

即使 add(importer)(父级)可能被多次调用, 该集合将只包含每个 DataImporter 的一个实例。 这应该是合理的,即使您没有在 DataImporter 上实现 hashCodeequals,因为父引用将始终相同。