Я создаю сайт, управляемый контентом, с встроенным API, созданным несколькими разработчиками, с которыми я работаю. API - это просто хороший LINQ-подобный слой, похожий на ORM, между Sitecore CMS (наш CMS в этом случае) и наш код C# для привязки элементов данных к элементам управления. Я обнаружил, что в нескольких местах у меня была возможность решить между созданием методов и свойств для получения «подпунктов» для получения данных.Использование метода против свойства для извлечения данных из класса с использованием LINQ
С целью пояснения условий 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
}
...
Есть ли какие-либо другие вещи, чтобы рассмотреть, кроме перегрузки и личных предпочтений при выборе между использованием метод против свойства? Что-нибудь «техническое», которое я должен рассмотреть?
Спасибо. Это большой список! Одна из строк говорит: «Свойства, возвращающие массивы, могут быть очень обманчивыми». Включает ли это общие списки, а также массивы? –
Нет, коллекции в порядке, чтобы вернуться. В MSDN есть еще одна хорошая статья: http://msdn.microsoft.com/en-us/library/0fss9skc%28VS.80%29.aspx –