前回は、いくつかのパラメーターを持ち、そのうちの 1 つだけを使用する長い関数をよく書きました。機能は、関数の周りに散らばっているいくつかのキーポイントでのみ異なります。したがって、関数を分割すると、目的のない小さな関数が多すぎます。これは良いスタイルですか、それともこれに適した一般的なリファクタリング パターンはありますか? より明確にするために、例:
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 でない場合に何が起こるか)。 ...これは一般的すぎるかもしれませんが、誰かがこの問題の原則に対する一般的な解決策を持っているかもしれません:-)
PS: 長い関数以外に理由がない場合 (つまり、サブ関数がその順序でのみ、この 1 つの関数によってのみ呼び出される場合)、特にそれらが密に絡み合っている場合、長い関数を分割するのは好きではありません。それらの周りに大量のパラメーターを転送する必要があります。