Taking baby-developer steps

[객체지향의 사실과 오해] 4. 역할, 책임, 협력 - 5 객체지향 설계 기법 - (책임-주도 설계, 디자인 패턴, 테스트-주도 개발) 본문

CS 지식/객체지향

[객체지향의 사실과 오해] 4. 역할, 책임, 협력 - 5 객체지향 설계 기법 - (책임-주도 설계, 디자인 패턴, 테스트-주도 개발)

Surin Lee 2023. 11. 28. 21:23

역할, 책임, 협력의 관점에서 애플리케이션을 설계하는 3가지의 유용한 기법이 있다.

 

  1. 책임-주도 설계 -> 객체의 역할, 책임, 협력을 고안하기 위한 방법과 절차를 제시
  2. 디자인 패턴 -> 책임-주도 설계의 결과를 표현
  3. 테스트-주도 개발 -> 설계를 테스트하는 좋은 도구

책임-주도 설계

 - 협력에 필요한 책임들을 식별하고 적합한 객체에게 책임을 할당하는 방식으로 애플리케이션을 설계

 객체지향 시스템의 목적은

1. 사용자의 요구를 만족 시킬 수 있는 기능을 제공하고

2. 이해하기 쉽고, 단순, 유연한 상호작용을 제공하는 객체들의 공동체를 구축

하는 것이다.

 가장 핵심은 역시나 "올바른 책임"을 "올바른 객체"에게 할당하는 것이다. 객체지향 언어 사용, UML 같은 모델링 언어로 설계의 밑그림을 그리는 것이 객체지향 시스템을 보장하진 못한다.

 전체 개발 단계에 걸쳐 객체의 역할과 책임, 협력을 도드라지게 만드는 기법 및 체계를 따라야한다. 견고한 객체지향 시스템을 설계하는 절차는 다음과 같다.

  • 시스템이 사용자에게 제공해야하는 기능인 시스템 책임을 파악한다.
  • 시스템 책임을 더 작은 책임으로 나눈다.
  • 분할된 책임을 수행할 수 있는 적절한 객체 또는 역할(추상화된 객체. 여러 객체가 수행할 수 있는경우 추상화 가능)을 찾아 책임을 할당한다.
  • 객체가 책임을 수행하는 중에 다른 객체의 도움이 필요한 경우, 이를 책임질 적절한 객체 또는 역할을 찾는다.
  • 해당 객체 또는 역할에게 책임을 할당함으로써 두 객체가 협력하게 한다.

디자인 패턴

- 전문가들이 반복적으로 사용하는 해결 방법을 정의해 놓은 설계 템플릿의 모음

- 패턴이란, 특정 문제를 해결하기 위해 이미 식별해 놓은 역할, 책임, 협력의 모음이다. -> 패턴을 알고 적절히 적용한다면, 바퀴를 반복적으로 발명할 필요가 없어진다.

- 모범이 되는 설계라고 생각하면 된다. 모방하고 수정할 수 있는 과거의 설계 경험.

반복되는 문제와 그 문제에 대한 해법의 쌍으로 정의된다. 상황에 적용 가능한 디자인 패턴을 알고 있다면 위에서 소개한 절차를 따르지 않더라도 시스템 안에 구현할 객체들의 역할과 책임, 협력 관계를 설계할 수 있다.

 

테스트-주도 개발

- 테스트를 먼저 작성, 테스트를 통과하는 구체적인 코드를 추가하면서 애플리케이션을 완성하는 방식

- 핵심은 테스트 작성이 아닌, 역할, 책임, 협력이 적합한지 피드백 받는 것이다.

테스트를 작성하는 것에 집중하지 말고, 책임을 수행할 객체 또는 클라이언트가 기대하는 객체의 역할이 메시지를 수신할 때 어떤 결과를 반환하고 그 과정에서 어떤 객체와 협력할 것인지에 대한 기대를 코드의 형태로 작성하는 것.

다양한 설계 경험과 패턴에 대한 지식이 없는 사람들은 온전한 혜택을 누리기가 어렵다. 객체지향에 대한 깊이 있는 지식을 요구하기 때문이다. 좋은 설계에 대한 감각과 경험을 길러야만 적용할 수 있는 설계 기법이다.


느낀점

https://www.youtube.com/watch?v=gs1qM1TF5zA 

 

 최근에 인상 깊게 본 TDD에 대한 현업 개발자분의 영상이다. 어설프게 TDD를 시도한다며 C++테스트 모듈을 사용해 자료구조를 구현했던 경험이 있었다. 실제 애플리케이션을 구현할 때, 당시 내가 했던 수준의 TDD를 한다면 테스트를 위한 기능 개발이 되거나 위의 현업자 분의 말씀대로 버그가 생길때마다 기능을 바꾸며 Test의 대부분을 바꾸느라 많은 시간을 할애하거나 더이상 맞지 않는 이전의 테스트를 pass하기 위해 헛수고를 할 수도 있겠다는 생각이 들었었다.

 마침 요즘  공부하고 있던 객체지향 책에서 TDD에 대한 설명이 나올지는 전혀 몰랐다. MSA에도 관심을 가지고 있었는데, 결국엔 객체지향과 핵심이 비슷하다 생각했는데, TDD까지 연결이 될 줄은..! 객체지향을 공부하며 든 생각은 결국엔 "협력"을 고려해 "협조적이고 자율적인" 객체의 집합을 설계하는 것이 좋은 애플리케이션을 만드는 지름길이라는 생각이 들었다. 언제나 협력과 역할, 책임을 생각하자!


참고문헌 :  객체지향의 사실과 오해, 포프TV(on Youtube)

Comments