디자인 패턴의 아름다움 : 객체지향 패러다임부터 설계 원칙, 코딩 규칙, 리팩터링 기법, 디자인 패턴까지

디자인 패턴의 아름다움 : 객체지향 패러다임부터 설계 원칙, 코딩 규칙, 리팩터링 기법, 디자인 패턴까지

$37.80
저자

왕정

저자:왕정
구글에서번역관련시스템개발에참여했고10여년간알고리즘을연구해왔다.현재는금융회사에서수석시스템아키텍트로서회사의비즈니스아키텍처설계및개발을책임지고있다.데이터구조,디자인패턴,알고리즘에관심이있으며기술공유에진심이다.《데이터구조와알고리즘의아름다움》를집필하였다.

역자:김진호
25년차소프트웨어개발자로싸이월드,티맵등의모바일솔루션을개발했으며,사우디아라비아등중동의여러국가,인도네시아,멕시코의은행결제시스템을개발해왔다.이후K-POP,블록체인,정보관리등다양한분야의스타트업에서CTO를역임하다가2023년부터애자일솔루션업체의개발이사로근무중이다.저서로는《실전안드로이드프로그래밍》(케이엔피IT,2011),《갤럭시S&안드로이드폰완전정복》(이비락,2010),《갤럭시S안드로이드폰어플활용백서》(글로벌,2010),《입문자를위한WindowsCEProgramming》(가남사,2002)등다수가있다.

목차

옮긴이머리말xiii
베타리더후기xiv
시작하며xvi

CHAPTER1개요1
1.1코드설계를배우는이유1
__1.1.1고품질의코드작성2/1.1.2복잡한코드개발다루기2
__1.1.3프로그래머의기본능력4/1.1.4경력개발에필요한기술5
__1.1.5생각해보기5
1.2코드품질평가방법6
__1.2.1유지보수성8/1.2.2가독성9/1.2.3확장성10/1.2.4유연성10
__1.2.5간결성11/1.2.6재사용성11/1.2.7테스트용이성12/1.2.8생각해보기12
1.3고품질코드를작성하는방법12
__1.3.1객체지향13/1.3.2설계원칙13/1.3.3디자인패턴14
__1.3.4코딩규칙15/1.3.5리팩터링기법15/1.3.6생각해보기17
1.4과도한설계를피하는방법18
__1.4.1코드설계의원래의도는코드품질을향상시키는것이다18
__1.4.2코드설계의원칙은앞에문제가있고,뒤에방안이있다는것이다18
__1.4.3코드설계의응용시나리오는복잡한코드에적용되어야한다19
__1.4.4지속적인리팩터링은과도한설계를효과적으로방지할수있다20
__1.4.5특정시나리오외의코드설계에대해이야기하지않는다20
__1.4.6생각해보기21

CHAPTER2객체지향프로그래밍패러다임23
2.1객체지향이란무엇인가?23
__2.1.1객체지향프로그래밍과객체지향프로그래밍언어23
__2.1.2엄격하게정의되지않은객체지향프로그래밍언어25
__2.1.3객체지향분석과객체지향설계26
__2.1.4UML에대한참고사항27
__2.1.5생각해보기28
2.2캡슐화,추상화,상속,다형성이등장한이유28
__2.2.1캡슐화28/2.2.2추상화31/2.2.3상속33/
__2.2.4다형성35/2.2.5생각해보기39
2.3객체지향분석,객체지향설계,객체지향프로그래밍을수행하는방법40
__2.3.1예제소개와난이도분석40
__2.3.2객체지향분석수행방법41
__2.3.3객체지향설계방법45
__2.3.4객체지향프로그래밍을하는방법53
__2.3.5생각해보기55
2.4객체지향프로그래밍,절차적프로그래밍,함수형프로그래밍의차이55
__2.4.1절차적프로그래밍55
__2.4.2객체지향프로그래밍과절차적프로그래밍의비교59
__2.4.3함수형프로그래밍62
__2.4.4객체지향프로그래밍과함수형프로그래밍의비교69
__2.4.5생각해보기69
2.5객체지향프로그래밍처럼보이지만실제로는절차적프로그래밍70
__2.5.1getter,setter메서드남용70
__2.5.2전역변수와전역메서드의남용74
__2.5.3데이터와메서드분리로클래스정의하기77
__2.5.4생각해보기79
2.6빈약한도메인모델에기반한전통적인개발방식은OOP를위반하는가?79
__2.6.1빈약한도메인모델에기반한전통적인개발방식80
__2.6.2풍성한도메인모델에기반한DDD개발방식82
__2.6.3두가지개발방식의비교83
__2.6.4빈약한도메인모델에기반한전통적인개발방식이널리사용되는이유90
__2.6.5풍성한도메인모델에기반한DDD개발방식의응용시나리오91
__2.6.6생각해보기92
2.7추상클래스와인터페이스93
__2.7.1추상클래스와인터페이스의정의와차이점93
__2.7.2추상클래스와인터페이스의의미97
__2.7.3추상클래스와인터페이스의모의구현100
__2.7.4추상클래스와인터페이스의응용시나리오102
__2.7.5생각해보기102
2.8인터페이스기반프로그래밍:
모든클래스에대해인터페이스를정의해야할까?102
__2.8.1인터페이스를이해하는다양한방법103
__2.8.2설계철학을실제로적용해보자104
__2.8.3인터페이스의남용을방지하려면어떻게해야할까?108
__2.8.4생각해보기109
2.9상속보다합성109
__2.9.1상속이더이상사용되지않는이유109
__2.9.2합성이상속에비해나은장점112
__2.9.3합성을사용할지상속을사용할지결정하기114
__2.9.4생각해보기115

