'가독성'에 해당되는 글 2건

  1. 2007/08/11 클래스 갯수 줄이기 with spring IoC configuration (13)
  2. 2007/02/09 3n+1문제와 가독성...그리고 객체 (17)
상속을 통해서 클래스 갯수를 줄이고 있던 디자인이 있었다. 거의 7개 가량의 갯수를 줄이기 위해서 디자인이 깨지는 것을 보면서도 이게 실용적(?)이라고 생각을 하면서 클래스 갯수를 줄였지만, 영 마음이 불편했다. OOP의 원칙을 깨가면서 만든 디자인이었기때문이다.

불편한 마음을 없애기 위해서 과감하게 클래스 갯수를 늘렸다. 일단, 원칙을 지키면서 점진적으로  refactoring을 하기로 결심을 했다. 대략적인 윤곽은 마음 속에 있었지만, 사실 목적은 분명하지 않은채 점진적으로 변경을 꾀하면서 변경된 코드 안에서 좀더 나은 디자인으로 개선을 해나갔다.

대략의 과정을 설명을 하자면,
구현 상속으로 되어 있던 디자인을 delegate를 통해서 데코레이션 패턴(나..이 패턴 너무 좋아한다..^^;)으로 변경하고 , 인터페이스만을 wiring하는 클래스를 만들고, dependency injection을 spring config에서 설정을 통해서 인스턴스 생성과 Factory에 등록을 했다.

디자인을 변경 후 3가지의 장점을 가질 수가 있었다.

1. 테스트가 쉬워졌다.
구현상속은 많은 dependency를 가지게 된다. dependency를 하나의 인터페이스로 추상화가 가능했고, 하나의 mock을 생성해서 테스트를 할 수가 있었고, 확장하는 클래스에서 필요한 클래스들만 mo필ck으로 만들어서 테스트를 하면 되었기때문에 테스트를 작성하기 쉬웠다.

2. 코드의 이해가 쉬워졌다.
구현에 대해서 집착을 하지 않아도 되고, 클래스 자체만 봐도 이해를 하기 쉬웠다. 다른 클래스들과의 관계는 이 클래스를 이해하는데, 별다른 장벽이 되지 않았다.

3. 객체지향원칙을 지킬 수 있었다.
부모 클래스에서 확장되어지는 자식 클래스때문에 로직이 추가가 되면 안된다. 비즈니스 로직 특성상 피하기 어려웠지만, 최소한의 변경으로 디자인이 깨지는 것을 피할 수 있었다. 즉, 자식과 관련되서 if문이 증가하지 않았다.

아마 spring configuration을 사용하지 않았다면, 클래스 갯수를 7개정도 늘려서 DI를 해주는 상황이었다. 원칙에 따라서 디자인을 개선을 하고 나니 나름 볼만한 코드가 되었다. 클래스 갯수가 총 8개가 늘어나야 할 상황이었지만, 7개에 해당하는 dependency부분을 spring IoC가 해결을 해주었고, 인터페이스를 wiring하는 심플한 하나의 클래스만 늘어나게 되었다. spring config를 통한 IoC가 아니었어도, 클래스 갯수를 늘려서 확장하는 것이 좋은 선택이었을 것이다. 그 좋은 선택 안에서 spring IoC는 좀더 나은 기쁨을 준 것이다.

사실, 서비스되고 있는 코드를 refactoring하는 것은 쉬운 일은 아니지만, 계속된 찜찜한 마음의 짐을 떨치고 싶었다. 좀더 자신감을 가지고 변경을 꾀할수 있었던 것은 테스트가 된 구현 클래스들을 인터페이스 기반으로 조립하는 일이었기때문에 가능했다. 구현을 다시한 부분은 거의 없고, 클래스들 간의 관계를 바꾸는 디자인 개선작업이어서 좀더 편하게 변경을 가할수 있었다.



Posted by ologist

코드의 의도
http://www.ologist.co.kr/507

위에 많은 덧글들이 달려서 덧글 및 트랙백을 통해서 느낌점을 얘기해보려 합니다.

cycle length calculator
http://cavin.egloos.com/3049122

이 이야기의 시작은 바로 위에 있는 링크입니다.

애시당초 number 라는 변수의 이름 자체가 모호해서 생긴 문제를 불필요하게 해결한 건 아닌가 하는 생각이 듭니다. - 이희승

네이밍을 잘 지으면, 구현이 단순해질수 있다는 교훈을 희승님이 남겨주셨습니다. 하지만, 3n+1 문제를 가지고 더 좋은 이름을 지어 보려고 하는데, 생각이 잘 안나더군요...OTL

그래서, 저도 cavin님과 똑같이 이름을 짓고, extract local varibable이나 extract method를 통해서 의도를 전달을 했을 것입니다.

