领域驱动设计(4)—绑定模型与实现

(4)—绑定模型与实现

    • 模式:MODEL-DRIVEN DESIGN
    • 为什么模型对用户至关重要?
    • 模式:HANDS-ON MODELER

很多项目设计之初只考虑到模型如何设计,没有将模型如何实现、数据关系如何存储这些实现考虑在内,往往设计“很完美”的模型交给开发人员却无法落地。

虽然项目初期设计了领域模型,但是模型没有与实现绑定,不能帮助开发可运行的软件,这种纸上谈兵的模型是没有意义的。

模式:MODEL-DRIVEN DESIGN

有些项目设计之初也使用了模型,但这些模型没有考虑到软件的实现,是完全脱离程序设计的分析模型。分析模型仅仅是理解工具,分析中也有一些知识消化的过程,但编码后,程序设计人员不得不重新进行抽象,这会导致领域知识丢失。

模型驱动设计(Model- Driven Design)不再将分析模型和程序设计分离开,而是寻找一种同时满足两方面需求的单一模型。

软件系统的各个部分设计应该忠实地反映领域模型,以明确二者的对应关系。同时也要反复检查和修改模型,以便软件可以更加自然地实现模型。模型不光要满足这两方面的需求,还应该能支持通用语言(UBIQUITOUS LANGUAGE)。

软件开发是一个不断精化模型、设计和代码过程。

为什么模型对用户至关重要?

理论上我们可以展示给用户任意一种系统视图,而不管底层如何实现。但实际上系统上下结构的不匹配轻则导致误解,重则产生bug。

以IE浏览器收藏夹功能为例,IE浏览器用户会认为收藏夹是存储网站名称的列表,网站名称在不同的会话中是保持不变的。但是系统实现却将收藏夹中的书签当作一个包含URL的文件,并将文件名称存储在收藏夹列表中。这样做的问题是,如果网页标题含有Windows系统文件名不能接受的非法字符,就会出 现错误。假如用户想要收藏某页面并将其命名为:“Laziness: The Secret to Happiness”(懒惰:幸 福的秘密),就会弹出一个错误信息:“文件名不能包含下列任何字符:\ / : * ? " < > |。用户会奇怪文件名是指什么。另一方面,如果网页标题已经包含非法字符,IE浏览器则会悄悄地把字符删 除。这种数据丢失在这种情况下也许危害不大,但绝不是用户所期望的。在大多数应用中,程序悄悄地修改数据是不能接受的。

如果网站收藏夹实际上只是快捷方式文件的集合,那么应该将这一事实告诉用户,还应该删除之前那个起 误导作用的模型。这样不但能使收藏夹的功能更加清晰,用户还可以利用自己所知道的文件系统的知识来对网站收藏夹进行操作。比如,用户可以用资源管理器来重新组织已收藏的文件,而不 是用浏览器内臵的拙劣工具。而电脑高手还能够灵活地在文件系统的任何位臵存储网页快捷方式。仅仅通过删除起误导作用的多余模型就可以让应用程序的功能更加强大且清晰。

模式:HANDS-ON MODELER

人们经常说技术水平较高的架构师负责设计,技术水平相对低的开发人员负责实现代码,这是错误的,因为软件开发就是设计。虽然团队内每个成员都有各自的职责,但是将分析、设计、建模、开发过度分离不利于领域驱动开发。

如果编写代码的人员认为自己没必要对模型负责,或者不知道如何让模型为应用程序服务, 那么这个模型就和程序没有任何关联。如果开发人员没有意识到改变代码就意味着改变模型,那 么他们对程序的重构不但不会增强模型的作用,反而还会削弱它的效果。同样,如果建模人员不 参与到程序实现的过程中,那么对程序实现的约束就没有切身的感受,即使有,也会很快忘记。 MODEL-DRIVEN DESIGN的两个基本要素(即模型要支持有效的实现并抽象出关键的领域知识)已 经失去了一个,最终模型将变得不再实用。最后一点,如果分工阻断了设计人员与开发人员之间 的协作,使他们无法转达实现MODEL-DRIVEN DESIGN的种种细节,那么经验丰富的设计人员则不 能将自己的知识和技术传递给开发人员。

