问题标签 [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 投票
3 回答
77 浏览

oop - 简单的域对象属性值

假设您有一个 Song 的域模型类。歌曲有一个速度属性(一个 int),它应该总是一个正数。这个需求应该是领域模型的一部分还是外部的(例如在 SongManager / 业务逻辑层类中)?

假设您选择这样实现它:

您是否将// what?上面替换为:

  1. 没有。给定一个 Song 实例ss.setTempo(-10)根本不会修改对象的状态。
  2. 将速度设置为某个最小值,例如1.
  3. 在子句setTempo中用选中 throws InvalidTempoException的和throw它标记。else这样,控制器或其他组件负责捕获无效的速度值并决定如何处理异常。
  4. 抛出运行时InvalidTempoException。
  5. 将 tempo 属性提取到 Tempo 类中,其中封装了“必须大于 0”。
  6. 别的东西。

我问是因为我最近一直在探索常见的“分层架构”方法,尤其是领域层。

0 投票
1 回答
179 浏览

java - 我想为搜索类实现接口什么是实现接口的最佳方法?

我想要一个包含几个不同选项的搜索类,我的搜索类应该能够以不同的方式过滤结果,例如:

以上 X,Y,Z,K 是我的标准,它们在我的情况下很常见,所以我决定创建一个如下界面:

应用程序每次都应该能够获得 1 个或多个条件,我的想法是有一个接口来指示一个类实现所有条件和所有条件()方法,以将编译的条件返回给我的搜索类。

所有标准都基于字符串,但我不确定条件()的返回类型,因为它应该结合所有给定的标准并返回一种特定类型作为返回值。

我的搜索类不是基于 SQL,它主要基于 JSON。

谁能建议我为搜索类提供标准接口的最佳方法是什么?

0 投票
1 回答
175 浏览

uml - 以面向对象的方式实现通用数据模型?

我有一个从 LEN SILVESTON 的书中取出的 UDM(通用数据模型),我想在 C Sharp 中将其实现为面向对象的设计,以对 PARTIES、PERSONS 和 ORGANIZATIONS 进行建模。

虽然从逻辑模型 SUPERTYPES 和 SUBTYPES 移动很容易通过类层次结构完成,但我不确定如何处理关系。关系世界(物理数据库)世界中的多对多关系通常会在单独的关联表中实现。我有一种感觉,遵循这种范式并在面向对象的世界中将 MM 关系实现为一个单独的“关联”类可能不是要走的路……。或者是吗?

另外,是否有人知道是否有任何文章以面向对象的方式实现这些 UDM?

感谢您的任何指示。

0 投票
3 回答
699 浏览

java - 清洁代码:依赖注入强制程序代码,如何重构

我有以下课程:

这只是其中一个示例,我还有一些其他类似的类,我将它们作为依赖项注入到其他类中。但它使我的 SchemaFetcher 类像一个单例,我不断地将 schemaDefinition 传递给它的每个方法。这似乎非常程序化,我实际上想让 SchemaDefinition 成为 DatabaseSchemaFetcher 类的实例变量,但在这种情况下,我将无法将 SchemaFetcher 对象注入到我的 Validator 类中,而我应该这样做

但这使我与 fetcher 紧密耦合,这就是我想首先使用依赖注入的原因。

我可以看到我可能有一个 DatabaseSchemaFetcher 的默认构造函数,然后是一个 setSchemaDefintion() 设置器来实现这一点,但这违反了完全使用构造函数构建对象的原则。

如何改进这一点,使其没有程序样式获取器,但也将我的依赖项注入构造函数?我更喜欢构造函数注入,因为它清楚地定义了我的依赖项,而无需任何人查看类的实现来找出类在我使用工厂或服务定位器时使用的依赖项。

0 投票
2 回答
194 浏览

hibernate - OO设计和休眠

我试图对工作门户用例进行建模,如下面的类图所示。我已将 Skill 实体设置为可供工作以及希望重用的求职者共享。

我已经修改了我的 oo 设计,因为我分享了我认为这意味着它的 M:N 关系而不是 1:N 的技能。

问题:

如何使用 hibernate 做以下事情?我需要求助于 SQL 吗?

  1. 由于 Skill 具有 M:N 关系,因此需要关联表 JobSkill 和 SeekerSkill。如何创建工作或求职者实例,以便他们使用数据库中的现有技能?
  2. 我需要进行技能匹配,以便工作技能要求是候选人技能的子集:
    a)雇主 e1:找到所有候选人 - 1{job + 1{candidate}N }N
    b)候选人 c1:找到所有工作 - 1{job + 雇主 }N

我正在考虑为这种情况添加一个业务服务类作为 JobPortal,其中一些方法如下伪代码。如果可以回答findJobsForSeeker方法所需的 HQL 查询:

0 投票
2 回答
82 浏览

java - OOP 中的设计建议

问题

  1. 一个Organization可以有 1 个或多个Credential's。
  2. 每个部署环境(如 DEV、TEST、UAT、PROD 等)都可以有 1 个凭据。
  3. Credential 可以用于 UI 或 App 到 App 通信。

此外,用户可以指示所有环境中的凭证都是相同的。或者,用户可以指示跨环境的用户名相同,但他想为每个环境提供不同的密码。

