通过添加许多琐碎的字段来过度扩展对象设计?

时间:2012-01-11 16:25:31

标签: oop

我必须在我的商业模式中为一个对象添加一些简单或很少使用的属性。

因此,想象一下类Foo,它有一堆标准信息,如价格,颜色,重量,长度。现在,我需要向Foo添加一些属性,这些属性很少偏离规范并且很少使用(在整个域的范围内)。因此,对于95%的实例,Foo.DisplayWhenConditionIsX为真;同样,Foo.ShowPriceWhenConditionIsY几乎总是如此,并且Foo.PriceWhenViewedByZ在大多数情况下具有与Foo.Price相同的值。

在我的类和数据库表中添加十几个这样的字段对我来说有点不好意思。但是,我不知道将这些新字段包装到它们自己的FooDisplayAttributes类中是有意义的。这感觉就像增加了我的DAL和BLL的复杂性,除了较小的对象之外几乎没有什么好处。有什么建议吗?

3 个答案:

答案 0 :(得分:1)

尝试为很少使用的字段设置单独的存储类/结构,并将其保存为单个字段,例如“rareUsedFields”(例如,它将是C ++中的指针和Java中的引用 - 您不需要提一下你的语言。)

在课堂上为这些字段设置setter / getters。 Setter将检查该值是否与默认值不同并且懒惰地初始化rarelyUsedFields,然后设置相应的字段值(例如,rarelyUsedFields.DisplayWhenConditionIsX = false)。如果是rarelyUsedFields,则他们会读取DisplayWhenConditionIsX值并返回默认值(NULL为true,依此类推),否则返回rarelyUsedFields.DisplayWhenConditionIsX

这种方法经常使用,请参阅WebKit的Node.h作为示例(及其focused()方法。)

答案 1 :(得分:0)

抽象使您的问题有点难以理解,但我建议使用自定义的getter,例如Foo.getPrice()Foo.getSpecialPrice()

第一个只返回属性,而第二个将首先对它执行操作。

这只有在有办法从原始属性值计算“很少使用的版本”时才有可能,但在大多数情况下这是可能的,只要您可以从另一个存储参数的对象访问数据,例如{ {1}}。

答案 2 :(得分:0)

我看到的问题更多是关于Foo对象有副作用。 在您的示例中,我看到两个功能:显示和价格。

我会构建一个或多个显示器(谁知道如何显示)并使价格成为组件对象,并带有内部价格修改器列表。

请注意,只有当您的Foo对象被众多客户端调用时,所有这些才有意义。