객체지향 설계 안에 존재하는 세가지 상호 연관된 관점
- 개념 관점 : 설계는 도메인 안에 존재하는 개념들 사이의 관계를 표현.
- 도메인이란 사용자들이 관심을 가지고 있는 특정 분야나 주제를 말하며 소프트웨어는 도메인에 존재하는 문제를 해결하기 위해 개발된다.
- 명세 관점 : 도메인의 개념이 아니라 실제로 소프트웨어 안에서의 객체들의 책임에 초점. 즉, 객체의 인터페이스를 바라보게 된다.
- 명세 관점에서 프로그래머는 객체가 협력을 위해 무엇을 할 수 있는가에 초점을 맞춘다.
- 인터페이스와 구현을 분리하는 것은 훌륭한 객체지향 설계를 낳는 가장 기본적인 원칙이다.
- 구현 관점 : 객체들이 책임을 수행하는 데 필요한 동작하는 코드를 작성
- 프로그래머는 객체들이 책임을 어떻게 수행할 것인가에 초점을 맞추며 인터페이스를 구현하는데 필요한 속성과 메서드를 클래스에 추가한다.
구현하지 않고 머릿속으로만 구성한 코드는 구현하는 단계에서 대부분 변경된다.
설계 작업은 구현을 위한 스케치를 작성하는 단계지 구현 그 자체일 수는 없다.
중요한 것은 설계가 아니라 코드다.
따라서 협력을 구상하는 단계에 너무 오랜 시간을 쏟지 말고 최대한 빨리 코드를 구현해서 설계에 이상이 없는지, 설계가 구현 가능한지를 판단해야 한다.
코드를 통한 피드백 없이 깔끔한 설계를 얻을 수 없다.
개념, 명세, 구현 관점은 동일한 코드를 바라보는 서로 다른 관점이다. 훌륭한 객체지향 프로그래머는 하나의 클래스 안에서 세 가지 관점을 모두 포함하면서도 각 관점에 대응되는 요소를 명확하고 깔끔하게 드러낼 수 있다.
다른 사람이 여러분의 코드를 읽으면서 세 가지 관점을 쉽게 포착하지 못한다면 코드를 개선해야 한다.
도메인 개념을 참조하는 이유
어던 메시지가 있을 때 그 메시지를 수신할 객체를 선택하기 위한 첫 번째 전략은 도메인 개념중에서 가장 적절한 것을 선택하는 것이다.
도메인 개념 안에서 적절한 객체를 선택하는 것은 도메인에 대한 지식을 기반으로 코드의 구조와 의미를 쉽게 유추할 수 있게 한다. 이것은 시스템의 유지보수성에 커다란 영향을 미친다.
소프트웨어 클래스가 도메인 개념을 따르면 변화에 쉽게 대응할 수 있다.
인터페이스와 구현을 분리하라
명세 관점은 클래스의 안정적인 측면을 드러내야 하며, 구현 관점은 클래스의 불안정한 측면을 드러내야 한다.
인터페이스가 구현 세부 사항을 노출하기 시작하면 아주 작은 변동에도 전체 협력이 요동치는 취약한 설계를 얻을 수 밖에 없다.
프로그래머 입장에서 가장 많이 접하는 것은 코드이므로 구현 관점을 가장 빈번하게 사용하겠지만, 실제로 훌륭한 설계를 결정하는 측면은 명세 관점인 객체의 인터페이스다.
중요한 것은 여러분이 클래스를 봤을 때 클래스를 명세 관점과 구현 관점으로 나눠볼 수 있어야 한다는 것이다.
캡슐화를 위반해서 구현을 인터페이스 밖으로 노출해도 안 되고, 인터페이스와 구현을 명확하게 분리하지 않고 흐릿하게 섞어놓아서도 안된다.
Loading Comments...