如您所见,有两个维度可以限定凭证,即端点类型和环境。想知道如何在 OOP 世界中建模这种关系。

0 投票
4 回答
520 浏览

c# - 将组合用于“是 - 一个”关系的问题

我正在为 HR 系统开发系统。有会计员工和程序员员工。在加入公司的第一个月,员工没有被赋予任何角色。一名员工可以同时是会计师和程序员。我有以下代码所示的设计。

现在,我需要通过实现一个新功能来增强系统:

终止所有会计师。(终止意味着将员工的状态设置为 IsActive = false)。问题是我不能在不检查的情况下直接将所有会计师设置为不活动。我需要检查他是否有任何其他角色。

如何改造这些类以使终止功能更自然 OO ?

更新

我正在寻找具有 EF Database First 解决方案模型和 @AlexDev 答案的数据库架构的答案。

C# 代码

在此处输入图像描述

@AlexDev 回答

参考

  1. 访问外部信息的 DDD 方法
  2. 更喜欢组合而不是继承?
  3. 域模型中的继承与枚举属性
  4. 实体框架:在存储库中获取子类对象
0 投票
3 回答
107 浏览

c# - 如何设计一个订阅者依赖另一个订阅者的场景?

在我的应用程序中,我有一个场景,如果特定模块发生更改,则必须将其通知给其他几个模块。我认为观察者模式适合这里,通过将发生更改的模块保持为主题并将要通知的模块作为观察者。

但是按照观察者模式的原则,观察者是相互独立的。观察者之间不应该有任何联系。就我而言,尽管模块不同,但它们是相互依赖的。成功完成第一个模块的执行对于下一个要执行的模块很重要。此外,如果模块 x 发生故障,则必须恢复模块 1 对模块 x-1 所做的所有更改。也就是说,要么所有模块都必须成功执行,要么我们必须回滚到以前的状态。你可以把它想象成一个交易。然后我意识到我错了,观察者模式不是实现这一点的正确方法。

我有点想提出一个干净的设计,其中有一组模块需要在主题发生变化时进行处理,但在约束条件下,模块相互依赖。有人可以帮我解决这个问题以提出一个好的设计吗?

0 投票
4 回答
743 浏览

java - 程序代码和领域驱动设计风格代码有什么区别?

我正在学习领域驱动设计(DDD)技术,我觉得我还没有很好地理解它。

DDD 建议将业务逻辑(不是基础设施,如持久性、安全性等)放入域对象、持久性存储库、为客户端(演示)组装域对象的聚合器、域对象和存储库之上的薄层服务、聚合器并充当事务边界。

让我这样说:

在 DDD 中,ViewController --> SomeService --> {Domain Objects, Repositories, Aggregators}

在我当前的(程序风格)方法中:ViewController --> SomeService --> DAO/Repository

在这里,ViewController 与一个或多个服务对话,以使用 DAO 从/向数据库拉取/推送数据。如果仅对域对象的属性进行操作的任何业务逻辑将在该域对象本身的方法中。最后,从服务获得的数据被聚合到 DTO 中,以呈现在视图层中。

所以对我来说,这两种方法看起来都差不多。

有人可以解释一下我错过了什么吗?

PS:我正在添加更多信息以更好地解释我的问题。理论上每个人都在说 DDD 建议“逻辑应该在域对象中”。好的。让我们来看一个真实的场景。

在 ShoppingCart 应用程序中,一些用户下了订单。要处理订单,我需要执行以下所有子任务:

  1. 获取每个项目的详细信息并计算总订单价格。

  2. 获取收货地址并使用一些地址验证服务对其进行验证

  3. 验证/验证信用卡详细信息

  4. 将所有订单相关信息保存到数据库中

因此,通过遵循 DDD,我将提出逻辑,

  1. Order 对象中的 Order Total 计算,该对象循环遍历其 List 对象。

  2. 在地址对象中,我将拥有调用一些 BING 地址验证的 validate() 方法。

  3. 在 CreditCard 类中,我将拥有 authorize() 方法,该方法调用一些 CCAuthorizationService 来授权使用一些第三方服务。

  4. 使用一些存储库将所有订单内容保存到数据库中。

所有这些步骤都将通过调用 Order.process() 来触发

如果这是正确的 DDD 方法?如果是这样,我们的域对象直接与存储库交互,这似乎违反了关注点分离。

如果这不是正确的 DDD 方法,有人可以告诉我您如何为上述用例设计吗?

0 投票
3 回答
3277 浏览

design-patterns - OOAD 与设计模式 - 困惑

我拿起了两本 HEAD 第一本书,OOAD 和设计模式。当我开始阅读设计模式时,我很困惑。以下是我的基本疑问:

  1. 设计模式是否仅适用于面向对象的设计?对我来说,DP似乎只能在OOAD中应用

  2. 设计模式是(一组用于)OO 设计的一部分吗?具体来说,我想问的是,OOAD 是否是更大的目标,而设计模式有助于实现目标

在阅读了前 4 或 5 个模式之后,看起来如果某个人是一名优秀的 OO 设计师,他会自动使用这些模式进行设计。

我真的很困惑