Использование метода и свойства для извлечения данных из класса с использованием LINQ - PullRequest
3 голосов
/ 02 июня 2010

Я создаю сайт с управлением контентом с помощью собственного API, созданного несколькими разработчиками, с которыми я работаю. API - это просто красивый LINQ-подобный ORM-подобный слой между Sitecore CMS (нашей CMS в данном случае) и нашим кодом C # для привязки элементов данных к элементам управления. Я обнаружил, что в нескольких местах у меня была возможность выбирать между созданием методов и свойств для извлечения «подпунктов» для получения данных.

В целях объяснения терминов Sitecore предположим, что слово «шаблон» означает собственный класс, представляющий некоторый тип типа Sitecore.

// retrieve all children of the Sitecore template "Content Folder" below the PageData section
// assume PageData is an object that represents that section in the Sitecore content tree
public List<ContentFolder> GetContentFolders() {
  return PageData.CurrentItem.ChildrenByTemplate("Content Folder").As(i => new ContentFolder(i));
}

Приведенный выше код выполнит некоторое LINQ в разделе PageData для получения списка подэлементов типа «Папка содержимого». Примечание : .As() - это просто метод расширения, позволяющий легко составить список этого типа. В этом примере это, очевидно, метод. Однако должно ли это быть публичной собственностью? Э.Г.

public List<ContentFolder> ContentFolders {
  get {
    return PageData.CurrentItem.ChildrenByTemplate("Content Folder").As(i => new ContentFolder(i));
  }
}

Что больше подходит? Они равны? Я определенно нашел четкий пример того, когда метод имеет больше смысла: любой случай, когда мне нужно передать ему параметры или где я могу перегрузить параметры. Э.Г.

public List<SupportProductItem> GetSupportProductItems() {
  return GetSupportProductItems(true);
}

public List<SupportProductItem> GetSupportProductItems(bool excludeUnsetProducts) {
  var productItems = CurrentItem.ChildrenByTemplate("Support Product Item").As(i => new SupportProductItem(i));

  if(excludeUnsetProducts)
    productItems = productItems.Where(i => i.ProductSelector.IsSet).ToList();

  return productItems;
}

Случай, когда я выбрал свойство вместо метода (по моему мнению), это когда я просто проверяю что-то простое, а не извлекаю списки данных, например,

public bool IsSet {
  get {
    return (CurrentItem != null);
  }
}

Вместо:

public bool IsSet() {
  return (CurrentItem != null);
}

Итак, в коде это будет выглядеть так:

...
if(ContentFolder.CurrentItem.IsSet) {
  // code
}
...

Есть ли другие соображения, которые следует учитывать, кроме перегрузки и личных предпочтений, при выборе между методом и свойством? Что-нибудь «техническое», что я должен рассмотреть?

Ответы [ 2 ]

4 голосов
/ 02 июня 2010
3 голосов
/ 02 июня 2010

Я уверен, что это происходило раньше, но в основном ожидается, что свойство будет:

а) относительно быстро
б) не имеет побочных эффектов

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

...