Для чего используется метод Initialize и нужен ли он мне? - PullRequest
7 голосов
/ 13 декабря 2011

Я немного озадачен тем, для чего обычно используется метод Initialize в конструкторе.

Почему я не могу просто поместить все в конструктор и почему приведенный ниже пример вызывает метод initialize?

    private IAzureTable<Product> _productRepository;

    public ProductService(string dataSourceID)
    {
        Initialize(dataSourceID);
    }

    private void Initialize(string dataSourceID)
    {
        this._productRepository = StorageHelper.GetTable<Product>(dataSourceID);
    }

Существует ли соглашение, которое обычно используется?

В этом примере мне нужно слово this в методе Initialize?

Ответы [ 5 ]

10 голосов
/ 13 декабря 2011

Почему я не могу просто поместить все в конструктор и почему в приведенном ниже примере вызывается метод initialize?

Вы можете поместить все это в конструктор. В этом простом случае вам следует. Конструкторы для инициализации вашего объекта.

Иногда у вас есть что-то более сложное, хотя:

  • Иногда вам понадобится отдельный метод Initialize, потому что вы хотите вызывать его отдельно от конструкции.
  • Иногда вам нужен один, потому что вы пишете несколько конструкторов, и вы хотите поделиться некоторыми реализациями между ними.
  • Иногда ваша инициализация сложна, и вы хотите дать ее частям хорошие имена, чтобы вы знали, что делает ваш код. Таким образом, вы разбиваете эти части на отдельные методы.

Ни один из этих случаев не подходит для этого кода, поэтому я просто пропущу его и добавлю код в конструктор.

Есть ли соглашение, которое обычно используется?

Нет. Люди делают все, что легче всего читать и понимать, что требует написания наименьшего количества дополнительного кода и что вызывает наименьшее дублирование кода.

Однако, если вы делаете метод Initialize общедоступным и не вызываете его из конструктора, я настоятельно рекомендую вам вызвать его Initialize. Создайте его так, чтобы его вызывали только один раз.

В этом примере мне нужно слово «это». в методе Initialize?

Нет. Вам никогда не нужно использовать this для доступа к членам класса, если у вас нет другой локальной переменной с тем же именем. Вот такой случай:

public class Something
{
    private string someValue;

    public class Something(string someValue)
    {
        // must use "this" to access the member variable,
        // because a local variable has the same name
        this.someValue = someValue;
    }
}
4 голосов
/ 13 декабря 2011

То, что вы опубликовали, - это личный помощник метод , а не класс.

Он просто используется, чтобы конструктор не загромождался кодом инициализации и чтобы дать хорошее имя для того, что сделано.

В вашем конкретном примере это имеет небольшое значение.

1 голос
/ 13 декабря 2011

Не существует согласованного стандарта, но «Инициализация» - это хорошо известное слово, которое мгновенно узнаваемо для всех, кто читает код, и говорит мне все, что мне нужно знать о назначении метода. Его можно назвать Bob(), но это гораздо менее полезно!

Почему я не могу просто поместить все в конструктор?

Можно, но разбиение на метод помогает сделать вещи более читабельными. Когда ваш конструктор представляет собой одну строку кода, в этом нет особой необходимости.

В этом примере мне нужно слово «это». в методе Initialize?

В указанном вами коде нет необходимости. Почему это там? Может быть автоматически сгенерирован инструментом, может быть просто условием или стилем, который кто-то использовал, мог быть вставлен из другого места, где это было необходимо ...

1 голос
/ 13 декабря 2011

1: использование метода инициализации может быть в два раза:

  • Может быть множество действий инициализации, которые необходимо разбить на управляемые куски (т. Е. Конструктор может перейти квыполнить другие действия)
  • Для класса может потребоваться повторная инициализация, и в этом случае код инициализации должен быть в методе, отличном от конструктора.

В вашемконкретный пример, хотя он и не имеет большого значения.

2: В случае this:

Опять же, в вашем примере, он не имеет большого значения.Можно было бы использовать безразличное отношение между реализациями свойств или методов в базовом классе и текущем классе (то есть вы бы использовали base. вместо this.)

1 голос
/ 13 декабря 2011

Во-первых, код выглядит читабельным, если вы разделяете функциональность на его собственные методы.

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

...