소프트웨어 시스템은 준비과정과 런타임 로직을 분리해야한다.
많은 애플리케이션이 시작단계, 준비과정을 분리하지 않는다.
func getService() -> Service {
if service = nil {
service = MyServiceImpl()
}
return service
}이것은 초기화 지연 혹은 계산 지연 기법이다. swift에서 lazy property와 유사한 개념이다. 실제 필요할 때까지 객체를 생성하지 않아 불필요한 부하가 걸리지 않는다
하지만 MyserviceImpl 클래스에 의존하게되 MyserviceImpl객체를 사용하지 않더라도 MyserviceImpl 오류가있으면 컴파일조차 되지 않는다.
이처럼 설정 논리와 실행 논리를 분리하지 않으면 모듈성이 낮아지고 중복이 심하다. 설정논리와 일반 실행 논리를 분리야해 모듈성이 높아진다
Main 분리
시스템 생성과 사용을 분리하는 한가지 방법으로 생성과 관련한 코드는 모두 main이나 main이 호출하는 모듈로 옮기고, 나머지 시스템은 모든 객체가 생성되었고 모든 의존성이 연결되었다고 가정한다.
처음부터 올바르게 시스템을 만들 수 있다는 믿음은 미신이다.
대신, 우리는 오늘 주어진 사용자 스토리에 맞춰서 시스템을 구현해야 한다.
내일은 새로은 스토리에 맞춰 시스템을 조정하고 확장하면 된다.
이것이 애자일 방식의 핵심이다. TDD, 리팩터링으로 얻어지는 깨끗한 코드는 시스템을 조정하고 확장하기 쉽게 만든다.
모듈을 나누고 관심사를 분리하면 지엽적인 관리와 결정이 가능해진다. 한사람이 모든것을 결정하는 것이 아닌 가장 적합한 사람에게 책임을 맡기는 것이 좋다.
