Помогите реорганизовать мой код C #, чтобы сделать его более понятным и использовать лучшие практики кодирования - PullRequest
3 голосов
/ 29 июля 2011

У меня есть такая структура класса C #, которую я хотел бы реорганизовать для использования лучших стандартов кодирования (используйте интерфейсы / абстрактные классы), чтобы она могла быть более удобной для обслуживания и повторного использования. Код, как он есть сейчас, не ужасен, но он не идеален.

У меня есть серия классов TableItemGroup: AccountTableItemGroup, PendingVoteTableItemGroup и RequestingVoteTableItemGroup. Каждый TableItemGrup содержит строку SectionName и список для соответствующего TableItem ... как таковой:

public class AccountTableItemGroup {
    public string SectionName { get; set; }

    public List<AccountTableItem> Items
    {
        get { return this._items; }
        set { this._items = value; }
    }        
    public List<AccountTableItem> _items = new List<AccountTableItem>();

    public AccountTableItemGroup()
    {
    }
}

В будущем будет намного больше TableItemGroups, и если они все будут одинаковыми, за исключением части List, мне не нужно будет каждый раз копировать код и создавать новую группу и вносить это небольшое изменение. Я знаю, что должен быть лучший способ. Я хотел бы продолжать использовать дженерики List <>, чтобы мне не приходилось ничего приводить позже.

Другая часть - это TableItems. У меня есть AccountTableItem, PendingVoteTableItem и RequestingVoteTableItem. Элементы TableItem отличаются друг от друга, но каждая из них имеет три общие строки - TitleLabel, DetailLabel и ImageName. Но после этого каждый TableItem может иметь, а может и не иметь дополнительные свойства или методы вместе с ним ... как такие:

public class AccountTableItem
{
    public string TitleLabel { get; set; }

    public string DetailLabel { get; set; }

    public string ImageName { get; set; }

    public bool SwitchSetting { get; set; }

    public AccountTableItem()
    {
    }
}

Итак, мой вопрос ко всем вам: как мне переопределить структуру моего класса, чтобы обеспечить максимально возможное повторное использование кода и использование лучших стандартов кодирования?

Я думал о том, чтобы иметь абстрактный класс TableItem или использовать интерфейс для TableItemGroup? Я знаю, что использование интерфейса или абстрактного класса лучше всего подходит для стандартов кодирования, но я не понимаю, как это сократит объем кода, который у меня будет?

Большое спасибо за любую помощь.

Ответы [ 3 ]

6 голосов
/ 29 июля 2011

Абстрагируйте ваш элемент таблицы, добавив необходимые поля в интерфейс или базовый класс:

    interface ITableItem // or just a simple or abstract class
    {
        // common fields go here
    }

Затем вы можете сделать вашу группу элементов родовой с ограничением на общий параметр.

    public class ItemGroup<T> where T: ITableItem
    {
        public string SectionName { get; set; }

        public List<T> Items { get; private set; }

        public ItemGroup()
        {
            Items = new List<T>();
        }
    }
3 голосов
/ 29 июля 2011

Подумайте об использовании обобщений для представления контейнера TableItemGroup и создайте базовый класс для вашего TableItem, который вы можете наследовать для определенных типов элементов таблицы. Если вы наследуете непосредственно от List<T>, то вы можете рассматривать свою группу элементов как коллекцию, не используя свойство Items, как в существующем дизайне.

Нет особого смысла в использовании интерфейсов для этих типов типов. Поскольку они стоят, они являются классами данных, поэтому не имеют никакого поведения. Если бы у них было поведение, использование интерфейсов имело бы смысл, поскольку тогда вы могли бы изменять реализации и, следовательно, изменять поведение.

public class TableItemGroup<T> : List<T> where T : TableItem
{
    public TableItemGroup(string sectionName)
    {
        SectionName = sectionName;
    }

    public string SectionName { get; private set; }
}

public class TableItem
{
    public string TitleLabel { get; set; }

    public string DetailLabel { get; set; }

    public string ImageName { get; set; }
}

public class AccountTableItem : TableItem
{
    public bool SwitchSetting { get; set; }
}

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

var items = new TableItemGroup<AccountTableItem>("Accounts");

items.Add(new AccountTableItem { SwitchSetting = true });
1 голос
/ 29 июля 2011

Если вы не хотите, чтобы пользователи могли добавлять и удалять новые списки по своему желанию, вы должны сделать установщик в списке элементов защищенным. Пользователи по-прежнему смогут добавлять и удалять элементы, но не смогут создавать ссылки на новый список.

...