2010-05-26 5 views
4

저는 새로운 Ruby이지만 많은 년간 1 년 동안 .net 개발자였습니다. 가능한 한 느슨하게 결합되어 있는지 확인하기 위해 몇 가지 모델 내에서 컴포지션을 구현하고 싶지만 어디에서 시작할 것인지, 아니면 이것이 정말로 필요한지, 여전히 .net dev와 매우 흡사하게 생각하고 있습니다.루비에서 컴포지션 사용

누구나 어디서부터 시작해야할지 알려줄 수 있습니까?

건배 콜린 G

답변

2

루비는 객체 지향하지만 동적으로 입력 된 언어입니다. 역동적 인 언어이기 때문에, 루비스트는 .net 개발자보다 코드의 반영과 동적 수정을 사용하는 경향이 있습니다. 물론 객체 지향 언어이기 때문에 .net과 거의 동일한 원칙을 사용할 수 있지만, 항상 똑같은 것을보다 역동적 인 방식으로 구현할 수 있는지 살펴보아야합니다.

예를 들어 ActiveRecord ORM은 구성된 필드를 적절하게 필드에 추가하는 method을 사용하여 composition을 해결합니다. 나는 이것이 행해져 야하는 방식이라고 말하지 않고있다. (예를 들어 루비를위한 또 다른 ORM 인 DataMapper는 더 "보수적 인"접근법을 선택하고, (Fluent) NHibernate와 비슷하다.) 어떻게 일을 다르게 할 수 있는지.

AOP 또는 DI와 같은 것은 동적 언어의 외래 개념이 아니며 대개 대체 방법으로 수행됩니다. 언어의 역동적 인 측면에 대해 열린 마음을 가지고 있지만 과용하지 마십시오.

+1

슬프게도, 'compos_of'는 약 6 개월 전에 ActiveRecord에서 꺼내졌습니다. https://github.com/rails/rails/pull/6743을 참조하십시오. – Blackcoat

8

이런 종류의 것을 의미합니까?

 
class Engine 
    attr_reader :horsepower, :litres 
end 

class Gearbox 
    attr_reader :manufacturer, :model_no 
end 

class Car 
    def initialize(engine, gearbox) 
     raise "Invalid Engine Object" if !engine.kind_of(Engine) 
     raise "Invalid Gearbox Object" if !gearbox.kind_of(Gearbox) 
     @engine = engine 
     @gearbox = gearbox 
    end 
end 


car = Car.new(Engine.new, Gearbox.new) 
+0

작은 개선 사항 : 나는 Duch Typing https://en.wikipedia.org/wiki/Duck_typing에 찬성하여'kind_of? '수표를 제거 할 것입니다. 그렇지 않으면'Car'는'Engine'과'Gearbox' 클래스와 영원히 결혼합니다. 'Car'는'PetrolEngine'이나 다른 엔진과 같은 엔티티를 사용하기 시작할 수 있습니다. Engine 클래스는 일종의 Engine 클래스는 아니지만 인터페이스를 구현해야합니다. –