자원을 직접 명시하지 말고 의존 객체 주입을 사용하라

 

자원을 직접 명시하면 유연성과 재사용성이 떨어진다.
public class EnglishNamingService {

    public boolean isEnglishName(String name) {
        return "English".equals(name);
    }
}

public class KoreanNamingService {

    public boolean isKoreanName(String name) {
        return "한글".equals(name);
    }
}

public class NamingUtils {

    private static final KoreanNamingService koreanNamingService = new KoreanNamingService();

    private NamingUtils() {}

    public static boolean isValid(String name) {
        return koreanNamingService.isKoreanName(name);
    }
}
  • NamingUtils에서 한글 네이밍 기능이 필요하지 않고 영어 네이밍 기능이 필요하다면 NamingService를 EnglishNamingService로 수정이 필요하다. (유연성이 떨어짐)
  • 같거나 비슷한 기능이라도 isKoreanName, isEnglishName과 같이 메서드명이 다를 수 있기 때문에 NamingUtils의 코드를 수정해야한다. (재사용성이 떨어짐)

 

팩터리 메서드 패턴을 사용
public interface NamingService {

    public int getLength(String name);
}

public interface NamingServiceFactory {

    NamingService getNamingService();
}

public class EnglishNamingFactory implements NamingServiceFactory{
    @Override
    public NamingService getNamingService() {
        return new EnglishNamingService();
    }
}

public class KoreanNamingFactory implements NamingServiceFactory{
    @Override
    public NamingService getNamingService() {
        return new KoreanNamingService();
    }
}

public class FactoryNamingUtils {

    private NamingService namingService;

    public FactoryNamingUtils(NamingServiceFactory namingServiceFactory) {
        namingService = namingServiceFactory.getNamingService();
    }

    public int getLength(String name) {
        return namingService.getLength(name);
    }
}

새로운 NamingService가 추가되더라도 팩토리를 사용하는 코드는 변경할 필요가 없다.

 

Spring IoC(Inversion of Control)

 

출처 : 백기선 이펙트브 자바 강의

+ Recent posts