帮助重构我的C#代码以使其更易于维护并使用最佳编码实践

时间:2011-07-29 13:27:20

标签: c# class coding-style class-design class-structure

我有这个C#类结构,我想重构使用最佳编码标准(使用接口/抽象类),因此它可以更易于维护和重用。现在的代码并不糟糕,但它并不理想。

我有一系列TableItemGroup类:AccountTableItemGroup,PendingVoteTableItemGroup和RequestingVoteTableItemGroup。每个TableItemGrup包含一个字符串SectionName和一个List,用于其对应的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部分之外它们都是相同的,我不想每次都复制代码并创建一个新的Group并进行小的更改。我知道必须有更好的方法。我想继续使用List&lt;&gt;泛型,所以我以后不必再投出任何东西了。

另一部分是TableItems。我有AccountTableItem,PendingVoteTableItem和RequestingVoteTableItem。 TableItems彼此不同,但它们各自共享三个常见字符串 - 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 个答案:

答案 0 :(得分:6)

摘要表格项目,将必要的字段添加到接口或基类:

    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>();
        }
    }

答案 1 :(得分:3)

考虑使用泛型来表示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 });

答案 2 :(得分:1)

除非您希望用户能够随意添加和删除新列表,否则您应该使项目列表上的setter受到保护。用户仍然可以添加和删除项目,但不能创建对新列表的引用。