객체지향 시스템 디자인 원칙

객체지향 시스템 디자인 원칙

$24.00
Description
객체지향 시스템 디자인, 이 책으로 시작하자!
간단한 예제를 통해 개념을 쉽게, 실질적인 코드로 이해를 깊게!
객체지향은 복잡성을 합리적으로 다루기 위해 고안된 수단이다. 객체지향 시스템을 제대로 디자인하려면 수많은 경험과 훈련이 필요하고, 이를 다룬 두꺼운 책이 엄청나게 많다. 하지만 결국 객체지향 디자인은 객체들을 통해 작동하는 시스템에 질문하는 것이다. 복잡도를 낮추고, 코드 단위를 작게 유지하고, 객체 상태의 일관성을 유지하고, 의존성을 적절히 제어하며, 적절한 추상화를 통해 개발자의 인지 부하를 줄이는 동시에 시스템의 확장성을 높이고, 모듈화로 응집도는 높이고 결합도는 낮추는 방법에 대해 질문해야 한다. 이 질문들의 의미를 알고, 객체 시스템에 적용하는 방법을 알기 위해서는 복잡한 이론보다 간단한 예제를 통해 실질적인 코드를 보면서 이해를 늘려 나가는 것이 좋다고 생각한다. 이 책이 바로 그런 책이다. 좋은 객체지향 디자인을 위한 여러 조언을 제시하면서 각 개념을 쉽게 이해할 수 있는 코드 예제를 보여주고, 객체지향 시스템을 개발하는 과정에서 해야 할 일과 하지 말아야 할 일을 알려준다. 객체지향 디자인을 배우고 싶은 개발자는 예제를 통해 개념을 쉽게 잡아낼 수 있고, 이미 객체지향 디자인에 대해 잘 아는 개발자는 이 책의 조언들을 자신의 경험과 비교하면서 객체지향 디자인 개념을 더 잘 이해할 수 있을 것이다. (옮긴이의 말 중에서)
저자

마우리시오아니체

저자:마우리시오아니체
현재아디옌(Adyen,네덜란드기술기업)에서테크리드로근무하며,아디옌의테크아카데미를포함해엔지니어를위한추가교육과훈련에중점을둔엔지니어링지원이니셔티브팀을이끌고있다.또한네덜란드델프트공과대학교(DelftUniversityofTechnology)에서소프트웨어공학조교수로재직중이다.소프트웨어테스트교육에대한노력으로2021년올해의컴퓨터과학교사상을받았고,혁신적인강사에게수여되는명예로운TU델프트교육펠로우십(DelftEducationFellowship)을받았다.2022년에는『EffectiveSoftwareTesting:ADeveloper'sGuide』(Manning)를출간했다.소프트웨어엔지니어들이더나은,더생산적인엔지니어가될수있도록돕는것을목표로하고있다.

역자:오현석
모빌리티42이사로일하면서매일고객의요청에따라코드를만드는현업개발자다.『코틀린함수형프로그래밍』(에이콘,2023)등코틀린서적을여러권번역했고,코틀린외에도『실전파이썬핸즈온프로젝트』(책만,2022),『읽고나면진짜쉬워지는자료구조』(길벗,2024)등다양한프로그래밍언어와프로그래밍기술에대한책을번역했으며,『핵심코틀린프로그래밍』(에이콘,2023)책을쓴저자이기도하다.

목차

1장모든게복잡도관리다
1.1객체지향디자인과시간이주는시련
1.2단순한객체지향시스템디자인
__1.2.1단순한코드
__1.2.2일관성있는객체
__1.2.3적절한의존성관리
__1.2.4좋은추상화
__1.2.5외부의존성과인프라적절히다루기
__1.2.6좋은모듈화
1.3일상적인활동으로서의단순한디자인
__1.3.1복잡성줄이기는개인위생과비슷하다
__1.3.2복잡성이필요할수도있지만영구적이어서는안된다
__1.3.3지속적으로복잡성을해결하는것이비용효율적이다
__1.3.4고품질코드는좋은실무프랙티스를촉진한다
__1.3.5복잡성을통제하는것은생각보다어렵지않다
__1.3.6디자인을단순하게유지하는것은개발자의책임이다
__1.3.7이정도면충분히좋은디자인이다
1.4정보시스템의아키텍처에대해간략히살펴보기
1.5예제:피플그로우!
1.6연습문제
1.7요약

