여러 위치에서 데이터를 쿼리 할 수 있고 첫 번째 null이 아닌 인스턴스에서 반환해야하는 경우 if/else 문을 사용하지 않는 방법이 있습니까? 여러 공급 업체를 사용할 때 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 구문을 분산시키는 것입니다.
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);
}
또 다른 방법은, 일부 바이더 인터페이스를 사용하여 각각의 서브 클래스를 생성하고 첫 번째 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;
}
}
}
마지막 하나는 충분히 가까운하지만 여전히이 널 (null) 검사가 있습니다 (I 피해야하고 싶은) 나는이 문제를 해결하는 몇 가지 디자인 패턴이있다 꽤 확신 해요.
Preference getPreference(User user, Preference.Type type) {
Preference preference = getUserPreferenceFor(user, type);
if (preference == null) {
preference = getGroupPreferenceFor(user, type);
if (preference == null) {
preference = getSystemPreferenceFor(user, type);
}
}
return preference;
}
그것은 여전히 if
의를 사용하지만 나에게 충분히 우아한 외모 : 난 그냥
; 대신 가장 간단한 형태의 가독성을 제안 할 것입니다. (예 : alfasin의 답) – devsnd
위임자를 매개 변수로 전달할 수있는 자바의 능력에 따라 (C#에서는 할 수 있습니다) 일반 null-check 함수를 만들고 대부분의 ifs. – Fendy
코드 줄을 너무 많이 추가하는 것을 피하려면 어떻게해야합니까? 가치가있는 것이 코드 기반으로 가져 왔습니까? – GManNickG