루비로 배우는 객체지향 디자인
처음 구매 했을때는 주변 루비 개발자분들이 좋은책 이라고 해서 구매했지만 막상 읽지를 않고 책장에 꽃혀있던 책을 블로그 포스팅을 위해 꺼내서 읽었습니다.
작성은 각 장에서 깨달은 내용을 적을 예정이고 총 9장까지 있습니다.
책 제목은 루비지만 꼭 루비가 아니더라도 객체지향 디자인을 원하는 사람에게는 좋은 책이라는걸 느꼈습니다.
7. 모듈을 통한 역할 공유
이전에 배운 상속의 기술을 이용해 역할을 공유하는 다른 방법을 알아보는 장입니다.
여기서는 루비의 모듈을 이용해 공통의 역할을 구현하려고 합니다.
이 공동의 역할은 고전적 상속이 만들어내는 상위/하위 클래스 관계가 아닌 주어진 역할을 누군가를 위해 수행하면서 이 누군가와 관계를 맺게 됩니다.
여기서 루비 모듈은 다른 객체지향 언어에서 지원하는 메서드의 묶음에 이름을 부여하고 관리하는 방법 중에 하나 입니다.
객체가 모듈을 include 하면 객체는 이 모듈이 정의하고 있는 메서드를 자동화된 위임을 통해 모두 사용 할 수 있게 되는데 이 부분은 코드를 보겠습니다.
module A
def pr
puts "a - pr"
end
end
class Person
include A
end
p = Person.new
p.pr
저는 이 모듈과 설명하는 내용을 보면 Java 의 추상 클래스 같은 느낌이 아닐까 싶었습니다. 인터페이스는 아니라고 생각했던건 인터페이스는 추상화된 코드만 있어야 해서 제외하게 되었습니다. 완전히 추상 클래스는 또 아니지만 그나마 제일 비슷한게 아닐까 싶었습니다.
그리고 모듈을 include 했을 때 이 모듈의 메서드들은 상속을 통해 얻은 메서드와 같은 메서드 탐색을 거치게 됩니다.
마지막으로 인상 깊었던 내용을 추가로 정리하겠습니다.
객체가 다른 곳에서 정의된 행동을 가져왔다면 다른 곳이 상위 클래스든 아니면 모듈이든 이 객체는 상위 타입은 자신의 하위 타입으로 치환될 수 있습니다.
이는 리스코프 치환 원칙으로 설명이 가능합니다.
- SOLID 디자인의 원칙 중 ‘L’이 리스코프 치환 원칙을 뜻합니다.
- q(x) 를 자료형 T 의 객체 x에 대해 증명할 수 있는 속성이라 하자, 그렇다면 S가 T의 하위형이라면 q(y) 는 자료형 S의 객체 y에 대해 증멸 할 수 있어야 한다.
이는 타입 시스템이 정상적으로 작동하려면 상위타입은 자신의 하위타입으로 치환될 수 있어야 합니다.