Design Patterns in Ruby - 패턴으로 루비 이해하기
February 9th, 2008
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




February 10th, 2008 at 05:04 AM (myRuby.net) 흠 DP의 루비 버젼이 나왔군요 :-) 자바와 같은 강한 타입의 언어가 아닌 루비 같은 언어에서 DP의 효용성이 얼마나 클지 모르겠습니다. :-) 패턴의 의도와 실체화는 구분되어지는 게 맞을 듯 하고 각 언어에서 접근은 다를 듯 합니다. 하지만 루비의 메타 프로그래밍과 자바의 미니멀한 인터페이스사이에는 그 갭이 클듯 한데요. 솔직히 DP을 잘 모르고,Ruby도 잘 모르는 입장에서 제가 말하는 것이 무리가 있는 걸 인정 합니다만 :-) 종종 루비에서는 동적인 객체의 상태를 추적하는게 쉽지 않겠다는 생각이 들더군요. 복잡할수록.. 또한 자바는 간단한 일도 좀 복잡하게 해결해야 하는 부분있고. 사실 디자인이라는 건 특정 커뮤니티의 어림짐작의 법칙일수도 있을듯 하네요 (중언부언 끝입니다.;)
February 10th, 2008 at 05:23 AM (myRuby.net) 아~ 루비의 대가이신 deepblue님께서도 못찾으신 뭔가를 나는 언제쯤에야 찾을 수 있을까마는.. 다음 번 읽을 책으로 바로 “찜”해 두렵니다. 새해 복 많이 받으세요~~
February 10th, 2008 at 02:49 PM (myRuby.net) 볼까 말까 고민하고 있었는데 요약 감사드립니다. ^^ 사실 Higer-order function만 지원되도 Template Method, Strategy, Observer, Command, Visitor 패턴은 패턴이 아닌 이디엄이 되어 버리는 것 같습니다. :)
February 11th, 2008 at 02:43 AM anarch// 패턴의 의도와 실체화는 구분되어지는 게 맞다는데 동의합니다. 패턴에서 풀려는 문제는 루비에도 여전히 있는거죠. 다만, 언어의 특징들로 인해 그 구현이 너무 간단해서, 이게 정말 패턴이야?할 정도가 되버리는거겠죠. 루비에서는 동적 객체 추적이 어렵고, 자바에서는 간단한 일(?) 하기가 어렵다는 이야기도 공감되네요. 그래서 프로그래밍이 재미있는거겠죠. 절대적으로 쉽지 않으니까요 ^^
February 11th, 2008 at 02:43 AM sjoonk// 가벼운 마음으로 읽으시면(그러기엔 좀 비싸지만^^) 나름 즐거우실꺼예요. 새해 복 많이 받으세요~
February 11th, 2008 at 02:45 AM 송치형// 때마침 JCO 발표자료를 봤습니다. 고차원함수가 패턴 구현을 얼마나 쉽게 만들어버리는지 잘 보여주셨더군요. 즐거운 JCO 컨퍼런스가 될 것 같아요~