Информация об изменениях

Сообщение Re[2]: Мутные функции отложенной (ленивой) загрузки\инициали от 27.04.2024 10:54

Изменено 27.04.2024 11:10 zelenprog

Re[2]: Мутные функции отложенной (ленивой) загрузки\инициализации
Здравствуйте, gandjustas, Вы писали:

Z>>Ведь действительно, когда смотришь на название такой функции, она вводит в заблуждение.

Z>>Может быть есть смысл разделить ее на две функции?
Z>>И в клиентском коде везде явно вызывать две функции при необходимости:
G>Нет, это называется "двухшаговая инициализация" — источник многих ошибок.

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

G>Проблема не в этом, а в том, что "инициализация", как и любое другое действие, которое может завершиться неуспехом, должно быть явно видно в исходниках.


В исходниках каких? В исходниках клиента?
Просто в исходниках реализации это и так видно.

G>Решение простое — factory method

G>
G>class C {
G>    protected C(Widget widget) {
G>        this.widget = widget;
G>    }

G>    static C? FromWidgetId(it widgetId)
G>    {
G>         var w = Widget.Load(widgetId);
G>         if w != null? new C(w) : null;
G>    }
G>}
G>


Хм... Но по сути это ведь тоже самое.
В клиентском коде как будет выглядеть вызов этой фабрики?
Re[2]: Мутные функции отложенной (ленивой) загрузки\инициали
Здравствуйте, gandjustas, Вы писали:

Z>>Ведь действительно, когда смотришь на название такой функции, она вводит в заблуждение.

Z>>Может быть есть смысл разделить ее на две функции?
Z>>И в клиентском коде везде явно вызывать две функции при необходимости:
G>Нет, это называется "двухшаговая инициализация" — источник многих ошибок.

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

G>Проблема не в этом, а в том, что "инициализация", как и любое другое действие, которое может завершиться неуспехом, должно быть явно видно в исходниках.


В исходниках каких? В исходниках клиента?
Просто в исходниках реализации это и так видно.

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


G>Решение простое — factory method

G>
G>class C {
G>    protected C(Widget widget) {
G>        this.widget = widget;
G>    }

G>    static C? FromWidgetId(it widgetId)
G>    {
G>         var w = Widget.Load(widgetId);
G>         if w != null? new C(w) : null;
G>    }
G>}
G>


Хм... Но по сути это ведь тоже самое.
В клиентском коде как будет выглядеть вызов этой фабрики?