CHAPTER3설계원칙117
3.1단일책임원칙117
__3.1.1단일책임원칙의정의및해석117
__3.1.2클래스에단일책임이있는지판단하는방법118
__3.1.3클래스의책임이가능한한자세하게설명되어있는지여부121
__3.1.4생각해보기123
3.2개방폐쇄원칙123
__3.2.1확장할때는개방,수정할때는폐쇄123
__3.2.2코드를수정하는것은개방폐쇄원칙을위반하는것일까?129
__3.2.3확장할때는개방,수정할때는폐쇄를달성하는방법131
__3.2.4프로젝트에개방폐쇄원칙을유연하게적용하는방법133
__3.2.5생각해보기134
3.3리스코프치환원칙134
__3.3.1리스코프치환원칙의정의134
__3.3.2리스코프치환원칙과다형성의차이점136
__3.3.3리스코프치환원칙을위반하는안티패턴137
__3.3.4생각해보기139
3.4인터페이스분리원칙139
__3.4.1API나기능의집합으로서의인터페이스139
__3.4.2단일API나기능으로서의인터페이스141
__3.4.3객체지향프로그래밍에서의인터페이스142
__3.4.4생각해보기149
3.5의존역전원칙149
__3.5.1제어반전150/3.5.2의존성주입152/3.5.3의존성주입프레임워크153
__3.5.4의존역전원칙154/3.5.5생각해보기155
3.6KISS원칙과YAGNI원칙155
__3.6.1KISS원칙의정의와해석155
__3.6.2적은줄수의코드가더간단하지않다156
__3.6.3복잡한코드가반드시KISS원칙을위반하는것은아니다158
__3.6.4KISS원칙을만족하는코드작성방법160
__3.6.5YAGNI원칙과KISS원칙의차이160
__3.6.6생각해보기161
3.7DRY원칙161
__3.7.1코드논리의중복161/3.7.2기능적(의미론적)중복164
__3.7.3코드실행의중복165/3.7.4코드재사용성167
__3.7.5생각해보기169
3.8LoD169
__3.8.1높은응집도와낮은결합도에대한생각169
__3.8.2LoD의정의171
__3.8.3정의해석및첫번째예제코드171
__3.8.4정의해석및두번째예제코드174
__3.8.5생각해보기177

CHAPTER4코딩규칙179
4.1명명과주석179
__4.1.1긴이름과짧은이름179
__4.1.2문맥정보를사용한명명단순화180
__4.1.3비즈니스용어집을사용한명명통일180
__4.1.4명명은정확하지만추상적이어야한다181
__4.1.5주석에반드시포함되어야하는것들181
__4.1.6주석이많다고좋은것은아니다183
__4.1.7생각해보기183
4.2코드스타일184
__4.2.1클래스,함수의적절한크기184
__4.2.2한줄의적절한길이185
__4.2.3빈줄을활용한코드블록구분185
__4.2.44칸들여쓰기혹은2칸들여쓰기185
__4.2.5여는중괄호는어디에놓여야할까186
__4.2.6클래스의멤버순서186
__4.2.7생각해보기187
4.3코딩팁187
__4.3.1복잡한코드의모듈화187/4.3.2함수의매개변수관리188
__4.3.3함수의플래그매개변수제거189/4.3.4깊은중첩코드제거191
__4.3.5설명변수194/4.3.6생각해보기195

