Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 避免抽象类和继承_Oop_Inheritance_Domain Driven Design - Fatal编程技术网

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]