Oop 避免抽象类和继承
假设我正在举办一个有邀请的活动(每个“受邀请的人”代表一个邀请,因此一个活动有多个邀请):Oop 避免抽象类和继承,oop,inheritance,domain-driven-design,Oop,Inheritance,Domain Driven Design,假设我正在举办一个有邀请的活动(每个“受邀请的人”代表一个邀请,因此一个活动有多个邀请): 类型与FACEBOOK和电子邮件在某种程度上是一个常数,标识符则分别是FBUID或电子邮件地址。我喜欢你在编辑中的想法 您可以在域层中放置NotificationService,并在基础结构层(FacebookNotificationService/EmailNotificationService)中添加适配器 还有一个NotificationDispatcher(它也是一个适配器,但聚合了其他适配器)
类型
与FACEBOOK
和电子邮件
在某种程度上是一个常数,标识符
则分别是FBUID或电子邮件地址。我喜欢你在编辑中的想法
您可以在域层中放置NotificationService,并在基础结构层(FacebookNotificationService/EmailNotificationService)中添加适配器
还有一个NotificationDispatcher(它也是一个适配器,但聚合了其他适配器)将通知(按被邀请者类型)发送到相应的适配器。我仍然会保留一个抽象的
invitee
值对象,其中包含两个派生对象EmailInvitee
和FacebookInvitee
每种类型的被邀请者都可以提出自己的WasNotified
,然后由知道如何处理它的基础结构层通知服务捕获
通常我会用FacebookInvitee和
EmailInvitee,并创建了与摘要的关联,但这是
我现在知道是邪恶的
继承并不是那么邪恶。
如果您的类FacebookInvitee
和EmailInvitee
具有相同的接口,我认为没有理由避免继承。如果接口不同并且需要转换为具体类型,继承会增加复杂性
type
与FACEBOOK
和EMAIL
在某种程度上是一个常量,而
标识符
则分别是FB UID或电子邮件地址
您的示例与重构非常相似。无论如何,需要编写
if else
代码块来检查被邀请者类型
,并使用其标识符
将邀请发送到某处。谁应该对此负责?在您的解决方案中,Invitee
只是一个没有行为的DTO。如果Invitee
具有行为,并且可以Send()
邀请本身,那么我将使用继承并为每个具体类(例如FacebookInvitee、EmailInvitee)实现Send()
。被邀请者的来源(facebookinviter或电子邮件地址)是否会影响业务逻辑设计?例如,某些东西只能应用于FaceBookInvestee?好问题;好吧,一旦涉及到通知(比如“与被邀请者取得联系”),它就会在某种程度上影响BL。尽管如此,我还是要说其他一切都与表示相关。@AdrianFöder抽象值对象究竟是什么邪恶?在许多语言中,这种数据类型被称为。只有一个域实体被表示,但是有两种不同的方式来表示该实体。在传统的OOP语言(如C#或Java)中,一个具有2个具体化的抽象类是处理这种情况的惯用方法。在函数式语言中,您可能会使用变体来表示这种情况,即两种情况之间的模式匹配。这与第二个示例的类型标识符更接近。中的变体说明从C#的角度给出了一个很好的概念示例,这可能是一个比wiki页面更容易理解的解释。
[«aggregate root»;Invitation]<>1..*-[«value object»;EventIdentifier]
[«value object»;EventIdentifier]-<>[«aggregate root»;Event]
[«value object»;Invitee|emailAddress;facebookIdentifier]-<>[«aggregate root»;Invitation]
[«value object»;Invitee|type;identifier]-<>[«aggregate root»;Invitation]