2019-11-03 일요일

객체지향의 사실과 오해

정리

  • 객체지향 설계 안에는 3가지의 관점이 존재한다.
    1. 개념관점: 도메인 안에 존재하는 개념과 개념들 사이의 관계를 표현한다.
    2. 명세관점: 사용자의 영역인 도메인을 벗어나 개발자의 영역인 소프트웨어로 촛점이 옮겨진다.
    3. 구현관점: 개발자의 영역으로, 실제 동작하는 코드를 다룬다.
  • 이 관점들은 모두 코드 안에서 드러나야 한다.
    1. 개념관점은 심볼(과 그 관계)로 표현된다.
    2. 명세관점은 퍼블릭 인터페이스로 표현된다.
    3. 구현관점은 메서드의 구현으로 표현된다.
  • 객체지향은 훌륭한 협력을 설계하는 것이다.
  • 메시지가 객체를 선택한다.
  • 설계는 코드의 구현단계에서 변경될 가능성이 높다. 개발자는 결국 작동하는 소프트웨어를 구현해야만 한다. 구현에 맞지 않은 설계는 좋은 설계가 아니다. 따라서 우선 큰 틀을 잡고, 간단하게 구현을 하자. 그래서 이 설계가 구현가능한 설계인지 판단하고, 수정해 나가자.
    • TDD를 생각하라. 설계를 코드로 반영하여 실패하는 테스트를 작성하고, 통과하는 코드를 구현한다!
  • 구현하는 도중에 퍼블릭 인터페이스를 발견했다고 자책하지 말라. 실제로 상호작용하는 코드를 작성하지 않는 이상, 모든 것을 예측할 수는 없는 노릇이다. 구현하면서 퍼블릭 인터페이스를 정의해도 된다.

후기

오늘 드디어 1독 했다. 이 책은 2부인 오브젝트의 요약 버전이다. 두 권 모두 사야 하지만, 둘 중 하나만 사야하는 경우라면 오브젝트를 사는 것을 추천한다. 그런데 사실 둘 중 하나 아무거나 사도 상관 없다. 아마 읽다보면 결국 둘 다 구매하게 될 것이다.

지금껏 개발공부를 해오면서 스스로 성장했다고 느껴본 적이 많지 않다. 물론 아직 오브젝트를 공부하고 있긴 하지만, 이번에 무언가 한 단계 더 성장했다고 느꼈다. TDD, DDD에 대해 다시 공부해보면 이전과는 확연히 다른 시각으로 더 깊게 공부할 수 있을 것 같다.

마찬가지로 GoF의 디자인 패턴, 클린 코드, 리팩토링 등 구조, 설계 관련 책들 다시 한 번 복습 할 것이다. 분명히 예전에 공부했을 때와는 완전히 다른 시각으로 더 깊게 공부할 수 있을 것이다.

조영호 개발자님, 압도적 감사!!!!!🤣

오브젝트

  • 유사한 기능은 유사한 방식으로 구현해야 한다.
  • 변하는 개념을 변하지 않는 개념으로부터 분리하라.
  • 변하는 개념을 캡슐화하라.
  • 조건 로직을 객체 사이의 이동으로 바꾸어라.
  • 유사한 기능에 대해 유사한 협력 패턴을 적용하는 것은 객체지향 시스템에서 개념적 무결성을 유지할 수 있는 가장 효과적인 방법이다.
  • 가급적 기존의 협력 패턴에 맞추어라.
    • 설계를 약간 비트는 것이 조금 이상한 구조를 낳더라도 전체적으로 일관성을 유지할 수 있는 설계를 선택하는 것이 현명하다.
      • 예를 들어, 하나의 아이템만을 갖고 있는 컬랙션 등
  • 새로운 요구사항에 의해 변하는 일관성을 지속적으로 개선하라.
    • 모든 요구사항을 미리 예상할 수 없다.
    • 그에 맞춰 변하려는 의지가 가장 중요하다.
    • 과감하게 리팩터링하라.
  • 아키텍처 패턴은 소프트웨어 전체적인 구조를 결정하기 위한 패턴이다.
  • 디자인 패턴은 특정 정황 내에서 일반적인 설계 문제를 해결한다.
  • 이디엄은 특정 프로그래밍 언어에 국한된 하위 레벨 패턴이다.
  • 패턴도 결국 책임, 역할, 협력이다.
  • 패턴은 종착점이 아닌 시작점이다.
    • 패턴이 설계의 목표가 되어서는 안된다! 간단한 방법이 있다면 그것을 이용해라.
    • 맹목적으로 사용하지 마라!
  • 패턴을 가장 효과적으로 적용하는 방법은 패턴을 지향하거나 패턴을 목표로 리팩터링 하는 것이다.
    • 이 말이 설계의 목표가 되라는 것으로 오해하면 안된다. 변경을 어떻게 효과적으로 다룰 것인지 패턴을 지향하여 코딩하고, 그 결과물을 시작으로 나의 컨텍스트에 맞춰 변경하라.
  • 디자인 패턴에서 중요한 것은 구현 방법이나 구조가 아니라, 어떤 변경을 캡슐화하는지다.
    • 우리는 지금 변경에 대응하기 위해 설계를 하고있는 것이다!
  • 프레임워크는 책임, 역할, 협력이 기본적으로 구현되어 있는, 구현된 아키텍처다.
  • 라이브러리는 하위 레벨(구현) 코드의 재사용이다. 프레임워크는 상위 레벨(구조, 설계) 코드의 재사용이다.
  • 좋은 객체지향 설계란, 기본적으로 Inversion of Control이다.