CHAPTER5리팩터링기법197
5.1리팩터링의네가지요소:목적,대상,시기,방법197
__5.1.1리팩터링의목적197/5.1.2리팩터링의대상199
__5.1.3리팩터링의시기199/5.1.4리팩터링의방법200
__5.1.5생각해보기201
5.2단위테스트201
__5.2.1단위테스트에대해201
__5.2.2단위테스트코드를작성하는이유204
__5.2.3단위테스트를설계하는방법206
__5.2.4단위테스트를작성하기어려운이유209
__5.2.5생각해보기210
5.3코드테스트용이성210
__5.3.1테스트가능한코드를작성하는방법210
__5.3.2테스트가불가능한코드220
__5.3.3생각해보기222
5.4디커플링223
__5.4.1디커플링이중요한이유223
__5.4.2코드를디커플링해야하는지판단하기223
__5.4.3코드디커플링방법224
__5.4.4생각해보기227
5.5리팩터링예제227
__5.5.1ID생성기의요구사항과개발배경228
__5.5.2사용가능한수준의코드구현228
__5.5.3코드품질문제를찾는방법230
__5.5.4가독성향상을위한리팩터링232
__5.5.5코드테스트용이성향상을위한리팩터링234
__5.5.6단위테스트코드작성을위한리팩터링236
__5.5.7예외처리를위한리팩터링239
__5.5.8생각해보기251

CHAPTER6생성디자인패턴253
6.1싱글턴패턴(1)253
__6.1.1싱글턴패턴의정의253/6.1.2싱글턴패턴의구현254
__6.1.3싱글턴패턴의적용259/6.1.4싱글턴패턴의단점263
__6.1.5싱글턴패턴의대안266/6.1.6생각해보기268
6.2싱글턴패턴(2)268
__6.2.1싱글턴패턴의유일성268
__6.2.2스레드전용싱글턴패턴269
__6.2.3클러스터환경에서의싱글턴패턴270
__6.2.4다중인스턴스패턴272
__6.2.5생각해보기273
6.3팩터리패턴(1)273
__6.3.1단순팩터리패턴274/6.3.2팩터리메서드패턴278
__6.3.3추상팩터리패턴281/6.3.4팩터리패턴의적용대상283
__6.3.5생각해보기283
6.4팩터리패턴(2)284
__6.4.1DI컨테이너와팩터리패턴의차이284
__6.4.2DI컨테이너의핵심기능284
__6.4.3DI컨테이너의설계와구현287
__6.4.4생각해보기292
6.5빌더패턴293
__6.5.1생성자를사용한객체생성293
__6.5.2setter메서드를사용한멤

출판사 서평

객체지향프로그래밍,설계원칙,코딩규칙,리팩터링,디자인패턴으로코드품질을높이자

개발자는연차가쌓일수록코드의품질을올리고싶은욕구에휩싸인다.하지만안타깝게도많은기업의개발부서는기능하나하나를만들어내고일정을쳐내는데급급한실정이다.작성해놓은코드가동작만한다면다시들춰볼시간도,여유도없다.그런데이렇게급하게만든코드를유지보수하다보면막막해져서모든코드를삭제하고다시작성하고싶어진다.

그렇다면고품질의코드는어떻게작성할까?엄격한코드품질관리로유지보수비용을현저히낮추는개발환경(구글)에서근무했던저자는코드설계에대한이론지식을먼저갖추는것을추천한다.코드설계이론지식은코드의유지보수성,가독성,확장성,유연성,간결성,재사용성,테스트용이성을높이는데도움이된다.

책의1장에서는고품질의코드란무엇인지정의하고과도한설계를피하는법을알려준다.2장에서는설계원칙과디자인패턴의기초에해당하는객체지향프로그래밍을소개하고,3장에서는SOLID원칙,KISS원칙,YAGNI원칙,DRY원칙,LoD원칙등중요한설계원칙을소개한다.

4장에서는명명,주석,코드스타일,코딩팁을포함한코딩규칙을배울수있고,5장에서는리팩터링의네가지요소와단위테스트,코드테스트용이성,디커플링등을다루고예제와함께리팩터링기술을익힌다.

6장,7장,8장은각각생성,구조,행동세가지분류로나눠22가지디자인패턴을소개한다.6장에서는싱글턴패턴,팩터리패턴,빌더패턴,프로토타입패턴을포함한생성디자인패턴을,7장에서는프록시패턴,데커레이터패턴,어댑터패턴,브리지패턴,퍼사드패턴,복합체패턴,플라이웨이트패턴을포함한구조디자인패턴을소개한다.8장에서는옵서버패턴,템플릿메서드패턴,전략패턴,책임연쇄패턴,상태패턴,반복자패턴,비지터패턴,메멘토패턴,커맨드패턴,인터프리터패턴,중재자패턴등행동디자인패턴을소개한다.