일단, 여기까지 코드를 작성을 합니다. 그리고, 좀더 많은 부분을 구현을 하다가 보면, 또는 pair나 코드리뷰를 통해서 더 좋은 이름이 나오면 refactoring을 통해서 불필요한 코드들을 제거를 하면 됩니다. cavin님은 테스트 케이스가 있어서 더욱더 쉽게 refacotring을 할수가 있습니다.

희승님의 아름다운 작명을 기대를 했는데, 조금 바쁘신듯 합니다...^^

3n+1문제 관련하여..
http://cavin.egloos.com/3085039

오픈마인드는 많은 경험을 갖게 하는 듯하다. 자신이 만든 소스를 공개를 한다는 것은 쉬운 일이 아니지만, 공개를 하면 더욱더 많은 경험과 좋은 의견들을 들을수가 있다.

과거에 1999년도쯤 자바를 처음하면서 고수들의 코득다 무척 궁금했을 때가 있었지만, 이원영님을 제외하고는 대부분의 사람들이 소스를 공개를 잘 하지 않아서 실제 잘 만들어진 코드를 보기 어려웠다. 지금은 오픈소스도 많이 있고, 주위에 많은 분들이 소스를 공개를 하셔도 많은 도움이 된다.

팀내에서 코드리뷰를 통해서 내가 너무 형식적으로 구현한 것들에 대한 불편함을 알수도 있게 된다. 사실 구현을 해두고 시간이 지나면서 좀더 도메인 영역을 자세히 알면서 매일 꾸준히 리팩터링을 하고 있지만, 정말 꼭 맘에 드는 아름다운 코드를 만들어 내는 일은 쉬운일이 아니다.

API 및 코드가 오픈이 되고, 사용자들의 의견이 더해질때 좀더 의미있는 객체들이 탄생을 하게 된다고 생각을 합니다.

김창준임이 가독성에 대한 좋은 이야기를 해주셨습니다.
prefactoring을 책을 보다가 보면, 극단적인 가독성과 추상화에 대한 좋은 이야기들이 나온다.

저의 생각은 최소한 클라이언트가 사용하는 인터페이스에서는 극단적으로 가독성과 추상화를 지켜주었으면 하는 생각이다. 내가 만든 코드가 애매하게 보일때, 메타포에 대한 지식이 있는 사람과 없는 사람은 가독성에 대해 현저한 차이가 난다.

아래 이야기는 비슷한 관점에서 나온 것이 아닐까 생각을 해봅니다.

만약 코드가 비지니스 로직이 들어가고 그 로직이 domain-rich하다면 되도록 가독성을 추구하겠지만(가독성은 독자에 따른 상대적 개념이라는 것을 명심하면서), 저는 때로 가독성을 손해보면서까지 중복을 줄이기도 합니다. - 김창준

자바지기 아저씨도 그와 관련해서 좋은 이야기를 적어주었다.
http://wiki.javajigi.net/pages/viewpage.action?pageId=7565

프리팩토링

Ken Pugh / 한빛미디어



객체지향에서 그걸 하다 보면 흥미로운 객체들을 발견합니다. 함수형에서 그렇게 하다 보면 흥미로운 함수와 함수의 함수(functional)를 발견합니다. 이 "흥미로운 무엇"은 강력합니다. 내가 전에 모르던 것을 배우게 됩니다. 그리고 종종 이것은 프로그래머의 울타리를 넘어서 영향력을 끼치기도 합니다. 고객들의 대화가 바뀔 수도 있습니다.

객체지향을 하면서 흥미로운 객체들을 발견하지 못한다면 너무 고리타분한 코딩은 아닐까 생각합니다. - 김창준

김창준님의 흥미로운 객체에 대한 이야기는 DDD책에서 나오는 이야기와 일맥상통한다. cohesive하고, 도메인 객체 자신이 많은 이야기를 할수 있는 객체는 내가 코딩을 할때 큰 기쁨을 줍니다. DDD에서는 RIch Domain을 만들어가는 것은 쉽지 않은 일이지만, 진정한 Rich한 Domain객체를 만드는 일은 정말 의미있는 일이라고 나옵니다.

객체지향을 하다가 보면, 흥미로운 객체, Rich한 Domain객체에 대해 만들고 싶은 마음이 많습니다. 하지만, 제 경우에는 한번에 만들어지지 않고, 이리저리 refactoring을 하다가 발견이 되더군요. 김창준님 애기처럼 발견이라는 말이 더 어울립니다.

김창준님, 이희승님, cavin님 덧글 고맙습니다...^^

Posted by ologist
 TAG 3n+1, cavin, OOP, 가독성
이전버튼 1 이전버튼

블로그 이미지
ologist

공지사항

Yesterday221
Today25
Total34,406

달력

 « |  » 2012.02
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29      

최근에 받은 트랙백

글 보관함