【发布时间】:2012-11-05 19:57:08
【问题描述】:
我有代表同一个业务实体的不同类型的对象。
UIObject、PowershellObject、DevCodeModelObject、WMIObject 都是对同一实体的不同表示。
假设实体是Animal,那么我有AnimalUIObject、AnimalPSObject、AnimalModelObject、AnimalWMIObject等。
现在AnimalUIObject、AnimalPSObject、AnimalModelObject 的实现都在单独的程序集中。
现在我的情况是我想验证业务实体Animal 的内容,而不管它来自哪个程序集。所以我创建了一个GenericAnimal 类来表示Animal 实体。
现在在 GenericAnimal 我添加了以下构造函数:
GenericAnimal(AnimalUIObject)
GenericAnimal(AnimalPSObject)
GenericAnimal(AnimalModelObject)
基本上我让GenericAnimal 依赖于所有底层程序集,以便在验证时处理这个抽象。
现在另一种方法是让GenericAnimal 带有一个空的构造函数
允许这些底层程序集有一个Transform() 方法,该方法将构建GenericAnimal。
这两种方法各有利弊:
第一种方法:
优点:所有构造逻辑都在一个类中的一个地方GenericAnimal
缺点:GenericAnimal class 必须在每次有新的表示形式时都被触及。
第二种方法:
优点:将构建责任委托给底层程序集。
缺点:由于构造逻辑分布在程序集中,明天如果我需要在GenericAnimal 中添加属性X,那么我必须触摸所有程序集以更改Transform 方法。
哪种方法看起来更好?
或者您认为哪个是较小的邪恶?
有没有比以上两种更好的替代方法?
只是根据我收到的 cmets 进一步详细说明。 我没有修改底层对象结构的奢侈,即我无法更改 AnimalUIObject AnimalPSObject 等。GenericAnimal 是我仅为验证目的而引入的构造。
【问题讨论】:
-
我注意到 .NET 术语 - 为什么是 Java 标记?
-
虽然术语是 .Net,但问题确实与语言无关。
-
我认为您真的可以在这里使用比
Animal更好的东西作为示例。 -
理想情况下,所有对象都应该实现相同的接口。如果你有能力改变它们,我会考虑这样做。否则你应该实现必要的包装器。