객체지향프로그래밍,설계원칙,코딩규칙,리팩터링,디자인패턴으로코드품질을높이자
개발자는연차가쌓일수록코드의품질을올리고싶은욕구에휩싸인다.하지만안타깝게도많은기업의개발부서는기능하나하나를만들어내고일정을쳐내는데급급한실정이다.작성해놓은코드가동작만한다면다시들춰볼시간도,여유도없다.그런데이렇게급하게만든코드를유지보수하다보면막막해져서모든코드를삭제하고다시작성하고싶어진다.
그렇다면고품질의코드는어떻게작성할까?엄격한코드품질관리로유지보수비용을현저히낮추는개발환경(구글)에서근무했던저자는코드설계에대한이론지식을먼저갖추는것을추천한다.코드설계이론지식은코드의유지보수성,가독성,확장성,유연성,간결성,재사용성,테스트용이성을높이는데도움이된다.
책의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