在我工作的这些年里,前几年做的大多项目都是数据库驱动型的,我想很多人也都是这样的。对于数据库驱动型的项目,我们的核心都是围绕数据库在做开发,通常我们都在写CRUD的代码,后来有了代码生成器、ORM,我们的工作是变的更少了。但是大家有没有觉得,虽然自己一直在使用面向对象的语言在做开发,但是通常我们使用面向对象进行设计的能力并没有多少的提升。最近几年我脱离了做以数据库驱动为主的项目,来到了一个陌生的领域,刚开始的路很难,因为你要从需求抽象出系统的业务模型,而业务模型设计的对错将直接影响到系统的稳定性,可扩展性等等,这才是我觉得 软件设计师 的工作。

后来我遇到项目,我大体会用业务对象进行建模,而业务对象的计算所使用的数据,则根据业务对象的特点进行获取或保存。这使我豁然开朗,在这些的设计过程中,开始理解设计模式的好处,开始以全局观的角度去看待系统。你的视角提高了,那么对于系统使用什么样的数据库,使用什么样的消息队列,使用什么样的缓存的这些问题,你会觉得其实这些问题只是为了能够充分发挥业务对象的能力,其核心还在于业务对象上。对于计算强度大的业务对象,可以为其设计多线程的,多进程的,亦或是分布式的。一切的一切都以业务为核心,把业务对象为系统内的一等公民,我觉得这才是基于面向对象的设计与实现。

再回过头来看数据库驱动型的项目,也可以使用基于业务模型驱动的设计进行重构。通常我们做基于DB的项目,通常是先建立了DB,再通过代码生成工具生成代码。对于ORM(对象关系映射),也只是解决了你不用以结构化查询的角度去构造SQL语句,再对返回的结构化数据进行转义成对象的工作。这有存在一个很大的问题就是DB的设计与真实系统的业务对象往往有时候很难融合。在这种情况下,我们的业务对象在设计的时候,不得不照顾DB上的设计。否则业务对象的数据保存将是一个很大的问题(至少不会那么顺手)。其实我觉得正确的做法应该是:先分析系统的核心业务模型,在业务模型确定的情况下,在确定什么样的业务对象的数据需要持久化。在这个基础上为业务对象的数据持久化再设计如何保存数据。当然了数据库也有数据库的好处,对于数据量大的查询和历史数据的保存使用DB还是不二的选择。

在最近的一次项目中,由于项目的负责人偏硬件,对软件了解的比较少。在需求文档还未成型的时间,就让我先设计系统的数据库结构,这使得我很苦恼。在不得已的情况下完成了工作,随着后面的业务模型的建立,我发现存在一些数据库对象我没法使用,我不得不为领域模型再一次的建立数据对象类,通过新的数据对象类通过一些契约的方式去调用基于数据库生成的数据对象类来完成读取和保存工作。当然了,你会问我,为何不重构数据库结构。问题是,项目里负责UI的工程师的习惯还是比较倾向与以DB为驱动的,所以......。像这样的问题我估计会是很多数,很多人还是习惯以数据库驱动的方法去完成工作。

设计步骤

1 接到需求后,先通过和熟悉当前领域的工程师进行确认系统中的领域模型;

2 对领域模型进行建模,之间也需要和领域工程师进行多次的确认,以获得一个双方都认可的领域模型;

3 根据领域模型,设计出系统的业务模型(类);

4 实现业务模型和测试;

对于业务模型的数据保存问题,可根据不同的业务模型性质和系统需求进行不同的持久化保存;

通常的保存有:

A 内存

B 文件(平面文件、结构化文件、关系数据库、非关系数据库、队列 等)

通常业务模型是整个系统中的核心。通常客户的需求会改变,所以我们的UI在使用业务模型的时候,都需要基于业务模型的接口进行编程。通常我会使用简单类工厂或IOC 容器去处理对象的创建以及对象间的依赖关系;而对于系统中的其它方面,比如:日志,权限等,我会通过AOP的方式注入业务模型中,这样使得我们的工程师将核心精力放到业务模型的实现上。

在以业务模型为第一公民的设计理念上,所有的其它操作都要围绕业务模型,比如对于业务模型的数据保存上,我们持久化的方式就有很多的选择,可以根据业务模型的数据特点,选择不同的数据保存方式。对于简单的非系统全局化的业务对象,它的数据可以保存以平面文件或结构化文件的方式进行保存。而对于系统全局化的业务对象,这些数据可以保存到数据库中。

