2010-06-02 2 views
3

Я создаю сайт, управляемый контентом, с встроенным 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 
} 
... 

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

ответ

4

Нормативные правила Properties vs. Methods применяются.

+0

Спасибо. Это большой список! Одна из строк говорит: «Свойства, возвращающие массивы, могут быть очень обманчивыми». Включает ли это общие списки, а также массивы? –

+0

Нет, коллекции в порядке, чтобы вернуться. В MSDN есть еще одна хорошая статья: http://msdn.microsoft.com/en-us/library/0fss9skc%28VS.80%29.aspx –

2

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

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

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