主观与客观,破除DDD凭经验魔咒

news/2024/9/21 6:58:53/文章来源:https://www.cnblogs.com/xiaoweiyu/p/18385539

本文书接上回《学习真DDD的最佳路径》,关注公众号(老肖想当外语大佬)获取信息:

  1. 最新文章更新;

  2. DDD框架源码(.NET、Java双平台);

  3. 加群畅聊,建模分析、技术实现交流;

  4. 视频和直播在B站。

神秘的“凭经验”

一千个人眼中有一千个哈姆雷特,每个人的经历不同,认知不同,那么看待哈姆雷特的角度和感受也不同。在软件工程领域,也有著名的关于如何做好软件设计的观点:“凭经验”。然而,“凭经验”就意味着不可复制,如果软件设计只能凭经验,那还不如说是撞大运。

读过本系列前文《老肖的领域驱动设计之路》的朋友,应该知道,我对此是持相反的观点的,今天通过几分钟的篇幅,呈现我的理解,尝试破除凭经验的魔咒。

凭经验与主观判断

首先,我认为依靠经验来决策,本质上是一种主观判断,尤其是那些无法由客观事实和逻辑推导的判断和无法建立普遍共识的判断。至少凭经验这个方法本身,是主观的。试想一下,如果人们都仅仅依靠自己的过往经验来做判断,那么“靠左走好”和“靠右走好”就会成为普遍的观点冲突,而这个冲突的背后就是,“我不要你觉得,我要我觉得”。

当然更准确的说法是“凭经验”意味着不能绝对客观。

主观与客观

主观的反面是客观,客观意味着观点基于客观事实,基于符合事实的推导逻辑链,也就意味着客观决策,能够在一定的规则范围内建立共识的判断结果,那么我们可以得到如下观点:

  1. 主观判断对应非标,无法标准化

  2. 客观判断对应标准,可以标准化

如果对于一件事情可以标准化判断,是不是意味着这件事是可执行、可落地的?

需求分析和建模设计中的主观与客观

先举个例子,假设我们有个需求:“整理房间里的物品”,那么我们的解决方案可以是:“取N个收纳箱,把物品一个个放进去”,那么这里就有一些主观和客观的决策在里面。

主观的部分有:

  1. 决定用多少个收纳箱

  2. 哪些物品放哪个收纳箱

客观的部分有:

  1. 收纳箱之间相互独立

  2. 一个物品不会被放在两个收纳箱里

如果我们将物品和收纳箱对应到建模设计中,收纳箱里装物品,而软件是领域模型负责需求点的满足,则可以这样对应:

  1. 物品对应需求点

  2. 收纳箱对应领域模型

基于这样的对应,我们可以推导出我们在需求分析和建模时候,哪些部分是主观的,哪些部分又是客观的。

主观的部分:

  1. 有多少个领域模型

  2. 哪些需求点由哪个领域模型来满足

客观的部分:

  1. 领域模型之间相互独立

  2. 一个需求点不被两个领域模型来满足

回到领域驱动设计

如果你是跟着我的思路读到这里,并且认同前面的推导逻辑以及系列前文的核心观点“领域驱动是一种价值观”,这种价值观是“边界明确是最重要的事”,最精彩的部分来了,你会发现,我们前面推导出来客观的部分,是完全契合领域驱动设计价值观的。而主观的部分,甚至都不曾在领域驱动设计概念里提及。

所以,回到文章的开头关于凭经验的说法,我们认为软件设计中,凭经验的部分不会影响领域驱动设计价值观的践行。

那么我们的核心观点是,一个决策是否符合领域驱动设计,是可以客观判断的,领域驱动设计客观上可以落地执行,并不依赖人的经验

主观的部分不重要吗

我们再把建模时候主观的部分列出来:

  1. 有多少个领域模型

  2. 哪些需求点由哪个领域模型来满足

这部分当然也很重要,经验越丰富越容易更快速地定义出职责分配更准确的模型,但它不如“边界明确”这件事重要,因为“边界明确”解决的是结构性的问题,而主观的决策部分解决的是“局部准确性问题”,这就好比建筑里的“承重墙”和“隔间墙”之间的关系,显然承重墙决定了整体的架构,对建筑最终效果以及未来改造成本有更深远的影响。

后续

到此,《老肖的领域驱动设计之路》系列的整体逻辑已经接近闭环,下一期将从“反DDD”的视角来剖析软件行业的乱象,以及开发者可以努力的方向。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/788727.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux网络编程】Reactor模式与Proactor模式

