요약
1장. 객체지향 디자인
-
디자인이 무엇이고, 왜 필요하고, 어떻게 할 수 있는지에 대해서 배우게 됩니다. 디자인의 한 방법으로서 객체지향 디자인을 소개하고 이전의 절차지향과는 어떤 점이 다른지 설명합니다.
- 디자인은 코드를 배치하는 일입니다. 코드를 단순하게 배치하는 것이 아니고 변화의 비용을 최소화하는 방향으로 코드를 배치할 수 있어야 합니다. 디자이너는 오늘 완성해야 하는 기능을 구현하면서 동시에 내일 쉽게 바꿀 수 있는 코드를 디자인해야 합니다.
- 내일 쉽게 바꿀 수 있는 코드가 필요한 이유는 요구 사항이 계속해서 변화하기 때문입니다. 좋은 제품을 만들기 위해서는 끊임없는 사용자의 피드백을 잘 수용할 수 있어야 합니다. 피드백을 잘 수용하여 제품을 성장 시켜야 합니다.
- 거대한 애플리케이션의 각자 역할을 담당하고 있는 여러 부분으로 나누어져 있고 서로 상호작용하면서 동작합니다. 이렇기 때문에 여러 기능이 있고 거대한 애플리케이션은 수정하기 쉽지 않습니다. 때문에 디자인을 잘 해서 이런 변경에 대응할 수 있도록 해야 합니다.
- 객체지향에는 여러 원칙과 패턴으로 디자인하는 방법을 수련할 수 있습니다.
2장. 단일 책임을 따르는 클래스
-
객체지향의 근간은 메시지이지만 객체지향을 하면서 가장 많이 접하는 것이 클래스이기 때문에 클래스에 대해서 어떻게 디자인해야 하는지를 배우게 됩니다.
- 클래스는 단순해야 합니다. 클래스 내부의 구성 요소들은 하나의 핵심 목표를 가져야 합니다.
- 이는 클래스가 응집되어 있어야 함을 의미합니다.
- 클래스가 응집되어 있을 때 재사용성이 증가하게 되고 오류의 발생 가능성을 낮춰 줍니다.
- 변화를 받아들일 수 있는 코드를 작성하기 위해서는 클래스뿐만 아니라 메서드와 같이 모든 곳에 단일 책임 원칙을 적용해야 합니다.
3장. 의존성 관리
-
의존성이란 무엇이고 의존성이 애플리케이션에 미치는 영향과 이 영향을 최소화 하기 위해 의존성을 관리하는 방법에 대해서 배우게 됩니다.
- 의존성은 다른 객체에 대한 지식을 말합니다. 객체들은 하나의 목표를 달성하기 위해서 서로 상호작용하며 동작합니다. 때문에 이를 위해서 객체들간의 지식을 필요로 합니다.
- 다른 객체에 대한 지식이 많으면 많을 수록 변경의 이유가 다양해지는 객체가 만들어집니다. 의존성이 객체의 수정을 강제하기 때문에 이렇게 묶여 있는 객체들은 하나의 객체처럼 동작하게 됩니다.
- 이를 해결할 수 있는 방법으로 의존성 주입, 의존성 격리, 인자에 대한 의존성 제거, 의존성 방향에 대한 관리를 배우게 됩니다.
4장. 유연한 인터페이스 만들기
-
위에서 객체지향의 근간은 메시지라고 했습니다. 이 장에서는 객체들의 소통 수단인 메시지 == 퍼블릭 인터페이스에 대한 내용을 배우게 됩니다.
- 객체의 인터페이스는 효율적인 처리를 위해 퍼블릭 인터페이스와 프라이빗 인터페이스로 나누어집니다. 퍼블릭 인터페이스는 클래스의 핵심 책임을 나타냅니다.
- 객체의 퍼블릭 인터페이스는 시퀀스 다이어그램을 활용하여 찾을 수 있습니다. 어떤 객체들이 어떤 메시지를 주고 받을 것인지 시쿼스 다이어그램을 통해 인터페이스에 대한 의도를 구상합니다.
5장. 오리 타입으로 비용 절약
-
오리 타입이 필요한 순간과 오리 타입으로 해결할 수 있는 문제에 대해서 배우게 됩니다. 또 오리 타입을 사용할 떄 주의해야 할 점에 대해서 배웁니다.
- 오리 타입은 특정 클래스에 종속되지 않는 퍼블릭 인터페이스입니다. 오리 타입은 다형성을 사용하여 코드의 유연성을 높여줍니다.
- 오리 타입을 잘 못 사용할 경우 해독할 수 없는 디자인을 만들어 낼 수 있기 때문에 최대한 의도를 가지고 구축해야 합니다. 오리 타입은 명식적이고 잘 정리된 계약서 같은 퍼블릭 인터페이스를 가지고 있어야 합니다.
- 객체의 타입에 따라 비슷하지만 다른 동작을 해야 하는 코드가 있을 때 오리 타입 도입을 고민해 볼 수 있습니다.
6장. 상속을 이용해 새로운 행동 얻기
-
객체간의 관계를 정하기 위한 상속에 대해서 배우게 됩니다. 올바르게 상속을 사용하는 방법과 상속이 주는 이점과 상속의 단점에 대해서 배우게 됩니다.
- 상속은 객체간의 위계구조를 만듭니다. 공통된 행동을 상위클래스가 갖고 하위클래스는 상속을 통해서 상위클래스의 공통된 행동 + 하위클래스만의 행동을 갖게 됩니다. 하위클래스는 상위클래스의 특수한 형태입니다.
- 상속을 받은 다른 하위클래스에 문제가 발생할 수 있기 때문에 상위클래스에 하나의 하위클래스에만 해당하는 행동을 정의하면 안됩니다. 상속을 받기로 결정하면 하위클래스는 상속받는 상위클래스의 모든 행동을 상속 받아야 합니다. 때문에 주의를 기울여 상위클래스에 어떤 행동을 포함할 지 결정해야 합니다.
- 상속은 상위클래스와 하위클래스간의 강한 의존성을 만들어 냅니다. 이를 관리하기 위해서 템플릿 메서드 패턴과 훅 메시지를 사용할 수 있습니다.
7장.모듈을 통한 역할 공유
-
루비에서 상속과 비슷하게 동작하는 모듈에 대해서 배우게 됩니다. 상속과 모듈이 어떤 공통점이 있고 차이점은 무엇인지 알게 됩니다.
- 모듈은 클래스의 일부 기능을 재사용하기 위한 코드 조각입니다. 코드의 재사용성 측면과 메시지가 처리되는 측면(자동화된 메시지 전달)에서 상속과 비슷하지만 상속은 객체간의 타입 계층을 만드는데 사용된다는 점과 모듈은 코드를 재사용하거나 관련 있는 기능을 묶어서 관리할 때 사용한다는 차이점이 있습니다.
- 모듈을 객체에서 숨겨진 역할을 찾아내고 그 행동을 여러 수행자들이 공유할 수 있도록 하는 코드를 작성할 수 있게 합니다.
8장. 조합을 시용해 객체 통합하기
-
상속으로 디자인된 코드를 조합을 사용해서 리팩터링하는 과정을 통해 조합이 주는 이점에 대해 배우게 됩니다. 또한 어떠한 경우에 어떤 디자인 기술을 선택해야 하는지에 대한 가이드를 제시해 줍니다.
- 제대로 구조화된 상속의 경우 확장에 열려있고 수정에는 닫혀있는 구조를 유지할 수 있도록 하지만 상속이 어울리지 않는 문제의 해결로 상속을 사용한다던가 다른 프로그래머가 의도대로 사용하지 않을 수 있다는 문제점이 있었습니다. 또한 상속을 사용한다는 것 자체가 상위클래스와 강한 결합을 만들어 내기 때문에 이 의존성을 관리하기 위해서 다른 작업이 필요했습니다.
- 조합은 수신한 메시지를 직접 전달하는 구조를 갖지만 클래스 간의 결합에서는 자유로워질 수 있기 때문에 의존성 관리가 상속보다 수월합니다.
- 상속과 조합이 해결할 수 있는 문제가 각각 존재하기 때문에 적절한 디자인 기술을 선택해서 사용하는 것이 중요합니다.
9장. 비용 - 효율적인 테스트 디자인하기
-
수정하기 쉬운 코드를 작성하는 일에 필요한 기술 중 효율적인 테스트 코드를 짜는 방법에 대해서 배우게 됩니다. 왜 테스트 코드가 필요한지, 무엇을 테스트 해야 하는지, 언제 테스트 코드를 짜야 하는지에 대해서 배웁니다.
- 테스트 코드는 버그를 초기에 찾아낼 수 있고 코드에 대해서 생동감있는 문서를 제공할 수 있도록 합니다. 또한 테스트는 추상화된 인터페이스의 기록이기 떄문에 구체적인 디자인에 대한 결정을 미루고 필요한 만큼 추상화된 코드를 만들 수 있도록 해줍니다.
- 테스트에서 더 나은 가치를 얻기 위해서는 모든 것을 한 번만 테스트하고 제대로 된 곳에서 테스트를 해야 합니다.
총 평
- 객체지향으로 애플리케이션을 디자인해야 할 때뿐만 아니라 기본적인 개발 소양에 대해서 배운 것 같습니다. 특히 1,2,3,4장이 많은 도움이 된 것 같습니다.
- 툭정 문제를 해결하는 디자인 기술들에 대해서 알게 되었습니다. 책에서 나온 것 처럼 디자인 기술은 알지만 어떻게 적용해야 하는지 잘 알지 못하는 주니어지만 일단 뭐든 적용해 보면서 배우려고 합니다.^^ 그래도 책에서 코드의 어떤 부분이 문제가 되고 리팩터링을 통해서 어떻게 개선해 나가는지 예시를 보여줬기 때문에 멘땅에 헤딩은 아닐 것 같습니다. 실제로 읽으면서 프로젝트에 적용할 포인트들이 생각났는데 그 부분들 부터 적용해 보려고 합니다.
- 테스트 부분을 읽으면서 위로를 많이 얻은 것 같습니다.😂😂😂 역시 중요한 건 꺾이지 않는 마음!
완벽함이란 다가가기 여러운 지점이다. 어쩌면 도달할 수 없는 곳일지도 모른다. 그렇다고 해서 완벽함을 추구하는 정신을 포기할 필요는 없다. 인내심을 갖자. 수련을 하자. 탐구하자. 상상해 보자. 할 수 있는 최선을 다하면, 다른 나머지는 자연히 따라오기 마련이다.
루비로 배우는 객체지향 디자인 [나가는 글]