У меня есть класс (Foo), который лениво загружает свойство с именем (Bar). Какой ваш предпочтительный способ защиты от ошибочного использования (из-за интеллигенции или неопытного персонала) поля неинициализированной поддержки?
Я могу придумать 3 варианта:
class Foo {
// option 1 - Easy to use this.bar by mistake.
string bar;
string Bar {
get {
// logic to lazy load bar
return bar;
}
}
// option 2 - Harder to use this._bar by mistake. It is more obscure.
string _bar2;
string Bar2 {
get {
// logic to lazy load bar2
return _bar2;
}
}
//option 3 - Very hard to use the backing field by mistake.
class BackingFields {
public string bar;
}
BackingFields fields = new BackingFields();
string Bar3 {
get {
// logic to lazy load bar
return fields.bar;
}
}
}
Имейте в виду, что единственное место, где я хочу, чтобы люди возились с бэк-полем, - это установщик и получатель свойства. Повсюду в классе они всегда должны использовать это. Бар
Обновление
В настоящее время я использую следующую ленивую реализацию (не для всех свойств с резервными полями, но для некоторых, требующих отложенной загрузки, синхронизации и уведомления). Он также может быть расширен для поддержки фьючерсов (оценка силы в отдельном потоке позже)
Примечание Моя реализация блокируется на чтение, поскольку она поддерживает внешний набор.
Кроме того, я хотел бы отметить, что я думаю, что это ограничение языка, которое можно преодолеть в Ruby, например .
Вы можете реализовать ленивый таким образом.
x = lazy do
puts "<<< Evaluating lazy value >>>"
"lazy value"
end
puts x
# <<< Evaluating lazy value >>>
# lazy value