【Linux网络编程】Reactor模式与Proactor模式 Reactor模式 Reactor 模式是指主线程即 IO 处理单元只负责监听文件描述符上是否有事件发生,有则立刻将该事件通知给工作线程即逻辑单元,除此之外,主线程不做任何其它实质性的动作。读写数据,接受新的连接,以及处理客户请求均在…

2024, 是时候告别CentOS了

到了2024年, 不管你有多喜欢CentOS, 也到了该告别CentOS的时候了. 那个可能在你职业生涯中陪伴了你非常多年, 一直稳定运行的Linux系统, 在2024年后, 已经不再是你可靠的选择了. 最后一个仍然还在维护中的CentOS 7将于2024年6月底就END OF LIFE了. 这意味着, 如果你仍然继续使用…

StringBuilder和StringBuffer的区别

一 区别 StringBuilder 线程不安全 StringBuffer 线程安全,原因是它的主要方法用了syncronized关键字修饰二 分析 看源码见

[Azure Application Insights]Azure应用程序见解概述页面中workspace的link不见了?

问题描述 在Azure Application Insights 的概述页面中,可以直接点击 Workspace Link 进入到 Workspace 资源页面。但是,在下面的示例图中,Workspace Link不见了? 这是什么原因呢? 问题解答 这是因为 Workspace 的资源组发生了改变。 Application Insights 无法根据Worksa…

MYSQL索引的选型比较

MYSQL索引 前言 Mysql 作为互联网中非常热门的数据库,其底层的存储引擎和数据检索引擎的设计非常重要,尤其是 Mysql 数据的存储形式以及索引的设计,决定了 Mysql 整体的数据检索性能。 我们知道,索引的作用是做数据的快速检索,而快速检索的实现的本质是数据结构。通过不同…

Prism:结语

Prism:结语 prism基本功能也已经学完了,在学习过程中遇到过很多问题,其中就有一点条我就一直困惑,那就是:依赖注入 什么是依赖注入:(gpt写的) 依赖注入(Dependency Injection,简称 DI) 是一种设计模式和编程技术,用于实现控制反转(Inversion of Control,IoC)。它…

一个.NET开源、免费的跨平台物联网网关

前言 今天大姚给大家分享一个基于.NET开源、免费的跨平台物联网网关:IoTGateway。 项目介绍 IoTGateway是一个基于.NET6的跨平台物联网网关。通过可视化配置,轻松的连接到你的任何设备和系统(如PLC、扫码枪、CNC、数据库、串口设备、上位机、OPC Server、OPC UA Server、Mqtt…

Prism:事件聚合器

Prism:事件聚合器 Prism框架提供了一个事件聚合器,可以帮助不同模块之间进行解耦和通信。开发人员可以通过发布和订阅事件来实现模块之间的交互。 IEventAggregator松耦合基于事件通讯 多个发布者和订阅者 微弱的事件 过滤事件 传递参数 取消订阅该功能主要作用为, 事件聚合器…

博弈论算法总结

正在完善! 何为博弈论 博弈论 ,是经济学的一个分支,主要研究具有竞争或对抗性质的对象,在一定规则下产生的各种行为。博弈论考虑游戏中的个体的预测行为和实际行为,并研究它们的优化策略。 先来看一道小学就接触过的思维题 你和好基友在玩一个取石子游戏。面前有30颗石子,…

Prism:区域(Region)

Prism:区域(Region) 什么是区域? 区域 (Region) 用于实现模块化应用程序中的视图组织和管理。区域允许您在一个或多个视图容器中动态地加载和卸载视图,从而实现灵活的内容布局和管理。 区域的用途动态内容加载:您可以将不同的视图加载到同一个区域中,这样可以实现在运行时动…

idea import配置

简介 本文记录idea中import相关配置:自动导入依赖、自动删除无用依赖、避免自动导入*包 自动导入依赖在编辑代码时,当只有一个具有匹配名称的可导入声明时,会自动添加导入File -> Settings -> Editor -> General -> Auto Import 勾选Add unambiguous imports on…

【ROS教程】安装ROS全流程及可能遇到的问题

@目录1.配置Softerware & Updates2.添加软件源3.设置key4.更新并安装4.1 更新4.2 安装(ros-noetic-desktop-full)4.2.1 安装aptitude4.2.2 安装ROS软件包5.添加环境变量6.安装构建依赖7.初始化和更新7.1 初始化7.1.1 目前可行的解决办法:重新定位资源7.1.2 结果7.2 更新1.…