Плюсы / минусы в списках с вспомогательными объектами - PullRequest
2 голосов
/ 22 февраля 2010

Я снова в состоянии найти выход для обработки списков с дополнительными объектами в наших бизнес-объектах.

На самом деле наш код часто выглядит так:

public class Object
{
    private List<SubsidiaryObject> subsidiaryObjects = null;
    public List<SubsidiaryObject> SubsidiaryObjects
    {
        get
        {
            if (this.subsidiaryObjects == null)
            {
                this.subsidiaryObjects = DBClass.LoadListFromDatabase();
            }

            return this.subsidiaryObjects;
        }

        set
        {
            this.subsidiaryObjects = value;
        }
    }
}

Против этого:

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

Профи на этом:

  • Простой способ перезагрузки списка (просто установите ссылку на ноль и затем получите ее снова).

Я разработал другой класс, который использует следующий шаблон:

public class Object2
{
    private readonly List<SubsidiaryObject> subsidiaryObjects = new List<SubsidiaryObject>();
    public List<SubsidiaryObject> SubsidiaryObjects
    {
        get
        {
            return this.subsidiaryObjects;
        }
    }

    public void ReloadSubsidiaryObjects()
    {
        this.SubsidiaryObjects.Clear();
        this.SubsidiaryObjects.AddRange(DBClass.LoadListFromDatabase());
    }
}

Pro на этом:

  • Ссылка непрерывна.

Против этого:

  • Перезагрузить список сложнее, поскольку его просто невозможно заменить, но его необходимо очистить / заполнить перезагруженными элементами.

Какой путь вы предпочитаете, для каких ситуаций?

Что вы видите как Pro / Con для любого из этих паттернов?

Поскольку это только общий вопрос, а не конкретная проблема, каждый ответ приветствуется.

1 Ответ

2 голосов
/ 22 февраля 2010

Вам нужен вызывающий абонент, чтобы иметь возможность изменять список? Если нет, вам следует рассмотреть возможность возврата IEnumerable<T> или ReadOnlyCollection. И даже если вы это сделаете, вам, вероятно, будет лучше создавать кавер-версии для Add / Remove, чтобы вы могли перехватывать модификации. Передача ссылки на внутреннее состояние не является хорошей идеей IMO.

Третий вариант - перейти к варианту 2, но создавать новый экземпляр типа Object2 каждый раз, когда вам необходимо заполнить список. Без дополнительного контекста для вопроса, это вариант, который я бы выбрал, но могут быть причины, по которым вы захотите сохранить исходный экземпляр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...