- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我读过几篇文章(还有功能域建模
一书),其中建议将域对象的状态与行为分离,但我无法理解这种方法相对于范围域模型的优势.
以下是覆盖域模型的示例:
case class Account(id: AccountId, balance: Money) {
def activate: Account = {
// check if it is already active, eg, enforce invariant
...
}
def freeze: Account = ???
}
我可以通过以下方式使用此帐户进行链式操作:
account.activate.freeze
以下是他们建议的“贫血”方法的示例:
case class Account(id: AccountId, balance: Money)
object AccountService {
def activate = (account: Account) => {
// check if it is already active, eg, enforce invariant
...
}
def freeze = (account: Account) => {
...
}
}
在这里我可以像这样链式操作
activate andThen freeze apply account
除了“优雅”的语法之外,第二种方法的优点是什么?
此外,在到达域模型的情况下,我将在单个类中强制执行不变量,但在“贫乏”模型的情况下,逻辑/不变量可以跨服务传播
最佳答案
我提供两个思维过程,可以帮助解释这个难题:
<小时/>您的示例和书中的状态
概念有所不同。(我确实希望我们都指的是 Functional and Reactive Domain Modeling )。
您的示例状态激活和卡住可能是领域概念,而本书讨论的状态仅用作标记。它们不一定在域逻辑中发挥作用,其存在只是为了消除工作流状态的歧义。前任。 已申请、已批准和已丰富。
<小时/>函数式编程就是实现行为,这些行为独立于传递给它们的数据。
实现此类行为时有两个方面需要注意。
行为可以跨上下文重用。它可以是一个抽象特征,如果你愿意的话,可以是一个幺半群,它采用任何类型T,并在它。在您的示例中,卡住
可能是这样的行为,适用于帐户
、贷款
、余额
等。
该行为没有任何副作用。人们应该能够使用相同的数据集一次又一次地调用该行为,并收到相同的预期响应,而不会影响系统或引发错误。引用您的示例,对帐户重复调用卡住不应引发错误。
结合这两点,可以说将行为实现为跨不同上下文的可重用代码段(作为 Service
),同时确保输入经过验证(即验证处理前作为输入提供的对象的状态)。
通过将对象的可接受状态表示为单独的类型并使用此显式类型参数化模型/对象,我们可以在编译时强制执行输入的静态检查。引用书中提供的例子,你只能批准然后丰富
。任何其他不正确的序列都会引发编译时错误,这比使用防御性防护在运行时检查输入要好得多。
因此,第二种方法最终不仅仅是优雅的语法。它是一种基于对象状态构建编译时检查的机制。
<小时/>因此,虽然输出看起来缺乏模型,但第二种方法是利用函数式编程带来的一些漂亮的模式。
关于scala - DDD功能方式: Why is it better to decouple state from the behavior when applying DDD with functional language?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56836243/
我们有两个系统,系统 A 将数据发送到系统 B。要求每个系统都可以独立于另一个系统运行,并且如果另一个系统宕机,则任何一个系统都不会崩溃。问题是在满足解耦要求的情况下,系统A与系统B通信的最佳方式是什
我有同一个第三方设备的两个 C 库。区别在于一个库(例如库 A)比另一个库(例如库 B)具有更多功能。我有两个使用该设备的大平台。平台 A 使用库 A,平台 B 使用库 B。 为了支持更多的平台和系统
我刚刚开始使用 Prism 和 Unity 学习 WPF MVVM。 将 View 与 View 模型解耦效果很好,但我不明白如何连接我的 View 模型和模型。 我觉得在我的 View 模型中创建一
大家好,我正在制作一个 Cocos2d-x 游戏,其中包含 gradle 文件,我一直在寻找提高构建时间的方法,我尝试谷歌搜索,甚至查看 Gradle 文档,但我似乎无法理解“到底是什么”解耦”项目是
我有一个相对简单的 DSL,我希望它比一堆手动编码的 java.util.regex.Pattern 语句 + 解析逻辑更可靠地处理。 引用最多的工具似乎是 ANTLR。我对它不熟悉,愿意尝试一下。但
有没有办法将 jsx 从组件的渲染函数移动到单独的文件?如果是这样,我如何在渲染函数中引用 jsx? 最佳答案 您可以使用 react-templates .它为您提供了标记和组件本身之间的准确分离,
我在这里使用了 django-environ 来设置环境变量,但它给了我 SECRET_KEY 错误。如何正确配置环境变量? 我还为此使用了 python-decouple 而不是 django-en
我正在尝试 Exercise 2 of Chapter 8.5在迈克尔·哈特尔的 Ruby on Rails Tutorial .练习如下: 按照第 8.3.3 节中的示例,浏览用户和身份验证请求规范
我被迫将我的 .env 文件保存在项目根目录之外的非标准路径中(完全在一个单独的目录中)。 假设我在 /var/projects/my_project 中有我的 Django 项目,尽管我在 /opt
我正在阅读有关依赖倒置和解耦的理论,但我看不出两者之间的区别。 依赖倒置谈论解耦功能组件,以便较高级别的组件不依赖于较低级别的组件。 解耦谈论同样的事情以及如何实现它。但随后我们的 IoC 容器让事情
我试图从heroku cli在heroku上部署django项目。因此,我创建了一个应用程序,然后从项目目录中运行了git push heroku master。然后我得到了错误: remote: -
我是一个真正的性能爱好者,但我也意识到执行自动化测试的重要性(直到更好的形式验证方法成为主流)。 缺点是,当您尝试针对可测试性进行设计时,您会开始引入接口(interface)来表示您的依赖项。如您所
我读过几篇文章(还有功能域建模一书),其中建议将域对象的状态与行为分离,但我无法理解这种方法相对于范围域模型的优势. 以下是覆盖域模型的示例: case class Account(id: Accou
我正在阅读这篇文章: http://danielribeiro.org/yes-you-can-have-low-coupling-in-a-symfony-standard-edition-appl
我有 300 多个类(class)。它们在某些方面是相关的。 为简单起见,所有关系都是 1:1。 这是一个示例图。 (在实际情况下,大约有 50 个关系对。) 注意:在某些情况下,某些关系可能不存在。
我的用户界面如下所示: +--------+---------------+ | model1 | model details | | model2 | here,
当我的 settings.py 有 ALLOWED_HOSTS = [] - 服务器工作正常。但是当我执行 ALLOWED_HOSTS = config('ALLOWED_HOSTS') - 它给出了
我是一名优秀的程序员,十分优秀!