Я читал Sandi Metz's Практический объектно-ориентированный дизайн в Ruby и многие сайты, обсуждающие дизайн в Ruby. То, что мне было трудно понять, - это правильный способ внедрения инъекции зависимостей.Что такое хорошая практика для инъекций зависимостей в Ruby?
В интернете залиты сообщения в блоге, в которых объясняется, как работает инъекция зависимостей в том, что я думаю, очень частично.
Я понимаю, что это должно быть плохо:
class ThisClass
def initialize
@another_class = AnotherClass.new
end
end
Хотя это решение:
class ThisClass
def initialize(another_class)
@another_class = another_class
end
end
И что я мог бы послать AnotherClass.new так:
this_class = ThisClass.new(AnotherClass.new)
Это подход, который Санди Мец рекомендует, по крайней мере. Я не понимаю, куда должна идти такая линия? Он должен идти куда-то и вообще в примерах этого, что показано, это строка, подобная той, которая помещена полностью вне любого класса, метода или модуля, как если бы я просто вводил все это вручную в IRB для целей тестирования.
This post (среди прочих) предлагает этот другой подход:
class ThisClass
def another_class
@another_class ||= AnotherClass.new
end
end
Jamis Buck бы такой же подход, как это:
class AnotherClass
end
class ThisClass
def another_class_factory(class_name = AnotherClass)
class_name.new
end
end
Однако эти два примера, как сохранить имя AnotherClass внутри ThisClass, который Санди Мец говорит, что это одна из главных вещей, которые мы пытаемся избежать.
Так какова наилучшая практика для этого? Должен ли я создать модуль «зависимости», заполненный методами, которые являются фабриками для объектов каждого класса в моем приложении?
Хранение экземпляра другого класса в переменной экземпляра не является анти-шаблоном, это своего рода точка, ограничивающая ее конкретную реализацию анти-шаблоном. Объекты очень часто состоят из других объектов. –
Я не являюсь источником идеи @DaveNewton, и я не думаю, что это хорошо.Я посмотрю, смогу ли я снова выкопать источник. :-) – Drenmi
Есть ли у вас какие-либо конкретные предложения по лучшим местам (местам) для ознакомления с различными классами? Лучше ли им быть в одном модуле/классе? Хорошо ли иметь знания о классах в некоторых классах, но просто старайтесь максимально уменьшить его? Часто подразумевается, что никогда не следует создавать объекты внутри классов, которые должны их использовать, а в зависимости от какого-либо внешнего процесса/службы/фабрики, чтобы сделать их для вас. Неправильно ли иметь свободные строки кода вне классов? Спасибо за очень продуманный ответ, я все еще путаюсь по этому вопросу! –