データが複数の場所からクエリされ、最初の非 null インスタンスで返される必要がある場合に、if/else ステートメントの使用を避ける方法はありますか?
3 つの異なる場所 (ユーザー設定、グループ設定、システム設定) からユーザーの設定を読み込もうとしています。例えば:
Preference getPreference(User user, Preference.Type type) {
Preference preference = getUserPreferenceFor(user, type);
if (preference != null) {
return preference;
}
preference = getGroupPreferenceFor(user, type);
if (preference != null) {
return preference;
}
return getSystemPreferenceFor(user, type);
}
これらの if チェックの使用を避け、これらのメソッドを連鎖させて、動作は同じままですが、コードにこの醜い重複がないようにしたいと思います。
私はいくつかの解決策を考えましたが、これらのストライキはエレガントなものではありません。たとえば、1 つの方法は、これらのメソッドのそれぞれにデフォルト自体を提供させることですが、それは if ステートメントを分散させるだけです。
Preference getPreference(User user, Preference.Type type) {
Preference preference = getUserPreferenceFor(user, type);
if (preference != null) {
return preference;
}
return getGroupPreferenceFor(user, type);
}
Preference preference getGroupPreferenceFor(
if (preference != null) {
return preference;
}
return getSystemPreferenceFor(user, type);
}
もう 1 つの方法は、いくつかのプロバイダー インターフェイスを使用し、それぞれにサブクラスを作成し、最初の非 null が見つかるまでプロバイダーを反復処理することです。
public interface PreferenceProvider {
Preference getPreference(User user, Preference.Type type);
}
public class UserPreferenceProvider implements PreferenceProvider {
public Preference getPreference(User user, Preference.Type type) {
...
}
}
... group and system provider the same way
final static PreferenceProvider[] providers = new PreferenceProvider[] {
new UserPreferenceProvider(),
new GroupPreferenceProvider(),
new SystemPreferenceProvider()
};
Preference getPreference(User user, Preference.Type type) {
Preference preference = null;
for (PreferenceProvider provider : providers) {
preference = provider.getUserPreferenceFor(user, type);
if (preference != null) {
return preference;
}
}
}
最後のものは十分に近いですが、まだこのヌル チェックがあり (これは避けたいと思います)、この問題を解決する設計パターンがあると確信しています。どっちかしか思い出せない…