Когда преимущества перемещения параметра метода в конструктор? [Дубликат]

Для достижения этого поведения вы должны использовать globals() встроенный метод :

def var_of_var(k, v):
    globals()[k] = v

print variable_name # NameError: name 'variable_name' is not defined
some_name = 'variable_name'
globals()[some_name] = 123
print variable_name # 123

some_name = 'variable_name2'
var_of_var(some_name, 456)
print variable_name2 # 456

19
задан Jim 17 October 2008 в 19:57
поделиться

5 ответов

Основным преимуществом инъекции конструктора является то, что он позволяет вашим полям быть отмеченными окончательными. Например:

class Foo {
    private final Bar _bar;

    Foo(Bar bar) {
        _bar=bar;
    }
}

На следующей странице есть отличный список про и con: Guice Best Practices :

Метод инъекции

  • + Не вводится в поле
  • + Единственное, что работает для некоторых странных случаев кросс

Инъектор конструктора

  • + Поля могут быть окончательными!
  • + Инъекция не может быть пропущена
  • + Легко видеть зависимости с первого взгляда
  • + Это то, что идея конструкция - все о
  • - Нет дополнительных инъекций
  • - Бесполезно, если библиотека DI не может сама выполнить экземпляр
  • - Подклассам нужно «знать» об инъекциях необходимые для их суперклассов
  • - Менее удобен для тестов, которые только «заботятся» о одном из параметров
12
ответ дан chepseskaf 23 August 2018 в 00:42
поделиться

Если вы вводите во время методов, чем вы не различаете поведенческую абстракцию от конкретных зависимостей. Это большой нет нет :). Вы хотите зависеть от абстракций, чтобы не сочетаться с зависимостями зависимостей ваших классов. , ,

Поскольку ваш конструктор не будет присутствовать в каком-либо интерфейсе, который поддерживает ваш конкретный класс, чем вы не связаны с этой зависимостью. Но вызов метода будет иметь эту проблему.

Вот хорошая статья об этом типике:

http://chrisdonnan.com/blog/2007/05/20 / захват-через-экстремально-композиция клея-часть-2 /

3
ответ дан leora 23 August 2018 в 00:42
поделиться

Не добавляя зависимость от каждого метода, вы затем заставляете каждого вызывающего пользователя знать или извлекать зависимость.

Также с точки зрения инструментария доступно множество доступных фреймворков (по крайней мере, в .NET), которые позволяют или сделать инъекцию конструктора намного проще. Это не должно влиять на решение, но делает его гораздо более привлекательным.

Удачи.

3
ответ дан smaclell 23 August 2018 в 00:42
поделиться

Сумасшедший Боб Ли говорит, что, когда это возможно, использует инъекцию конструктора. Используйте только инъекцию метода, когда у вас нет контроля над экземпляром (например, в сервлете).

1
ответ дан Steve g 23 August 2018 в 00:42
поделиться

Другим методом является пользователь, устанавливающий для зависимостей. Иногда это сочетается с инъекцией конструктора. Это может быть полезно, если вы хотите изменить версию, которую вы используете позже, без необходимости повторного создания экземпляра.

public interface IFoo
{
   void Do();
}

public class IFoo DefaultFoo : IFoo
{
   public void Do()
   {
   }
}

public class UsesFoo
{
   private IFoo foo;
   public IFoo Foo
   {
       set { this.foo = value; }
   }

   public UsesFoo()
   {
      this.Foo = new DefaultFoo();
   }

   public UsesFoo( IFoo foo )
   {
      this.Foo = foo;
   }

   public void DoFoo()
   {
      this.Foo.Do();
   }
}
1
ответ дан tvanfosson 23 August 2018 в 00:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: