热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

开发技巧:模型驱动软件开发实战步骤

开发技巧:模型驱动软件开发实战步骤--Linux通用技术-Linux编程与内核信息,下面是详情阅读。
  有人说:今年是AJAX年,AJAX作为软件系统表现层实现技术,怎么能和改变软件开发方式的模型驱动开发模式相比呢?DSM、Together 2006等都在2006不断亮相,因此,说2006年是领域模型年一点也不过分,因为这是一个软件新旧时代的开始之年,数据库时代已经过去。领域模型时代已经来临!

  过去,当我们面对一个新的业务需求时,我们总是从先建立数据表结构开始,这种面向数据表的分析设计方法已经逐步被面向模型的分析设计方法替代。

  使用数据表分析需求,无法涵括项目的全部需求设计,例如系统的状态无法统一设计,最终导致每个程序员都可以直接操控系统的状态,导致整个系统状态运行混乱;使用数据表分析,还非常容易将实体表和关系混合在一起,造成分析者视觉混乱,无法正确分析出系统的真正基本实体;使用数据表分析还会导致软件系统以数据库为中心的编码架构,进而产生传统过程化编程风格,难于维护和拓展,甚至性能低下,将系统负载都集中在数据库服务器端,走上传统的大型机集中式计算模式,而不是分布式计算模式;使用数据表分析还会丧失多层结构引以为豪的中间层,回复到过去的两层结构,更谈不上设计模式应用了。

  领域建模提倡的面向模型的分析设计方法,系统一开始我们就首先确立领域模型Domain Model,以及它们之间的关系,进而可以交由程序员分别实现表现层、业务服务层和持久层,通过使用Jdon Framework(以下简称JF)等模型驱动框架,结合FDD等模型驱动的工程方法,从而正确无误地、且快速高质量地完成一个软件开发过程。

  下面我们从分析、设计和开发几个环节说明一下时下流行的最新软件开发模式:

MDA步骤

Models 建模

Abstraction 抽象细化。落实细节。

Platform 平台架构选择,J2EE还是.NET,J2EE中选择如何架构,下面案例我们是选择Struts+JdonFramework+Hibernate架构平台,所以,目前JF属于整个模型驱动开发环节中Platform部分。

Model transformation 模型传递,将模型设计传递为java的类代码。

The MDA value proposition

  DSM(Domain-Specific Modeling)是在上述MDA基础上,加强平台定义映射和模型映射灵活性和自住性,不象MDA工具,一出厂这个工具就确定死了平台和技术细节。

  MDA工具和DSM将模型驱动软件开发过程自动化,但是实际中,更多人工手工介入,下面展示这个过程。

论坛系统的模型驱动开发

  首先,我们使用UML用例图来完整清晰地表达一下一个新系统的需求,从而才能够保证正确地建模。

  比如一个论坛的简单需求如下:






  从这个需求中,我们需要发现那些有一定内容的实体对象,Actor1表示用户角色,用例图可以说用来表示“什么人做什么事情”,我们只要把“事情”抽象出来,作为实体对象,可能就是我们的领域模型(Domain Model),上图中发言用例实际可理解为用户发表言论,按照“什么人做什么事情”分析方法,实际是“用户”(什么人) + “发表”(做) + “言论”(事情),我们可以总结这里的“事情“是”言论“,”言论“作为实体对象,也就是Message(消息 帖子)。

  "发言"实际就是模型Message的创建,有创建必有修改,增删改查CRUD功能必会有。

  “回复”实际也是Message对象的创建,只不过有父子关系罢了。使用同样的方法可以从“浏览论坛”中分析出 Forum(论坛)这个领域对象。

  Forum和Message之间类关系应该是1:N的关联,我们使用如下类图表达我们的模型:






  Forum和Message提取过程是建模Modeling过程,有了模型类图;通过Abstraction细化过程,有了模型初始化以及细化。

  通过Model transformation 过程,有了的模型类的java代码:

package sample.forum.model

public class Forum{

  private String forumId;

  private String name;

  private Collection messages; //表示和Message的1:N关系(one-to-many)

  .....

}



package sample.forum.model

public class Message{

  private String messageId;