简议使用业务模型驱动进行软件的设计相关推荐

  1. 锂盐锂矿主要标的简议

    锂盐锂矿今天走势太可惜了,本来是可以多股大涨甚至涨停的局面,又被机构资金和大盘按了下来. 当日走势 吉翔股份一度冲上7个点涨幅,盘中落到4-5个点涨幅区间,永兴材料一度冲上接近6个点的涨幅,盐湖股份也 ...

  2. 简信CRM:手机CRM软件哪个好?有什么优势?

    简信CRM:手机CRM软件哪个好?有什么优势? 移动互联网的发展推动了移动CRM的发展.手机CRM是对传统CRM系统以及传统企业管理模式的一种变革,是一种通过手机智能终端推动企业移动化用户管理的模式, ...

  3. C#面向对象类的简议

    C#面向对象类的简议 类 就.net平台而言,最基本的编程结构就是类类型. 类是由字段数据(通常叫成员或者变量)和操作这些数据的成员(函数.属性.事件.方法)所构成的自定义类型. 字段数据用来表示类的 ...

  4. 简信CRM-----客户关系管理软件

    简信CRM-----客户关系管理软件 简信crm为郑州简信软件科技有限公司旗下软件,是专业的增长型crm服务商.简信crm致力于企业流程化管理,支持在线.远程办公,快速有效提升ROI. 快速连接企业微 ...

  5. 一款极简的在线甘特图项目管理软件

    知竹 - 一款极简的在线甘特图项目管理软件 在线地址: https://www.yxsss.com/ 主要功能包括 添加任务.直观操作,所见即所得. 时间.进度图形化清清楚楚,最细时间单位可以到小时, ...

  6. UML之父:架构业务需求与软件开发的桥梁

    UML之父:架构业务需求与软件开发的桥梁 时间:2011-08-27 11:28来源:Internet 作者:Internet 点击: 163次 在计算机领域,他闻名于世的不止是天文学家的称号,还有数 ...

  7. 转大佬--C++语言Qt实现控件拖拽和连线类似可视化操作Simulink仿真类软件 电路仿真软件 和模型驱动等软件

    转自–标biao的文章:https://blog.csdn.net/kangkanglhb88008/article/details/120812524 目标:开发一个电路仿真软件. 内部原理:qt编 ...

  8. 走近酷点KoolPoint,让我们深度挖掘网管软件的设计细节

    企业需要哪些管理功能   "企业需要哪些管理功能"这是中小企业的网管最应该注意的问题.网管软件都是价格不菲的,所以在为企业选择网管软件时一定要考虑到目前与未来企业网络环境发展的需要 ...

  9. 软件测试用例设计实用经验之谈

    概述 软件测试用例设计最重要的前提是掌握业务知识,加上一定的测试用例设计方法,软件测试的工作实际就非常简单了,多测试几个实际项目技能就自然提高了. 我把软件测试用例设计分成4个部分: ·测试类型 ·设 ...

最新文章

  1. PCL:自定义创建带颜色的点云保存后rgb是一个很大的数,由x y z rgb解包为x y z r g b
  2. 在CentOS 6.9 x86_64的nginx 1.12.2上开启echo-nginx-module模块实录
  3. 限制php输出图像的固定,限制要显示的图像数php
  4. golang 不定参 可变参 使用 传递
  5. 955. 删列造序 II
  6. Python_多进程编程
  7. QT使用插件开发界面
  8. Android页面跳转、延时跳转、跳转传值
  9. python中局部变量使用
  10. Linux内核学习笔记一
  11. 树莓派——使用SDK定期备份本地文件到OSS(自用)
  12. Win11设置人离开后电脑自动锁屏教程
  13. 箭头函数与this指向详解
  14. jetson nano poe_IEEE 802.3bt工业级大功率POE供电专题
  15. 中文分词与关键词提取概述
  16. 搭建私人网盘(可离线下载、在线播放)
  17. MuMu模拟器 安装电脑本地apk
  18. 2023年湖北取得中级工程师职称多久后可以评高级?
  19. 前端生成二维码 微信小程序
  20. 大家给推荐个4k显示器吧,码农,不玩游戏,护眼第一。

热门文章

  1. (PHP7内核剖析-3) 变量
  2. 数据中心冷冻站模块化建设模式探讨
  3. 微信小程序把玩(二十八)image组件
  4. 基础环境搭建--原始mavenWeb项目
  5. 递归下降分析法--算数语法分析
  6. Zend Studio 10代码格式化设置
  7. sql查询远程数据库的表的数据并填充到本地数据库的表
  8. ewebeditor 上传大内容文本注意点
  9. 2008秋季-计算机软件基础-有序表合并 教材 P79, ex3
  10. 为virtualbox配置网络环境