Сообщение 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>
Хм... Но по сути это ведь тоже самое.
В клиентском коде как будет выглядеть вызов этой фабрики?
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>
Хм... Но по сути это ведь тоже самое.
В клиентском коде как будет выглядеть вызов этой фабрики?
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>
Хм... Но по сути это ведь тоже самое.
В клиентском коде как будет выглядеть вызов этой фабрики?