2장코드를작게유지하기
2.1코드단위를작게만들라
__2.1.1복잡한메서드를비공개메서드로나눠라
__2.1.2복잡한코드단위를다른클래스로옮겨라
__2.1.3코드를작은단위로나누지말아야할때
__2.1.4리팩터링하기전에전체적으로살펴보라
__2.1.5예제:직원데이터임포트하기
2.2코드를읽기쉽게만들고문서화하라
__2.2.1좋은이름을계속찾아라
__2.2.2의사결정을문서화하라
__2.2.3코드에주석을추가하라
__2.2.4예제:오퍼링내용변경안내이메일을언제발송할지결정하기
2.3새로운복잡성을기존클래스에서분리하라
__2.3.1복잡한비즈니스로직을자체클래스로분리하라
__2.3.2큰비즈니스흐름을분해하라
__2.3.3예제:오퍼링에대한대기자명단
2.4연습문제
2.5요약

3장객체의일관성유지하기
3.1항상일관성을유지하라
__3.1.1클래스가스스로일관성을책임지게하라
__3.1.2전체작업과복잡한일관성검사를캡슐화하라
__3.1.3예제:Employee엔터티
3.2효과적인데이터유효성검사메커니즘을디자인하라
__3.2.1사전조건을명시적으로정의하라
__3.2.2유효성검증컴포넌트를만들라
__3.2.3null은신중하게사용하고,피할수있다면피하라
__3.2.4예제:교육과정에직원추가하기
3.3상태확인을캡슐화하라
__3.3.1명령하라,질문하지마라
__3.3.2예제:오퍼링의빈자리확인
3.4필요한게터와세터만제공하라
__3.4.1상태를변경하지않고클라이언트에너무많은정보를노출하지않는게터
__3.4.2세터는객체를설명하는속성에만사용한다
__3.4.3예제:Offering클래스의게터와세터
3.5객체집단의불변조건을보장하도록애그리게이트를모델링하라
__3.5.1애그리게이트루트의규칙을깨지마라
__3.5.2예제:Offering애그리게이트
3.6연습문제
3.7요약

4장의존성관리하기
4.1고수준코드와저수준코드를분리하라
__4.1.1안정적인코드를디자인하라
__4.1.2인터페이스발견098
__4.1.3고수준코드와저수준코드를분리하지않아도되는경우
__4.1.4예제:메시지처리작업
4.2불필요한세부사항이나요소에의존하는것을피하라
__4.2.1여러분이소유한클래스만요구하거나반환하라
__4.2.2예제:HTTP봇을채팅SDK로대체하기
__4.2.3클라이언트에게필요한것이상을제공하지마라
__4.2.4예제:오퍼링목록
4.3너무많은클래스에의존하는클래스를분리하라
__4.3.1예제:MessageSender서비스분리하기
4.4의존성을주입하라(의존성주입을사용하라)
__4.4.1상태를변경하는작업에정적메서드를사용하지마라
__4.4.2항상협력자를주입하라:그외에는원하는대로하라
__4.4.3클래스와의존성을함께생성하는전략
__4.4.4예제:MessageSender와협력자들의의존성주입
4.5연습문제
4.6요약

5장추상화잘디자인하기
5.1추상화와확장지점을디자인하라
__5.1.1추상화의필요성식별하기
__5.1.2확장지점디자인하기
__5.1.3좋은추상화의속성
__5.1.4추상화에서배워라
__5.1.5추상화에대해배워라
__5.1.6추상화와결합
__5.1.7예제:직원에게배지수여하기
5.2중요한비즈니스규칙을일반화하라
__5.2.1일반화된비즈니스규칙과구체적인데이터를분리하라
__5.2.2예제:배지규칙일반화하기
5.3단순한추상화를선호하라
__5.3.1경험적규칙
__5.3.2단순한것이항상더낫다
__5.3.3이쯤되면추상화를고려해야한다
__5.3.4처음부터추상화를모델링하는것을두려워하지마라
__5.3.5예제:배지예제다시보기
5.4연습문제
5.5요약

