본문 바로가기

Domain

생성자에서 많은 작업을 하는 것은 바람직하지 않은가?

개요

이전 포스팅에서 ViewModel의 생성자에서 많은 작업을 하는 것은 바람직하다는 저자의 코멘트가 있었다. 과연 정말 바람직하지 않은 것인지, 어떤 면에서 문제가 있는지 확인하고자 한다. 해당 포스팉에서는 Is doing a lot in constructors bad? - Stack Overflow의 의견들을 적극 참조했다.

 

생성자에서 작업 시 발생할 수 있는 문제점

생성자에서 많은 작업을 하는 것은 다양한 문제를 야기할 수 있다.

 

1. 테스트가 어렵게 만든다. 

예를 들어, new를 통해 생성자에서 다양한 객체를 생성한다고 가정하자. 유닛 테스트가 매우 어려워질 것이다.

 

2. 단일 책임 원칙을 위반한다.

다양한 책임을 가진 많은 코드를 하나의 블록에 넣는 것은 좋지 않다.

 

3. 생성자의 코드가 일부 재사용하게 리팩토링하게 되는 경우도 잦다.

처음 코드를 작성할 때 생성자에 작성한 코드 조각이 다른 곳에도 재활용이 되는 경우가 많아 유지보수 비용이 커질 수 있다.

 

4. 클래스를 상속할 때 문제가 된다.

클래스를 상속 받은 경우 부모 생성자의 로직 앞이나 내부에 일부 로직을 삽입하려 할 때, 우선적으로 수행되어야 하는 일은 부모 생성자의 로직을 호출하는 것이기 때문에 단순하지가 않다.

 

 

생성자에서 작업 시 발생할 수 있는 문제점의 반박

생성자에서 어느 정도 작업을 하는 것은 나쁘지 않다는 의견도 매우 많았다. 요약하자면 SRP를 위반하지 않고 의존성 주입을 적절히 사용하는 경우 

 

1. 테스트하기 어렵게 만드는 것은 사실이 아닐 수 있다.

사실 의존성 주입을 사용하면 된다. 이는 실제 작업을 수행하는 생성자의 문제가 아니다.

 

2. 단일 책임 원칙을 위반하는 것은 생성자에서 일을 하는 것이 문제가 아니다.

물론 많은 책임을 가진 코드 블럭을 만드는 것은 SRP를 위반한다. 하지만, 이는 작업을 수행하는 생성자의 문제가 아닌 프로그래머의 문제이다.

 

3. 생성자의 요점은 클라이언트가 바로 사용할 수 있는 깔끔한 객체를 만드는 것이다.

아래 코드에서 Config 객체에는 생성자에서 아무 일도 하지 않는다. 대신 doConfig() 메소드에서 초기화 작업을 진행한다. 만약, Config에 생성자를 두고 거기서 초기화 작업을 진행했다면 코드는 Config Conf = new Config(); 한 줄로 줄어들고 클라이언트가 사용하기 훨씬 쉬워질 것이다.

요약

역시 정답은 없다. 상황에 따라 적절하게 구현하면 된다. 하지만, SRP를 따르면서 의존성 주입도 적절히 활용하면 서술한 문제점들은 크게 문제가 될 것이 없다고 생각한다. 

'Domain' 카테고리의 다른 글

애자일 개발의 기술 2/e - 애자일이란 무엇인가?  (0) 2023.09.16