대부분의 소프트웨어는 개발이 완료되어도 계속해서 요구사항이 추가되며 유지보수가 진행된다.

하지만 소프트웨어가 제대로 설계되어 있지 않다면 개발자들은 복잡한 코드를 보는 것조차 두려워하며,

예상치 못한 오류로 인해 유지보수하는데 많은 시간이 소요될 것이다.

이러한 레거시 코드의 유지보수를 두려워하지 않으려면 변경을 수용하고 즐겁게 작업할 수 있도록 하는

유연한 설계 가 필요하다.

본 장에서는 패턴과 예제를 토대로 유연한 설계가 무엇이고

유연한 설계를 만들려면 어떤 식으로 사고해야 하는지를 설명한다.

Untitled

Intention Revealing Interface (의도를 드러내는 인터페이스)

협업 개발자가 **객체를 사용하는 데 알아야 할 정보를

인터페이스로부터 얻지 못한다면**, 세부사항을 이해하고자

객체 내부를 깊이 파고들 수밖에 없다.

즉, 개발자가 컴포넌트를 사용하기 위해 컴포넌트의

세부사항을 고려해야 한다면 캡슐화 의 가치는 사라진다.

개발자 간의 의사소통을 개선하고 시스템 추상화를 향상시키려면 **도메인 개념을 반영하도록

클래스 이름, 메서드 이름, 인자 이름을 지어야 한다.**

또한 수행 방법에 대해서는 언급하지 않고 결과와 목적만을 표현하도록 이름을 부여하여

Intention Revealing Interface 를 형성해야 한다.

이때 협업 개발자가 쉽게 추측할 수 있도록 Ubiquitous Language 를 활용하도록 하며,

협업 개발자의 관점에서 생각하기 위해 테스트 코드를 작성해봐야 한다.

정리하면, 방법이 아닌 의도를 표현하는 추상적인 인터페이스 뒤로 복잡한 계산 로직을 캡슐화해야 한다.

이로써 협업 개발자가 내부를 이해해야 할 필요성이 줄어든다.

예제: 페인트 혼합 애플리케이션

이번에 살펴볼 예제는 페인트 상점에서 사용할 애플리케이션으로써,

여러 페인트를 혼합한 결과를 시각화하여 고객에게 보여주는 프로그램이다.