问题标签 [ooad]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2587 浏览

c# - 当我们有不同的回报类型时实现策略模式

我有 SaveManager 抽象类和我的具体类 TVSaveManager、DataSaveManager 和 VoiceSaveManager 实现 SaveManager 抽象类。

工厂类将决定创建哪个经理并将列表发送给我们。我将遍历列表并调用每个具体类都将遵循的公共接口“MapAndSaveProduct”。我想更像是一种策略模式。

但问题是所有具体的 savemanage 的 MapAndSaveProduct 方法的返回类型都不同。TvSaveManager 的 TVResponse 和 DataSaveManager 的 DataResponse 等等。因此,我创建了 SaveResponseModel 类来组合所有返回类型(我将 SaveResponseModel 传递给工厂,以便它将传递给所有具体的 savemanager 类的构造函数。各个类将设置所需的属性。例如 TvSaveManager -> saveResponseModel.TvResponse)。我得到了想要的结果,代码看起来很干净。

问题是,1)当我们有不同的类型时,使用这种模式是否正确?2)如果具体类有不同的类型,我们不应该使用策略模式吗?3)在这种情况下,我是否应该采用不同的设计模式。如果是,是哪一个?

0 投票
2 回答
1013 浏览

php - PHP Abstract Method versus Default Method

I notice that when I define a method as abstract, the signature of child classes needs to be compatible with it. This robs me of an opportunity to use the type checking in the child class' signature.

If I define the parent method as a concrete method with a default implementation, I can then override the parent method without complying with its interface.

In cases where a suitable default implementation exists, I am inclined to use the second approach. But am I letting myself in for trouble?

It just seems odd to me that the use of 'abstract' can be so limiting, so I want to know if I'm missing something...

Note - I see that similar questions have been asked in relation to other languages, but not so much PHP.

0 投票
4 回答
1814 浏览

c# - DDD - 服务层和存储库之间的重复

我曾开发过几个尝试遵守 DDD 原则的应用程序,我注意到我们最终会遇到服务层和存储库之间存在重复的情况,感觉就像代码异味。

对于服务层中的大多数操作,它似乎是直接映射到 CRUD 操作、GetAll、GetById、Create、Delete 等。架构的流程在以下几行中:我有一个控制器调用服务层调用一个存储库,该存储库调用一个与后端对话的ORM ..

因此,例如GetAll将同时存在于 SL 和存储库中。现在,如果我们有一个更改/业务要求 GetAll 应该忽略某些项目,我应该怎么做,我应该在存储库中忽略这些,还是应该进入服务层的业务逻辑?如果我们只是有一个直接调用 ORM 的服务层,生活会不会更轻松?

总结一下:我知道服务层可以抽象一些业务逻辑,但是当 - 在大多数情况下 - 它正在处理简单的 CRUD 操作时,摆脱存储库不是更容易吗?但是,如果 SL包含一些具有复杂业务逻辑的方法,这些方法是否应该通过存储库?从良好的设计角度来看,我应该支持一致性并始终通过存储库还是保持简单并且仅在存储库不是简单的一对一映射到 CRUD 操作时才使用它。

PS:我意识到似乎有类似的问题,但没有找到任何令人满意的答案

0 投票
2 回答
70 浏览

oop - 如何为博客系统设计未分类的帖子

我有 3 张桌子:

邮政

类别

PostCategory(多对多关系表)

当用户为帖子选择一个或多个类别时,它可以正常工作。但是一种情况是,当用户没有选择任何类别时,我应该如何管理这些未分类的帖子?

我想到了两种方法,不知道哪个更好。

1.未分类的帖子不应插入[PostCategory]。

问题:

a) 在 URL 路由中,我使用“ /Post/Category/Travel ”来显示分类帖子。现在用户想要列出所有未分类的帖子,我只能使用“ /Post/Category/Uncategorized ”之类的东西。这将导致许多代码更改,以便从正常的 URL 路由值中区分“未分类”字符串。

b) 当用户自己在系统中添加一个名为“Uncategorized”的类别时会造成混乱。(可能我可以定义一些系统保留字,但我觉得不太好。)

2.在[Category]中添加一个常数值(Uncategorized),也作为系统保留字。如果用户没有选择任何类别,则将帖子插入 PostCategory(postId, UncategorizedId)。

问题:

它将“Uncategorized”视为一个类别,对计算机来说是一个正常的类别,只有人类知道这是一个特殊的类别。在OOP设计中不好。

很难决定哪个更好,有没有其他方法来管理“未分类”的帖子?

0 投票
2 回答
618 浏览

