为什么方法体内的布尔标志是个坏主意?
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
上实现 hashCode
和 equals
,因为父引用将始终相同。
假设我有如下内容,其中 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
上实现 hashCode
和 equals
,因为父引用将始终相同。