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

Java 为什么方法体中的布尔标志是个坏主意?,java,oop,java-7,Java,Oop,Java 7,假设我有如下内容,DataImporter是一个从文件系统检索数据的实用程序,其中包含子数据导入器,用于根据类别字符串从子文件夹检索数据: List<String> categories = getCategories(); boolean doesChildImporterExist = false; for (String category : categories) { DataImport

假设我有如下内容,
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 categories=getCategories();
布尔值doesChildImporterExist=false;
用于(字符串类别:类别)
{
DataImporter-childDataImporter=importer.getChild(类别);
如果(childDataImporter!=null)
{
doesChildImporterExist=真;
populateImportedData(childDataImporter.importData());
}
}
如果(!doesChildImporterExist)
populateImportedData(importer.importData());
我知道另一个选项是构建子数据导入器的
列表
,并检查其大小(如果大小为0或否),并基于此使用所需的导入器导入数据。然而,我试图理解在这里使用布尔标志的错误是什么


假设上面的代码在一个方法中,当您在一个方法中使用
boolean
标志作为分支决策器(不是最好的术语)时,使用
Java1.7

, 实际上,您正在使用两种不同方法的功能,并将它们分解为一种方法

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

例如:

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());
}
public DataImporter doYourCategoryStuff()
{
列表类别=getCategories();
…废话,包括for循环。
返回数据导入器;
}
公共空间无效
{
最终数据导入器数据导入器;
数据导入器。doYourCategorStuff();
填充导入数据(dataimporter.importData());
}
编辑 在你的代码中有更多的要点

在代码中, 布尔标志表示“我对子导入器做了一些操作,需要更新父导入器”。 在这种情况下,您将“确定要更新的内容”和“执行更新”结合在一起; 把他们分开

考虑一下这样的情况:

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();
}
Set updateSet=new HashSet();
for(循环类别)
{
最终数据导入器子项=importer.getChild(类别);
if(child!=null)
{
updateSet.add(子级);
updateSet.add(导入程序);
}
}
对于(最终数据导入器当前:更新集)
{
current.importData();
}
即使可以多次调用
添加(导入器)
(父项), 该集合将只包含每个
DataImporter
的一个实例。
这应该是合理的,即使你没有在
DataImporter
上实现
hashCode
equals
,因为父引用总是一样的。

谁说这是个坏主意?我的评论中有一些评论。如果你知道你在做什么,这个标志本身也不错。但是如果你用它来拥有巨大的功能块。我认为这是不好的。在您的示例中,当
if(childDataImporter!=null)
会做同样的事情时,为什么要使用布尔值?布尔值和真值不同步也不会有bug的危险。@slim但是
childDataImporter
在循环之外是不可用的。我想我大致了解了您所传达的内容,但是在这种情况下
doYourCategorStuff()
如何在不引入更多私人助手方法的情况下摆脱布尔值?好的,我重新阅读了您的示例代码。
布尔值
示例代码不是参数。我的答案与布尔参数有关。