上次我经常写长函数,有几个参数,但只使用其中一个,功能只是在散布在函数周围的几个关键点上有所不同。因此,拆分函数会创建太多没有目的的小函数。这是好的风格还是有一个好的通用重构模式?为了更清楚,举个例子:
public performSearch(DataBase dataBase, List<List<String>> segments) {performSearch(dataBase,null,null,segments);}
public performSearch(DataBaseCache dataBaseCache,List<List<String>> segments) {performSearch(null,dataBaseCache,null,segments);}
public performSearch(DataBase dataBase, List<String> keywords {performSearch(dataBase,null,keywords,null);}
public performSearch(DataBaseCache dataBaseCache,List<String> keywords) {performSearch(null,dataBaseCache,keywords,null);}
/** either dataBase or dataBaseCache may be null, dataBaseCache is used if it is non-null, else dataBase is used (slower). */
private void performSearch(DataBase dataBase, DataBaseCache dataBaseCache, List<String> keywords, List<List<String>> segments)
{
SearchObject search = new SearchObject();
search.setFast(true);
...
search.setNumberOfResults(25);
if(dataBaseCache!=null) {search.setSource(dataBaseCache);}
else {search.setSource(dataBase);}
... do some stuff ...
if(segments==null)
{
// create segments from keywords
....
segments = ...
}
}
这种代码风格有效,但我不喜欢所有那些 null 参数以及调用这样错误的方法的可能性(两个参数都为 null,如果两者都是非 null 会发生什么)但我也不想编写 4 个单独的函数...我知道这可能太笼统了,但也许有人对这个问题的原则有一个通用的解决方案:-)
PS:我不喜欢拆分一个长函数,如果除了它很长之外没有其他原因(即如果子函数只按该顺序调用并且仅由这个函数调用),特别是如果它们紧密交织并且需要在它们周围传输大量参数。