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()
如何在不引入更多私人助手方法的情况下摆脱布尔值?好的,我重新阅读了您的示例代码。布尔值
示例代码不是参数。我的答案与布尔参数有关。