【问题标题】:Need any design ideas for filtering properties of an object需要任何用于过滤对象属性的设计理念
【发布时间】:2011-06-09 17:43:25
【问题描述】:

假设有一个名为 HouseHoldItems 的类。它可能有许多不同的项目,如

Class HouseHoldItems
{ 
  TV,
  Fridge,
  Hammer,
  Chair,
  Watch,
  Shoes,  
}

我想要一种方法来提出一种模式,我可以在其中指定一些项目,例如“电子”、“布基”、“铁”、“电”。然后我希望能够得到电子物品清单等等。

我们有我们的业务实体,我们在其上指定项目是可过滤的、可搜索的、用户是否可以看到以及其他类似行为。在 UI 中,我们有相应的屏幕显示这些列表中的每一个。

我想提出一个通用设计和一种方法,通过它我可以将这些特征应用于我的对象的属性。目前,我可以在脑海中想到“属性”和反射来实现这一点,但想知道是否有任何已知模式已经存在,可能有助于以更好的方式实现这一目标。

谢谢 玛尼

【问题讨论】:

  • 看起来更像是一个枚举而不是一个类
  • 我正在使用 CategoryType 和 Category 的数据库中执行此操作,即引用 CategoryType。

标签: c# .net design-patterns reflection attributes


【解决方案1】:

这个模式可能是Query pattern。假设您有 Select() 方法,其条件参数为“电子”,它返回请求项目的列表。

Item[] HouseHoldItems.Select(string criteria);

因为你需要实现这个方法。

【讨论】:

    【解决方案2】:

    这应该会让你朝着正确的方向前进:

    public enum Category { Electronic, ClothBased, // etc. }
    
    abstract class HouseholdItem { 
        private readonly Category category;
        public Category Category { get; }
        public HouseholdItem(Category category) {
            this.category = category;
        }
    }
    
    class Television : HouseholdItem {
        public Television() : base(Category.Electronic) { }
    }
    

    如果需要,您甚至可以将Category 变成class

    【讨论】:

    • 所有枚举指南都告诉我们,如果值集可能发生变化,则不要使用枚举。我认为这里就是这种情况
    • @Dyppl:“如果需要,您甚至可以将 Category 变成 class。”
    【解决方案3】:

    不要为此使用属性。属性不应该用于某些业务逻辑,它是机制的一部分。

    如果我理解正确,您在这里看到的是经典的many-to-many 项目和“类别”之间的关系。有很多方法可以表示这种关系。

    如果您要将数据存储在关系数据库中,那么最自然的方法是引入一个将一个项目与一个类别链接在一起的对象。每个项目可能很少存在这样的对象。这就是多对多关系在关系数据库中的呈现方式。

    如果你只需要在运行时存储这个关系,你可以只添加一个类别列表作为Item类的字段,添加一个类别中的项目列表作为类别类的字段。确保它们在任何时候都是同步的,这就足够了。很容易获得您需要的信息。

    所以,关键是创建一个类 CategoryTag 并为每个类别(如“电动”和“基于布料”)创建一个实例,然后将两者联系在一起 - 要么通过从双方或通过“关系”对象直接链接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多