HANDS-ON MODELER(亲身实践的建模者)并不意味着团队成员不能有自己的专业角色。任何参与建模的技术人员,不管在项目中的主要职责是什么,都必须花时间了解代码。任何负责修改代码的人员则必须学会用代码来表达模型。每一个开发人员都必须不同程度地参与模型 讨论并且与领域专家保持联系。参与不同工作的人都必须有意识地通过UBIQUITOUS LANGUAGE与接触代码的人及时交换关于模型的想法。

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

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

相关文章

Linux驱动开发(18):linux驱动并发与竞态

并发是指多个执行单元同时、并行执行&#xff0c;而并发的执行单元对共享资源(硬件资源和软件上的全局变量、静态变量等)的访问 则很容易导致竞态。对于多核系统&#xff0c;很容易理解&#xff0c;由于多个CPU同时执行&#xff0c;多个CPU同时读、写共享资源时很容易造成竞态。…

009:传统计算机视觉之边缘检测

本文为合集收录&#xff0c;欢迎查看合集/专栏链接进行全部合集的系统学习。 合集完整版请参考这里。 本节来看一个利用传统计算机视觉方法来实现图片边缘检测的方法。 什么是边缘检测&#xff1f; 边缘检测是通过一些算法来识别图像中物体之间或者物体与背景之间的边界&…

QML使用Popup实现弹出Message

方案一&#xff1a;popup import QtQuick 2.15 import QtQuick.Controls 2.15 import QtQuick.Layouts 1.15ApplicationWindow {visible: truewidth: 640height: 480title: qsTr("Top Message Popup Example")ColumnLayout {anchors.centerIn: parentspacing: 10Butt…

idea java.lang.OutOfMemoryError: GC overhead limit exceeded

Idea build项目直接报错 java: GC overhead limit exceeded java.lang.OutOfMemoryError: GC overhead limit exceeded 设置 编译器 原先heap size 设置的是 700M , 改成 2048M即可

boot-126网易邮件发送

【SpringBoot整合JavaMail发送邮件】 一 . Java Mail基本概念 1.SMTP Simple Mail Transfer Protocol:简单邮件传输协议&#xff0c;用于发送邮件的协议。 2.POP3 Post office Protocol 3:邮局通讯协议第三版&#xff0c;用于接收邮件的标准协议。 3.IMAP Internet Message Acc…

【ArcGISPro/GeoScenePro】检查多光谱影像的属性并优化其外观

数据 https://arcgis.com/sharing/rest/content/items/535efce0e3a04c8790ed7cc7ea96d02d/data 操作 其他数据 检查影像的属性 熟悉检查您正在使用的栅格属性非常重要。

音视频入门基础:MPEG2-PS专题(4)——FFmpeg源码中,判断某文件是否为PS文件的实现

一、引言 通过FFmpeg命令&#xff1a; ./ffmpeg -i XXX.ps 可以判断出某个文件是否为PS文件&#xff1a; 所以FFmpeg是怎样判断出某个文件是否为PS文件呢&#xff1f;它内部其实是通过mpegps_probe函数来判断的。从《FFmpeg源码&#xff1a;av_probe_input_format3函数和AVI…

[Python学习日记-74] 面向对象实战2——选课系统

[Python学习日记-74] 面向对象实战2——选课系统 简介 开发要求 实现&#xff1a;选课系统 简介 在前面的《年会答题系统》当中我们介绍了面向对象软件开发的一些流程&#xff0c;当然这一流程只是涵括了大部分的&#xff0c;目前在业界也没有一个统一的标准&#xff0c;每个…

用户注册模块(芒果头条项目进度4)

1 创建⽤户模块⼦应⽤ 1.1 在项⽬包⽬录下 创建apps的python包。 1.2 在apps包下 创建应⽤userapp $ cd 项⽬包⽬录/apps $ python ../../manage.py startapp userapp 1.3 配置导包路径 默认情况下导包路径指向项⽬根⽬录 # 通过下⾯语句可以打印当前导包路径 print(sys.pa…

Elasticsearch:利用 AutoOps 检测长时间运行的搜索查询

