【发布时间】:2011-10-04 15:51:35
【问题描述】:
从示例 HR 系统中获取以下代码。用户有能力记录缺勤,并且可以是各种类型,包括假期和疾病。这将是一个基于 ORM(如 NHibernate)的域模型。
public class Absence
{
public long Id {get;set;}
public Employee Employee {get;set;}
public DateTime StartDate {get;set;}
public DateTime EndDate {get;set;}
public virtual void DoSomething()
{ ... }
}
public class Holiday : Absence
{
public string Location {get;set;}
public override void DoSomething()
{ ... }
}
public class Sickness : Absence
{
public bool DoctorsNoteProvided {get;set;}
public override void DoSomething()
{ ... }
}
这是一个示例 - 请不要质疑为什么需要位置,假设它是一个规范。
用户想要更改类型 - 他以为员工生病了,但后来想起那是假期。同样,您可能认为这是一个糟糕的设计,但将其视为一项需求——这代表了一个对我来说已经多次出现的问题。
问题是您无法将对象的类型从 Sickness 更改为 Absence。一般来说,建议是优先组合而不是继承(四人组)并这样做:
public class Absence
{
public long Id {get;set;}
public Employee Employee {get;set;}
public DateTime StartDate {get;set;}
public DateTime EndDate {get;set;}
public AbsenceType Type {get;set;}
public void DoSomething()
{
Type.DoSomething();
}
}
但是当我这样做时,Holiday 和 Sickness 的特定属性何时会消失(分别是 Location 和 DoctorsNoteProvided)?
【问题讨论】:
标签: nhibernate design-patterns architecture domain-driven-design