Реализация класса "LazyProperty" - это хорошая идея? - PullRequest
7 голосов
/ 13 января 2009

Я часто пишу свойство, которое оценивается лениво. Что-то вроде:

if (backingField == null) 
  backingField = SomeOperation();
return backingField;

Это не так много кода, но он многократно повторяется, если у вас много свойств.

Я думаю об определении класса с именем LazyProperty:

public class LazyProperty<T>
    {
    private readonly Func<T> getter;

    public LazyProperty(Func<T> getter)
    {
        this.getter = getter;
    }

    private bool loaded = false;
    private T propertyValue;

    public T Value
    {
        get
        {
            if (!loaded)
            {
                propertyValue = getter();
                loaded = true;
            }
            return propertyValue;
        }
    }

    public static implicit operator T(LazyProperty<T> rhs)
    {
        return rhs.Value;
    }
}

Это позволило бы мне инициализировать поле следующим образом:

first = new LazyProperty<HeavyObject>(() => new HeavyObject { MyProperty = Value });

И тогда тело объекта может быть уменьшено до:

public HeavyObject First { get { return first; } }

Это будет использоваться большинством компаний, поскольку оно войдет в общую библиотеку классов, используемую большинством наших продуктов.

Я не могу решить, хорошая это идея или нет. Я думаю, что у решений есть некоторые плюсы, такие как:

  • Меньше кода
  • Код красивее

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

Что ты думаешь? Это хорошая идея или я должен отказаться от нее? Кроме того, является ли неявный оператор хорошей идеей, или вы предпочитаете явно использовать свойство Value, если вам следует использовать этот класс?

Мнения и предложения приветствуются: -)

Ответы [ 11 ]

0 голосов
/ 13 января 2009

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

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

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

...