https://product.kyobobook.co.kr/detail/S000001766367
오브젝트 | 조영호 - 교보문고
오브젝트 | 역할, 책임, 협력을 향해 객체지향적으로 프로그래밍하라!객체지향으로 향하는 첫걸음은 클래스가 아니라 객체를 바라보는 것에서부터 시작한다. 객체지향으로 향하는 두번째 걸음
product.kyobobook.co.kr
책 목차:
1장 객체, 설계 : https://inhyeok-blog.tistory.com/32
2장 객체지향 프로그래밍 : https://inhyeok-blog.tistory.com/33
3장 역할, 책임, 협력 : https://inhyeok-blog.tistory.com/34
4장 설계 품질과 트레이드오프 : https://inhyeok-blog.tistory.com/36
5장 책임 할당하기 : https://inhyeok-blog.tistory.com/37
6장 메시지와 인터페이스 :
7장 객체 분해 :
8장 의존성 관리하기 :
9장 유연한 설계 :
10장 상속과 코드 재사용 :
11장 합성과 유연한 설계 :
12장 다형성 :
13장 서브클래싱과 서브타이핑 :
14장 일관성 있는 협력 :
15장 디자인 패턴과 프레임워크 :
소프트웨어 설계와 소프트웨어 유지보수 분야에 있어서 이론을 잘 아는 것이 얼마나 효과적일까? 사실 이론보다는 실무가 훨신 앞서있다. 추상적이고 복잡한 이론을 모두 알고 소프트웨어 설계와 소프트웨어 유지보수를 실행한다는 것은 비효율적이다. 이 책은 패러다임을 설명하기 위해 추상적인 개념이나 이론을 앞세우지 않을 것이다. 가능하다면, 코드로 설명할 것이다. 그것이 실무를 이용해서 공부하는 가장 좋은 방법이다.
1. 티켓 판매 애플리케이션 구현하기
티켓 판매 애플리케이션은 영화관에서 손님에게 티켓을 판매하는 내용을 구현하는 프로그램이다. 이를 예제 삼아서 이후의 이야기가 전개된다.
2. 무엇이 문제인가
로버트 마틴에 의하면, 소프트웨어 모듈이 가져야 하는 세가지 기능은 아래와 같다.
- 제대로 실행되어야 한다.
- 변경이 용이해야 한다.
- 이해하기 쉬워야 한다.
이제 이 3가지 원칙에 따라서 예제 코드가 어떤 문제를 가졌는지 확인해 보자.
예상을 빗나가는 코드
로버트 마틴의 3번째 소프트웨어 모듈의 기능인 '이해하기 쉬워야 한다'는
1. 위에서 아래로 의도를 파악하면서 읽는 것
2. 주어진 조건(Param)과 달성 해야할 목적(return)을 보고 코드를 예상 할 수 있는 것
3. 코드를 읽을 때 다음줄을 예상 할 수 있는 것
을 달성 해야 할 것으로 보인다. 이 관점에서 기존의 예제 코드를 확인해 보자.
최초의 코드는 모든 객체가 자율성을 가지지 못했다. 소극장이라는 제3자가 손님의 가방을 뒤져서 돈을 가져간다. 우리의 의식대로 흘라가지 않는 것이다. 예컨데, 우리가 상상하는 현실에서는 관람객이 직접 자신의 가방에서 초대장을 꺼내 판매원에게 건내야 하는 것이다.
또한 이 코드를 이해하기 위해서는 프로그램의 세부적인 객체들을 아주 많이 알아야 한다. 우리는 프로그램의 모든 내용을 알고 있는 상태로 코드를 읽지 않는다. 최소한의 정보만 가지고(또는 이름만 가지고) 코드의 역할을 예상하면서 코드를 읽어야 한다. 이런 상황에서 다양한 객체에 접근해서 목적을 달성하는 일은 코드를 읽어가는 사람들에게 큰 부담을 준다.
변경에 취약한 코드
사용자가 가방 없이 삼성페이를 사용한다고 가정하자. 우린 얼마나 많은 코드를 변경해야 하는가? 그리고 얼마나 다양한 곳에서 코드를 변경해야 하는가?
우리가 코드를 변경하면서 가장 많이 어려움을 겪는 것은 사이드 이펙트를 예상해서 미리 해결해야 하는 것이다. 사이드 이팩트가 발생하는 이유는 우리가 수정하려는 객체나 메소드가 너무 다양한 곳에서 사용되어서 그런 것 인데, 이러한 문제를 미리 예방하고 또 해결하는 것이 의존성을 줄이는 것이다.
하지만 변경이 두렵다고 의존성을 무한정 줄일 수 도 없는 노릇이다. 객체지향이란 객체간의 메시징을 통해서 상호작용하는 것을 의미하기 때문이다.
3. 설계 개선하기
앞서 언급한 2가지 문제점을 설계를 개선해서 해결해보자. 예상을 빗나가는 코드를 예상할 수 있도록 만들고, 변경에 취약한 코드를 변경에 용이한 코드로 만드는 것이다.
자율성을 높이자
이 챕터에서는 개념적이나 물리적으로 객체 내부의 세부적인 사항을 감추는 캡슐화를 진행한다. 또한 캡슐화를 통해서 인터페이스와 구현을 분리하고, 이를 통해서 결합도가 낮아지고 변경에 유연하도록 해준다.
무엇이 개선됐는가
수정을 통해 각 객체의 자율성을 가지고 행동하므로서 예상할 수 있는 코드가 되었고, 인터페이스와 구현을 분리하므로서 변경에 용이한 코드가 되었다.
어떻게 한 것인가
객체의 자율성을 높히는 방향으로 설계했더니(캡슐화를 잘 했더니) 이해하기 쉽고 유연한 설계를 얻을 수 있었다!
캡슐화와 응집도
자율성을 높히는 키포인트는 바로 객체간에 오직 메시지를 통해서만 상호작용 하도록 한 것이다.(Tell, don't ask) 이는 세부 기능과 상태를 캡슐화 하므로서 할 수 있었고, 이는 높은 응집도의 객체를 만들 수 있었다.
절차지향과 객체지향
- 절차지향 프로그래밍
프로세스와 데이터를 별도의 모듈에 위치시키는 방식 - 객체지향 프로그래밍
프로세스와 데이터가 동일한 모듈 내부에 위치시키는 방식
우리가 최초로 작성한 예제 코드는 절차지향 프로그래밍의 예시이고, 변경된 예제 코드는 객체지향 프로그래밍의 예시이다. 다시말해서 앞서 문제를 식별하고 해결한 과정은 절차지향 프로그래밍에서 객체지향으로 패러다임이 변하는 모습을 보여준 것이며, 이에 따라 얻게 된 장점을 나열 한 것이다.
절차지향은 정의 때문에 필연적으로 이해하기 어렵고, 변경에 유연하지 못하다. 하지만 객체지향은 캡슐화를 이용해 의존성을 적절히 관리함으로서 객체사이의 결합도를 낮춘다. 이를 통해 이해할 수 있으며, 변경에 유연한 코드가 되는 것이다.
더 개선할 수 있다
사실 앞선 예제 코드의 개선활동에서 완전히 자율적인 객체들 만으로 구성된 코드를 만들지는 않았다. 이러한 부분을 해결한다면 추가적인 의존성이 생기기 때문이다.
앞서 언급했듯, 결합도를 높히는 것은 변경에 유연하지 못한 코드를 만들게 된다. 이번 코드 변경은 자율성을 높히고 캡슐화를 더 강하게 만들어서 정보은닉과 객체 상태를 변경하는 지점이 적어지는 것을 목적으로 했으나, 추가적으로 결합도가 높아지는 문제를 수반하게 되었다.
결국 완벽한 설계라는 것은 없는 것이다. 설계는 트레이드오프의 결과물이며, 설계는 균형의 예술인 것이다.
그래, 거짓말이다!
앞서서 Theater과 Bag, TicketOffice가 자율성을 가져야 한다는 것은 자연스러운가? 이상하다. 앞서서 우린 예상할 수 있는 코드를 작성해야 한다고 이야기하면서 의식대로 흘러가는 코드가 필요하다고 말했다. 그럼 객체지향이란 의식에 따라서 흘러갈 수 없으며, 예상할 수 있는 코드를 만들어야 한다는 사실은 순전히 거짓말인 것인가?
그래 거짓말이다! 객체지향의 세계는 현실과 똑같지 않아서 언제나 의식에 부합하는 코드만을 만들 수 없다. 객체지향의 세계에서는 모든 객체가 능동적이고 자율적인 존재가 된다. 이를 의인화원칙이라고 부른다.
4. 객체지향 설계
설계가 왜 필요한가
설계란 코드를 배치하는 것이다
설계는 변화를 수용할 수 있는 형태로 코드를 배치하는 것이 중요하다. 변경을 수용할 수 있는 설계가 중요한 이유는 코드를 변경할 때 버그가 추가될 가능성이 높기 때문이다. 우리는 필연적으로 코드를 수정하게되고, 이때 발생하는 버그는 우리에게 두려움을 불러 일으켜서 코드 수정을 회피하게 한다.(이에대한 좋은 해결방안인 TDD가 있다.)
객체지향 설계
앞서 언급한 이유로 변경에 유연하게 대응할 수 있는 코드가 좋은 설계이다. 객체지향 프로그래밍은 의존성을 효율적으로 통제할 수 있는 다양한 방법을 제공함으로써 요구사항 변경에 좀 더 수원하게 대응할 수 있는 가능성을 높여준다.
'책 리뷰' 카테고리의 다른 글
오브젝트[03 역할, 책임, 협력] (0) | 2022.12.18 |
---|---|
오브젝트[02 객체지향 프로그래밍] (1) | 2022.12.13 |
데이터 파이프라인 핵심 가이드[03_일반적인 데이터 파이프라인 패턴] (0) | 2022.10.09 |
데이터 파이프라인 핵심 가이드[01_데이터 파이프라인 소개] (2) | 2022.09.25 |
함께 자라기 애자일로 가는 길(자라기) (0) | 2022.02.07 |