作者&#xff1a;来自 Elastic Valentin Crettaz 了解 AutoOps 如何帮助你调查困扰集群的长期搜索查询以提高搜索性能。 AutoOps 于 11 月初在 Elastic Cloud Hosted 上发布&#xff0c;它通过性能建议、资源利用率和成本洞察、实时问题检测和解决路径显著简化了集群管理。 Au…

关于Flutter应用国际化语言的设置

目录 1. Locale配置 2. 用户切换/启动自动加载缓存里面的locale 由于最近在开发app国际化设置的时候遇到一些问题&#xff0c;所以做出一些总结。 1. Locale配置 具体的初始化配置可以参考文档&#xff1a;i18n | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 值得…

基层医联体医院患者历史检验检查数据的快速Python编程分析

​​​​​​​ 一、引言 1.1 研究背景与意义 在当今数字化医疗时代,医疗数据呈爆炸式增长,涵盖患者的基本信息、病史、检验检查结果、治疗方案等各个维度。这些海量且复杂的数据蕴含着巨大价值,为精准医疗决策提供了关键依据。通过对患者历史检验检查数据的深入对比分析…

如何使用OpenCV进行抓图-多线程

前言 需求&#xff1a; 1、如何使用OpenCV捕抓Windows电脑上USB摄像头的流、 2、采用多线程 3、获知当前摄像头的帧率。 这个需求&#xff0c;之前就有做了&#xff0c;但是由于出现了一个问题&#xff0c;人家摄像头的帧率目前都可以达到60帧/s 了&#xff0c;而我的程序…

数势科技:解锁数据分析 Agent 的智能密码(14/30)

一、数势科技引领数据分析变革 在当今数字化浪潮中&#xff0c;数据已然成为企业的核心资产&#xff0c;而数据分析则是挖掘这一资产价值的关键钥匙。数势科技&#xff0c;作为数据智能领域的领军者&#xff0c;以其前沿的技术与创新的产品&#xff0c;为企业开启了高效数据分析…

C++11编译器优化以及引用折叠

1.左值与右值的意义 1.左值引用和右值引用最终目的是减少拷贝&#xff0c;提高效率 2.左值引用还可以修改参数/返回值 左值引用不足&#xff1a; 部分函数放回场景&#xff0c;只能传值返回&#xff0c;不能引用左值返回 当前函数局部对象&#xff0c;出了当前函数作用域生…

小程序学习06——uniapp组件常规引入和easycom引入语法

目录 一 组件注册 1.1 组件全局注册 1.2 组件全局引入 1.3 组件局部引入 页面引入组件方式 1.3.1 传统vue规范&#xff1a; 1.3.2 通过uni-app的easycom 二 组件的类型 2.1 基础组件列表 一 组件注册 1.1 组件全局注册 &#xff08;a&#xff09;新建compoents文件…

【时时三省】(C语言基础)常见的动态内存错误2

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 对非动态开辟空间内存使用free释放 示例&#xff1a; 这个arr数组是在栈上的 *p指向的就是arr 对非动态空间也用了free ferr只能在动态开辟空间使用 使用free释放一块动态开辟空间的一部分…

3D高斯点云CUDA版本数据制作与demo运行

0. 简介 关于UCloud(优刻得)旗下的compshare算力共享平台 UCloud(优刻得)是中国知名的中立云计算服务商&#xff0c;科创板上市&#xff0c;中国云计算第一股。 Compshare GPU算力平台隶属于UCloud&#xff0c;专注于提供高性价4090算力资源&#xff0c;配备独立IP&#xff0c;…

【游戏设计原理】46 - 魔杖

幻想&#xff0c;人们可以通过多种形式来引发&#xff0c;比如文字&#xff0c;图片&#xff0c;绘画&#xff0c;语言等&#xff0c;但游戏与以上这些形式的区别&#xff0c;正如游戏与其他艺术形式的区别一样&#xff0c;游戏作为一种艺术和娱乐形式&#xff0c;其独特之处在…

基于Java的敬老院管理系统的设计和实现【源码+文档+部署讲解】

基于Java的敬老院管理系统设计和实现 摘 要 新世纪以来,互联网与计算机技术的快速发展,我国也迈进网络化、集成化的信息大数据时代。对于大众而言,单机应用早已成为过去&#xff0c;传统模式早已满足不了当下办公生活等多种领域的需求,在一台电脑上不联网的软件少之又少&#x…