Сколько работы должно быть сделано в конструкторе?

Если операции, которые могли занять время, выполняются в конструкторе или если объект создается и затем инициализируется позже.

Например, когда построение объекта, который представляет структуру каталогов, должно население объекта и его детей быть сделанным в конструкторе. Очевидно, каталог может содержать каталоги и который в свою очередь может содержать каталоги и так далее.

Что изящное решение к этому?

50
задан Raedwald 17 October 2019 в 04:34
поделиться

3 ответа

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

Например, скажем, мне нужно отобразить в подробностях следующий класс Company:

public class Company
{
    public int Company_ID { get; set; }
    public string CompanyName { get; set; }
    public Address MailingAddress { get; set; }
    public Phones CompanyPhones { get; set; }
    public Contact ContactPerson { get; set; }
}

Так как я хочу отобразить в подробностях всю имеющуюся у меня информацию о компании, то мой конструктор будет содержать весь код, необходимый для заполнения каждого свойства. Учитывая, что это сложный тип, конструктор Company также сработает и с конструктором Address, Phones и Contact.

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

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

.
3
ответ дан 7 November 2019 в 10:42
поделиться

Отличный вопрос: приведенный вами пример, где Объект 'Directory' имеет ссылки на другие объекты 'Directory'.

В этом конкретном случае я бы переместил код для создания подчиненных объектов из конструктора (или, возможно, сделал бы первый уровень [непосредственные дочерние элементы] как рекомендует другой пост здесь), и иметь отдельный механизм «инициализации» или «сборки»).

В противном случае существует еще одна потенциальная проблема - помимо производительности - это объем памяти:

0
ответ дан 7 November 2019 в 10:42
поделиться

Я голосую за тонкие конструкторы и в этом случае добавляю к вашему объекту дополнительное «неинициализированное» поведение состояния.

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

Может быть трудно выявить ошибки таких объектов, если они становятся статическими, потому что конструктор затем запускается перед main (), и отладчику труднее отслеживать.

0
ответ дан 7 November 2019 в 10:42
поделиться
Другие вопросы по тегам:

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