  private String name;

  private Forum forum; //表示和Forum的N:1关系(many-to-one)

  .....

}



  有了这两个模型类,围绕模型的业务服务接口也便诞生,如围绕Forum的ForumService和围绕Message的MessageService:

package sample.forum.service

public interface ForumService{

  void createForum(EventModel em);
  void updateForum(EventModel em);
  void deleteForum(EventModel em);

  Forum getForum(String forumId);

  .....

}




  自此,我们有了领域模型类和业务服务类,使用过JF的人就会发现,Jdon框架也正是需要这两种类的确立,下面就可以使用JF快速完成Forum和Message的增删改查以及批量查询两个基本功能了,见Step By Step 开发JdonFramework应用主要步骤。

仓库系统的模型驱动开发

  下面再以ERP中仓库管理系统开发为例简要说明模型驱动开发过程,仓库简单用例如下:






  我们再以“什么人做什么事情”来分析仓库的用例功能,“成品入库”如何分解为“什么人做什么事情”?我们可以这样理解:仓库员(什么人)+ 录入(做) + 库单(什么事情),这样,我们提炼出实体对象“库单”;进而从“商品资料维护”功能可以提炼出“商品”模型。

  “成品入库”实际是“库单”的新增,必然有“库单”的增删改查CRUD功能需求。

  我们建立两个模型的类图如下:






  有了类图,通过模型细化和落实,我们可以有Product等三个模型代码类,进而围绕这三个模型的业务Service接口也会产生,通过使用JF的CRUD和批量查询,我们可以快速完成仓库系统的基本功能。见Step By Step 开发JdonFramework应用主要步骤。

总结

  以上通过两个简单案例说明领域模型的简单提炼过程,当然实际项目中,远没有如此简单,而且也不只是模型的CRUD功能,但是我们可以通过四色图分析方法来抓住复杂系统中的模型和业务服务功能,一般四色图的MI是使用业务服务Service实现;Description是一个域模型。

  JiveJdon3.0是按照模型驱动架构思路开发的一个复杂软件系统。






  如图所示:模型和业务服务是在一个系统架构之前建立的,所以没有面向模型的领域建模分析方法,就没有Domain Model,就没有模型对象,就没有中间业务层,没有中间层,就没有设计模式的使用空间。同时,没有模型对象,就没有表现层的边界对象(如Struts的ActionForm);也就没有模型对象的持久化(使用Hibernate等O/R Mapping工具),特别是在持久层使用Hibernate,最后搞个值对象VO作为数据表数据的存贮对象,很明显,对象屈从于数据表了,又在搞面向数据表的分析设计了,你这是在将汽车当自行车推了,这种对象屈从于数据表会造成如下图左边的乱糟糟结构,而右图则是因为强调了模型的统帅和领导地位,整个系统变得井井有条:





推荐阅读
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文详细介绍了云服务器API接口的概念和作用,以及如何使用API接口管理云上资源和开发应用程序。通过创建实例API、调整实例配置API、关闭实例API和退还实例API等功能,可以实现云服务器的创建、配置修改和销毁等操作。对于想要学习云服务器API接口的人来说,本文提供了详细的入门指南和使用方法。如果想进一步了解相关知识或阅读更多相关文章,请关注编程笔记行业资讯频道。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • 解决Sharepoint 2013运行状况分析出现的“一个或多个服务器未响应”问题的方法
    本文介绍了解决Sharepoint 2013运行状况分析中出现的“一个或多个服务器未响应”问题的方法。对于有高要求的客户来说,系统检测问题的存在是不可接受的。文章详细描述了解决该问题的步骤,包括删除服务器、处理分布式缓存留下的记录以及使用代码等方法。同时还提供了相关关键词和错误提示信息,以帮助读者更好地理解和解决该问题。 ... [详细]
  • 本文总结了初学者在使用dubbo设计架构过程中遇到的问题,并提供了相应的解决方法。问题包括传输字节流限制、分布式事务、序列化、多点部署、zk端口冲突、服务失败请求3次机制以及启动时检查。通过解决这些问题,初学者能够更好地理解和应用dubbo设计架构。 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
author-avatar
求学lx
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有