代码之家  ›  专栏  ›  技术社区  ›  linuxNoob

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

  •  1
  • linuxNoob  · 技术社区  · 7 年前

    假设我有如下内容,其中 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或否),并在此基础上使用所需的导入器导入数据。然而,我试图理解在这里使用布尔标志有什么错?

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

    1 回复  |  直到 7 年前
        1
  •  2
  •   DwB    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());
    }
    

    编辑 代码中的更多内容。

    在您的代码中, 布尔标志表示“我对子导入器做了一些事情,需要更新父导入器”。 在这种情况下,你是粉碎“确定事情更新”和“做更新”在一起; 把他们分开。

    考虑以下情况:

    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 . 这应该是合理的,即使你不执行 hashCode equals 在…上 数据转换器 ,因为父引用将始终相同。