c# - 处理客户端/服务器消息?

从我的客户端/服务器接收序列化数据,一旦数据被反序列化,它就会进入一个命令处理程序,receivedData.Action其中ClientMessage

命令处理程序将处理客户端消息并返回应给予客户端的响应。

我有一个客户端消息的枚举,如下所示:

我遇到的困难是如何编写所有动作,例如:

  • 我应该为客户端发送的内容和服务器应回复的内容分别设置一个枚举吗?
  • 或者我应该有一个包含所有消息的枚举并按照要求进行操作?
  • 或者我应该如何定义消息并处理它?

这是我的服务器/客户端当前所做的,只是为了让您更好地查看:

  1. 服务器启动
  2. 客户端连接
  3. 客户端向服务器发送身份验证
  4. 服务器验证客户端并发送连接的批准消息
  5. 客户端将从那里开始向服务器发送和更新配置文件

这只是一个大致的例子。

包处理程序

命令

初始化示例

PS:如果我的标题已关闭并且您有更好的建议,请告诉我,或者您是否可以继续更新它,我不确定如何用英语描述。

0 投票
3 回答
4292 浏览

uml - OOAD 和 UML 的区别?

我是软件领域的新手。我不知道 OOAD 和 UML 之间的区别。任何人都可以建议学习OOAD的教程。

0 投票
2 回答
576 浏览

architecture - 将顺序内聚转变为功能内聚?

本网站所述,

具有(仅)程序凝聚力的模块是支持不同且可能不相关的活动的模块,其中控制从一个活动传递到下一个活动。Page-Jones 给出了一个模块示例(其名称可能类似于“准备假日餐:”

  • 清洁前一餐的餐具
  • 准备烤火鸡
  • 打电话
  • 洗澡
  • 切菜
  • 设置表

现在我的问题是,如果这些活动中的每一个,即打电话,都被提取到它们自己的方法中,但仍然以相同的顺序调用,即

这种方法仍然是程序凝聚力的一个例子吗?或者它是否在功能上具有凝聚力,因为它支持执行一项与问题相关的任务的活动,在这种情况下是准备一顿饭?

0 投票
2 回答
143 浏览

c# - C#抽象类和协变

我有一些这样的代码:

如果我重用 DataFilter 类:

如何重用列表动物属性???

如何重构它以将 function1 拆分为不同的类

0 投票
3 回答
99 浏览

c# - 在构造函数以外的地方构建结构/对象

我有代表同一个业务实体的不同类型的对象。 UIObject, PowershellObject, DevCodeModelObject,WMIObject都是对同一实体的不同表示。

所以说如果实体是Animal那么我有AnimalUIObject, AnimalPSObject, AnimalModelObject,AnimalWMIObject等。

现在AnimalUIObject, AnimalPSObject,的实现AnimalModelObject都在单独的程序集中。

现在我的场景是我想验证业务实体的内容,Animal而不管它来自哪个程序集。所以我创建了一个GenericAnimal类来表示Animal实体。

现在GenericAnimal我添加了以下构造函数:

基本上,我GenericAnimal依赖于所有底层程序集,以便在验证时处理这个抽象。

现在执行此操作的另一种方法是GenericAnimal使用一个空的构造函数,并允许这些底层程序集有一个Transform()方法来构建GenericAnimal.

这两种方法都有一些优点和缺点:

第一种方法:
优点:所有构造逻辑都在一个类中的一个地方GenericAnimal
缺点:GenericAnimal每次有新的表示形式时都必须触及类。

第二种方法:
优点:将构建责任委托给底层组件。
缺点:由于构造逻辑分布在组件中,明天如果我需要添加一个属性XGenericAnimal那么我必须触摸所有组件来更改Transform方法。

哪种方法看起来更好?
或者您认为哪个是较小的邪恶?
有没有比上述两种更好的替代方法?

只是根据我收到的评论进一步阐述。我没有修改底层对象结构的奢侈,即我无法更改 AnimalUIObject AnimalPSObject 等。GenericAnimal 是我仅为验证目的而引入的构造。

0 投票
2 回答
69 浏览

oop - 以不同方式复制对象

我正在寻找以不同方式复制对象的设计原则/模式。例如,我有以下选项来复制 ACCOUNT 类类型的对象。

1) 完全克隆

2)克隆除信用详细信息之外的所有内容

3)克隆信用逆转(否定值)等。

在所有场景中,都克隆了同一个对象;但根据客户的输入具有不同的值。我在想原型模式;但它不允许客户端控制应如何复制对象。

谢谢,

普拉迪普