2010-05-26 31 views
4

我是新的Ruby,但是一年多來一直是.net開發者。我想在我的模型中實現合成,以確保它們儘可能鬆散耦合,但不知道從哪裏開始,或者如果真的需要這樣做,並且我仍然非常想要.net開發。在紅寶石中使用組合

任何人都可以給我一些指導從哪裏開始。

乾杯 科林ģ

回答

2

Ruby是一種面向對象的動態但類型語言。作爲一種動態語言,Ruby開發人員傾向於使用代碼的反射和動態修改。當然,因爲它是一種面向對象的語言,所以你可以使用與.net相同的原則,你也應該使用它,但是總是環顧四周,看看如何以更動態的方式實現同​​樣的事情。

例如,ActiveRecord ORM使用composed_of method解決了合成,它將動態地向您的類中添加適當的字段和屬性。我並不是說這就是它應該完成的方式(例如DataMapper,它是另一個Ruby的ORM,選擇了一種更「保守」的方法,所以更類似於(Fluent)NHibernate),這只是一個例子如何以不同的方式做事。

像AOP或DI這樣的東西不是動態語言的外國概念,它們通常是以另一種方式完成的。對語言的動態方面保持開放的態度,但不要過頭。

+1

不幸的是,大約6個月前,'composed_of'被從ActiveRecord中取出。見https://github.com/rails/rails/pull/6743 – Blackcoat 2012-12-12 19:36:03

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

只是一個小小的改進:我會刪除'kind_of?'支票以支持Duch鍵入https://en.wikipedia.org/wiki/Duck_typing。否則'Car'永遠與'Engine'和'Gearbox'類結合。可能很容易發生一個'Car'可能會使用'PetrolEngine'或其他類似引擎的實體開始,它不一定是一種'Engine'類,而是必須實現一些接口。 – 2017-11-28 04:05:46