6장외부의존성과인프라다루기
6.1도메인코드와인프라를분리하라
__6.1.1인터페이스가필요한가?
__6.1.2코드에서는세부사항을숨기고,개발자에게는숨기지마라
__6.1.3인프라변경하기:괜한걱정일까,실제로일어날까?
__6.1.4예제:데이터베이스접근과메시지봇
6.2인프라를최대한활용하라
__6.2.1디자인을망가뜨리지않도록최선을다하라
__6.2.2예제:등록취소하기
6.3자신이소유한것에만의존하라
__6.3.1프레임워크와싸우지마라
__6.3.2간접누출에주의하라
__6.3.3예제:메시지봇
6.4저수준인프라오류를고수준도메인오류로캡슐화하라
__6.4.1예제:SDKBot의예외처리
6.5연습문제
6.6요약

7장모듈화달성하기
7.1깊이있는모듈을구축하라
__7.1.1변경의영향을줄이는방법을찾아라
__7.1.2도메인경계를지속적으로다듬어라
__7.1.3관련된항목을가까이유지하라
__7.1.4우발적인결합을피하되,불가피하다면문서로남겨라
7.2인터페이스를명확히디자인하라
__7.2.1모듈의인터페이스를단순하게유지하라
__7.2.2하위호환성을갖춘모듈
__7.2.3깔끔한확장지점을제공하라
__7.2.4다른요구사항을가진사람들이모듈을사용하는것처럼코딩하라
__7.2.5모듈은명확한소유권과참여규칙이있어야한다
7.3모듈간의친밀성을피하라
__7.3.1모듈과클라이언트가친밀성을없애는것을책임지게하라
__7.3.2내부클래스에의존하지마라
__7.3.3의존성의거미줄을모니터링하라
__7.3.4모놀리스인가,마이크로서비스인가?
__7.3.5모듈을분리하는방법으로이벤트를고려하라
__7.3.6예제:알림시스템
7.4연습문제
7.5요약

8장실용적인접근법
8.1실용적으로접근하되,딱필요한만큼만
8.2과감하게리팩터링하되,단작은단위로나눠서
8.3코드가완벽하지않다는사실을받아들여라
8.4재디자인을고려하라
8.5여러분은주니어개발자들에대한책임이있다
8.6참고문헌
8.7연습문제
8.8요약

찾아보기

출판사 서평

객체지향시스템,제대로디자인하라!
6가지원칙&실용적인접근방식을배우자!

객체지향디자인,단순하게유지하자!
개발자의작업대부분은기존시스템을유지하고발전시키는것이다.유지보수성이높은소프트웨어시스템을구축하려면좋은객체지향디자인이필요하며,좋은객체지향디자인의핵심요소는단순함이다.처음에시스템을잘디자인했다하더라도수정할때마다복잡성이증가한다.새로운클래스,메서드,기능이추가될때마다관리해야할상태와추상화가늘어난다.자연스러운복잡성증가에맞서디자인을단순하게유지하는건어려운일이지만,복잡성관리는소프트웨어시스템을효과적으로유지하고발전시키는데필수적인과정이다.복잡성을제어하고,객체지향디자인을단순하게유지할수있도록도와주는6가지디자인원칙에대해알아보자.

명확하고실용적인6가지원칙을깊이탐구하자!
객체지향코드베이스가성장하고변화하더라도단순하게유지할수있는실용적인설계원칙이자,모든객체지향언어에적용할수있는실용적인기법을모았다.그원칙을다음6가지측면으로나눠하나씩깊이탐구할것이다.각원리를더욱깊이있게이해할수있도록쉬운그림,실제와같은시스템예제,생각해볼수있는연습문제를준비했다.

코드를작게유지하는방법
객체의일관성을유지하는방법
의존성을적절하게관리하는방법
추상화를이해하고잘디자인하는방법
인프라를올바르게처리하고다루는방법
잘모듈화된디자인을달성하는방법

실무적인관점으로백엔드시스템예제를살펴보자!
각원칙의개념을먼저설명한뒤이원칙을어떻게적용하는지코드예제를통해실무적인관점에서설명한다.디자인패턴을설명하기위해이책전반에걸쳐피플그로우!라는가상의백엔드시스템예제를사용할것이다.피플그로우!를구축하는팀은현재유지보수문제에직면해있다.버그가발생하고,간단한변경이시스템의예기치않은영역에영향을미쳐변경사항을완료하는데며칠씩걸린다.피플그로우!의디자인결정을자세히알아보고이를개선하면서각원칙의맥락,장단점,원칙을적용해야할때와말아야할때도함께알아볼것이다.