Design Patterns in Ruby - 패턴으로 루비 이해하기
Design Patterns in Ruby (Addison-Wesley Professional Ruby Series) (Hardcover)라는 책을 읽게 되었다.
하드 커버와 붉은 표지가 인상적인 이 책은 GoF 디자인 패턴들에 대한 루비스러운 풀이를 보여준다. 구성은 대략 이런 식이다.
- 레포트를 출력할껀데, 레포트는 HTML, 텍스트 등 종류가 다양해. 이 문제를 어떻게 해결하지?
- GoF 왈, 알고리즘을 별도 객체로 분리하면 좋다고 했어. 그렇게 구현해보자.
- GoF 책에서 본 것 같은 코드 완성, 짝짝짝!
- 얘야~ 루비에는 코드 블록이라는게 있단다. 이걸 써보면 어떻겠니?
- 어머, 스트레티지 패턴이네? 더 짧고 쉽잖아? 좋은걸~ (반전)
- 스트레티지 패턴을 구현할 때는 컨텍스트와 스트레티지 사이의 커플링에 주의하렴 (Using & Abusing)
- 루비의 표준 라이브러리에는 스트레티지 패턴이 녹아 있단다. sort 메서드와 함께 사용하는 코드 블록이 그 예야 (in the wild)
- 정리
디자인 패턴이라는 말이 나온지는 십년이 훌쩍 지났지만 이 패턴들이 해결하려던 문제는 아직도 여전히 문제로 남아있다고 한다. 이 책은 오리 타입을 추구하고, 코드 블록이 있고, 너무 동적이여서 실행시(runtime)에 모든 것이 결정되는 '루비'라는 도구를 이용해 이 문제를 풀면서, 루비를 조금씩 발견해나간다. 내 생각에 이 책은 패턴을 설명하는 책이라기보다는 패턴과 패턴의 친구 언어(C++이나 자바)에 익숙한 독자에게 루비를 그들이 잘 이해할 수 있는 사고 틀을 가지고 루비를 알려주는 루비책이다. 12가지 패턴과 이를 해결하면서 얻게되는 루비 기술을 한번 연결해보자. 이 기술을 이용해 위에서 설명한 구성에서 '루비에서는 이렇게 쉽게 할 수 있어'라는 반전을 이끌어낸다.
- Template Method - 오리 타입
- Strategy - 코드 블록
- Observer - 모듈 믹스인
- Composite - 연산자(operator)도 메서드일 뿐
- Iterator - 유용한 Enumerable 모듈
- Command - Proc 객체
- Adapter - 루비 객체는 열려있다
- Proxy - method_missing
- Decorator - alias_method_chain
- Singleton - Singleton Class(self)
- Factory - 클래스도 객체일 뿐
- Builder - 메타 프로그래밍 맛보기
다시 이야기하지만, 이 책은 이미 패턴과 패턴의 친구 언어에 대해 조금은 들어서 알고 있는 개발자가 루비라는 동적인 언어를 배우고자할 때 유용한 책이다. 패턴과 루비 언어에 대해 잘 알고 있다면, 별로 특별할게 없는 내용이 되어버린다. 그 점이 책의 한계가 아닐까? 하지만 디자인 패턴을 루비식으로 잘 정리했다는데는 의미가 있다고 생각한다. 그 이상으로 나아가지 못한 점이 아쉬울 뿐이다.
사실 그런 시도는 있었다. 3부의 루비를 위한 패턴이 그것이다. 2부 마지막에 Interpreter 패턴을 소개하고 뒤이어 루비만의 패턴으로 Internal DSL(Domain Specific Language), 메타 프로그래밍, 설정보다는 관례를 다루고 있다. 이 3부가 이 책의 정수가 아닐까 싶은데, 소개를 약간 넘는 수준으로 깊은 내용을 다루지 못한 점이 아쉽다. 메타 프로그래밍이나 DSL 만들기는 루비 언어에 꽤 익숙해져야하고, 디버깅 등이 어려워 여러 노하우가 필요한 영역이다. 쉽지 않기 때문에, 루비에서 가장 재미있는 부분이기도 하다. 2부의 패턴 카달로그를 워밍업으로 생각하고, 본격적으로 루비식 개발을 해보는 3부를 더 많은 분량으로 썼으면 어땠을까 하는게 이런 이유에서다. 어쨌든 이 책이 좋은 길을 닦았으니까, 이 책 위에서도 더 많은 내용을 다룬 책이 또 나올 것 같아서 기쁘다.
깔끔한 코드와 명쾌한 설명으로 눈이 즐거운 책이었다. 나도 한번 혼자 생각해봤으면 좋았을 내용을 저자 덕분에 짧은 시간에 정리한 것 같다. 그리고 마지막 장의 말이 인상적이다. 내가 이해한 내용으로 두가지만 정리해본다.
루비에서는 간단한 일을 정말 간단하게 만들수 있다. 예를 들어 기존 클래스를 바꿔버리면 간단하게 몇줄로 해결될 수 있는 문제를 프락시니 어댑터니 데코레이터니 팩토리니 이런 식으로 치장하느라 실제 문제를 곡해하는 일이 없었으면 좋겠다.
'새로운 프로그래밍 기술이나 언어가 나왔을 때는, 거기에 지혜의 격차(wisdom gap)가 있게 마련이다'라고 Bruce Tate가 말했다. 객체 지향이 처음 나오고, 많은 시간이 지나고 나서야 패턴등을 만들며 이 기술을 잘 쓸 수 있게 되었다. 루비(동적 언어)의 강력함을 알고 있지만, 이를 효과적으로 쓰려면 이 격차(wisdom gap)를 매워줄 뭔가가 필요하다. 연습일까? 나는 아직 이 뭔가를 찾지 못한 것 같다.
- 2008/02/10 02:23:39
Comments (0)