이책의코드는대부분자바로작성되었지만,다루는내용과설명은특정프로그래밍언어와관련이없으며어떤프로그래밍언어를사용하더라도모두읽을수있다.코딩능력을향상하고싶은모든개발자들에게추천한다.

책속에서

우리는종종코드품질에주의를기울여야하고코드를작성하기전에코드설계단계를무시하지않아야한다고말한다.코드를설계하지않는것은좋지않지만,과도하게설계하는것도좋지않다.과거업무경험동안많은동료를겪었는데,특히코드를과도하게설계하고디자인패턴을남용하는것을좋아하지만개발경험이적은엔지니어들이있었다.그들은코딩을시작하기도전에코드설계작업에오랜시간을할애한다.간단한요구사항이나단순한코드의경우코드가더유연하고향후확장을위한견고한기반이되기를바라며개발프로세스에서다양한디자인패턴을적용하는경우가많다.하지만과도한설계는나중에요구사항이변하지않을수도있기때문에,이런시도는코드의복잡성만높일뿐이다.따라서우리는과도한설계를피하는방법,특히객체지향프로그래밍패러다임,설계원칙,코딩규칙,리팩터링과같이디자인패턴의남용을피하는방법에대해이야기할필요가있다.
---p.18

그러나일반적으로대부분의프로그래머는종종객체지향분석과객체지향설계를머릿속이나간단한스케치로마친후바로코드작성을시작할뿐만아니라,코드작성도중에도최적화와리팩터링을하는경우가많다.반대로코드를작성하기전에객체지향분석과설계에많은시간을할애하고단단한클래스다이어그램과UML다이어그램을그렸더라도,모든세부사항과상호작용에대해한번에다정의하는것은불가능하다.코드를작성하면서여전히코드를뒤엎어리팩터링하고,또이를반복해야한다.결국소프트웨어개발은본질적으로지속적인반복,패치,문제발견,문제해결의과정이며,지속적인리팩터링의과정이다.엄격하게하나의단계를모두마치고다음단계로넘어가는것이불가능하다는것을알아야한다.
---p.55

리스코프원칙에는좀더이해하기쉬운설명방식이있는데,바로계약에따른설계(designbycontract)라는표현이다.하위클래스를설계할때는상위클래스의동작규칙을따라야한다.상위클래스는함수의동작규칙을정의하고하위클래스는함수의내부구현논리를변경할수있지만함수의원래동작규칙은변경할수없다.여기서말하는동작규칙에는함수가구현하기위해선언한것,입력,출력,예외에대한규칙,주석에나열된모든특수사례설명이포함된다.사실여기에서언급된상위클래스와하위클래스간의관계는인터페이스와구현클래스간의관계로대체될수도있다.
---p.137

팩터리패턴은동일한상위클래스나인터페이스를상속하는하위클래스그룹과같이유형은다르지만연관되어있는객체를생성할때사용되며,이때어떤유형의객체를생성할지는미리지정된매개변수에의해결정된다.반면에빌더패턴은동일한유형의복잡도가높은객체를생성하는데,이때선택적인매개변수를설정하거나사용자정의를통해다른객체를생성한다./두패턴의차이점은고전적인예를통해쉽게이해할수있다.고객이식당에들어가서주문을하면팩터리패턴을사용하여고객의선택에따라피자,버거,샐러드와같은다양한음식을만들고,빌더패턴을통해치즈,토마토,베이컨등고객이선택한다양한토핑을얹은피자를만들수있다.
---p.301

메멘토패턴을적용할때,백업할객체가상대적으로크거나백업빈도가높으면스냅숏이차지하는메모리가상대적으로많아지고,백업과복구에드는시간이상대적으로길어진다.이문제를해결하는방법은무엇일까?/응용시나리오마다각각에최적화된다양한해결방안이있기마련이다.예를들어8.10.1절에서살펴본예제는메멘토패턴을이용하여실행취소기능을구현했는데,이때순차적인실행취소만지원한다.즉,실행을취소할때마지막에입력한텍스트만취소할수있으며,이를건너뛰고이전에입력한텍스트를취소할필요가없다.이경우에는메모리를절약하기위해전체텍스트를스냅숏에저장하는대신소량의정보만따로기록할수있다.스냅숏을얻을때입력했던텍스트의길이를얻어오면원본텍스트에서해당길이만큼잘라내는방법을쓰면된다.
---p.489