Использование композиции в рубине - PullRequest
4 голосов
/ 27 мая 2010

Я новый Ruby, но много лет являюсь разработчиком .net. Я хочу реализовать композицию в паре моей модели, чтобы убедиться, что они настолько слабо связаны, насколько возможно, но не знаю, с чего начать, или действительно ли это необходимо, и я все еще думаю о чем-то вроде .net dev. 1001 *

Может кто-нибудь дать мне несколько советов о том, с чего начать.

Приветствие Колин Г

Ответы [ 2 ]

8 голосов
/ 27 мая 2010

Вы имеете в виду такие вещи?

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) 
2 голосов
/ 27 мая 2010

Ruby - это объектно-ориентированный, но динамически типизированный язык. Будучи динамическим языком, rubyists, как правило, используют отражения и динамическое изменение кода гораздо чаще, чем разработчики .net. Конечно, поскольку это объектно-ориентированный язык, вы можете использовать в основном те же принципы, что и в .net, и вы тоже должны это делать, но всегда оглядывайтесь вокруг и смотрите, как эта же вещь может быть реализована более динамичным способом.

Например, ActiveRecord ORM решает композицию, используя метод selected_of , который динамически добавляет соответствующие поля и свойства в ваш класс. Я не говорю, что это именно так, как это должно быть сделано (например, DataMapper, который является еще одним ORM для ruby, выбирает более «консервативный» подход и поэтому больше напоминает (Свободно) NHibernate), это всего лишь пример как все можно сделать по-другому.

Такие вещи, как AOP или DI, не являются чужеродной концепцией для динамических языков, они обычно выполняются альтернативным способом. Держите непредвзятое мнение о динамических аспектах языка, но не переусердствуйте с ними.

...