我的第一次UML学习和实践(上)

本文记录了作者学习和实践UML的过程,从需求分析到用例和类的设计,探讨了如何运用UML梳理思路并提高软件开发效率。通过实例展示了如何从场景中提取功能,建立场景/功能对照表,以及在不确定情况下如何处理活动图和顺序图。最后,作者分享了UML在项目中的实际应用,以及其带来的益处。
  很早之前就想学习一下UML了,几次拿起书本翻几页,太抽象,没情趣,不好理解,看几页就放下、看几页就放下,缺乏恒心、毅力,然后工作忙,自己给自己找台阶。所以一直没实现。

  前年底换了工作岗位,没那么忙了,寻思着把以前零零碎碎编的一些程序整合在一起,于是决定借此机会把UML也结合起来,学、练、用三结合。
  先是上网搜索、收集学习资料,这都是习惯性动作了。以前买的书还是UML 1.x,现在2.x了,又网购了一本。手头上有一套PowerDesigner,搞数据库设计时留下的,这次也升级到15版。除了编码,整理需求、设计用例、类都在PowerDesigner里完成。
  PowerDesigner提供有各种模型的样板,正好拿来借鉴。虽然是自己给自己下任务,心里琢磨着还是要看看规范是个什么样子,于是装模作样从需求开始写起,Powerdesigner里新建一个自己的需求模型,总体目标、场景描述、功能需求、非功能需求、开发和使用环境等等,挨个写下去。
  下面是一些过程和体会。


一、 需求和场景
  一些网络达人说需求要写成小说、故事,要实景描述。比如买火车票,从张三决定春节回家开始讲起,去售票大厅询问车次、买票……下雨了,结果没等到公交、错过了火车。等等,一路写下去,就像纪实小说一样,细节、对话全部写出来。
  我比较支持这种写法。都知道需求是开发软件最关键环节,引领开发方向,出什么差错,后面弥补成本太高。但开发人员和用户之间对需求的理解、偏重又极可能存在很大差异,这我们也都体会过。开发人员把时间顺序、前提条件、约束关系看得很重,规范、标准、模式一套一套。用户却觉得很奇怪,这些事有那么重要吗,我从来没有在意过啊,临时调整一下也不是没有可能的,你到那一步我们再说嘛。
  其实这是双方工作经历、人生经验、思考问题角度差异造成,是必须直面、解决的现实,任何一方归罪于对方对自己、对需求、对现实的不理解都是对项目进展的危害,不会给软件开发提供任何有利促进。作为我们软件开发人员,既然去接人家的项目,对此更应有所心里准备,有责任比对方更充分预测各种潜在障碍和困难,准备更多应对预案。
  道理不难明白,但实际工作还是纠结、磕磕绊绊的多,怎么吧?
  把实景、实情、过程记录下来吧,需求从现实中提取。一般用户没有现成准备,开发人员进了场才开始归集,双方对需求都会不同程度存在疏忽、肤浅、迷茫、误解、失误,一旦出现分歧、或者发现新问题,最好的办法还是回到具体现实,这个不太容易存在异议。一切回到起点,从头开始梳理思路,抽丝剥茧、追本溯源,解决问题没有比从问题本身出发更好的办法了。
  当然,真的张三、李四、北京、上海、火车、飞机写成小说也有点教条主义了。有把握的情况下尽可采取提纲的形式,把场景、过程写出来,注意不要有遗漏,不要怕麻烦,不管有没有用,把了解到的情况都先写出来,这是共识、是双方合作的基石,关键是全面,精炼、条理是其次,筛选、归纳以后大有机会、而且肯定要不断做下去。
  我就是这样写需求。都是自己熟悉的工作,场景不容易遗漏,细节方面会有一时想不起来、想不到的,这也没关系,这种事肯定会发生,但大场景一定要对,这个决定方向。
  有些不局限于特定场景的需求可以、而且也应该单独罗列出来,强调一下。例如,所有运算结果都直接输出到Excel文件。
  至于哪些Excel文件需要制作图表、采用特殊排序方式,则写在场景里。

  需求撰写的第二步是从场景中提取功能,建立场景/功能对照表。注意这个时候的功能需求只要求与场景对应。功能方面会存在重叠、交叉、相似、派生,先不管它,不着急归纳、筛选,重点在罗列,在取得用户的认可。还没到优化的时候。

    
  再接下来是非功能需求,不由软件实现的功能。例如我这次不考虑数据采集,数据都是从不同系统里导出来的,不存在录入的问题。但要数据转换。不过一次性的特定工作,手工做完拉倒,没必要开发软件。
  这些都一一注明。

  最后说明使用环境、开发平台。
  这里多说几句。我这次开发软件的目的,是把以前作数据分析开发的软件整合在一起。数据是从别的系统导出来的,不需要考虑录入问题,但有近250万条记录,这么多记录不可能用Excel或文本文件管理,这样没效率。
  所以要建立自己的数据库。考虑过用MySQL或SQL Server,但最后还是选了Visual FoxPro。
  这有两个原因,一是基本上个人独立使用的软件,没必要牵扯一大堆网络设置。
  二是数据库管理、数据分析肯定要大量使用SQL,我的最终目的又是自动生成Excel或Word的报告。MySQL或SQL Server直接编程操纵Excel、制作图表没听说过,好像不太容易吧。其它编程工具,例如VC、VB,作为SQL调试平台又不太方便,一般都是另外调试好SQL嵌入编程里面。我这次SQL的量很大,大部分业务逻辑、计算都是SQL完成的,SQL嵌套、关联频率很高,调试工作量很大,编程的目的是过程控制和结果归集,计算量反倒不大。这样切换来切换去太麻烦,浪费时间。
  所以想来想去还是Visual FoxPro好,即支持交互SQL命令,又支持面向对象编程,反正速度要求不高,所以选了VFP 9.0。

  理论上需求还应该包括风险分析,但我一个人自己给自己安排的工作,除了时间,不需要金钱,完不成除了自责,也没人跟我计较,算了,省了不写了。
  当然,自责也是风险。呵呵。

  二、 用例和类
  需求写好了之后就定义与场景对应的用例,建立场景/用例对照表。
  从场景提取用户。建立场景/用户、用例/用户对照表。
  UML里用户是不受目标系统控制的一切外部因素,可以是一个真实的用户,也可以是一台触发系统动作的摄像机。
  我这个软件比较简单,没几个用户,很容易理解,用户对照表用处不大,所以又省略了。
  完了琢磨绘制活动图和顺序图。
  这时候又迷茫了一阵子,因为活动细节方面实际上是很灵活的,例如用户提交数据,是批量提交一次处理、还是分批提交、边提交边处理呢?这两种需求都可能存在,用户可能都需要,用户也不会太在意两者之间的区别,一开始很难确定哪种方案最合适。
  又例如,对象的切割,也就是说对象粒度、对象的外延,哪些功能封装在一起。这个问题也很麻烦,因为对象首先源自我们头脑中的某个概念,而随着认识的深入,这个概念很可能发生变化,分解、合并等等。
  所以一开始的时候画顺序图、活动图时很不确定,经常改来改去、推倒重来。
  不过这样折腾了几次之后也让我若有所悟,UML其实是个推荐标准,是草稿,是我们设计汽车轮船、高楼大厦之前的草稿。草稿是整理思路、获取对目标的充分理解,帮我们预计、设想宏观结构、微观构建,编码才是我们的最终产品,编码才是目的。UML其实是前人、高手总结归纳出的一个模式,帮助我们编码之前探求目标的本质、实现的路径。
  所以,既然是草稿,一旦获得对系统足够的理解就可以动手了,用不着面面俱到,把UML标准里所有的图、模型都画一遍,然后才开始编码,这样就本末倒置了,用不着把草稿当正本。
  所以画了一两个顺序图、活动图之后我就直接跳到了类图。因为这个时候对系统已经有了一些认识,头脑中有了些概念,及时把这些概念用文字、图形把沉淀下来,在顺序图、活动图体现,予以明确,予以验证,交叉、往复相互修正,比坐在那里苦思冥想这样好、还是那样好更有意义。
  
  场景是我们最开始的概念,用例是对场景的模拟,所以思维逻辑一开始很自然会把用例映射到对象。但场景都是具体的、有针对地。这与面向对象编成的思维刚好相反,面向对象编程总是从构建基类、抽象层开始,先定义抽象类、上层控制类,然后逐步向下层具体类、实现类扩展。
  所以我在写出用例,大致画了活动图、顺序图后,就把顺序调转了一下,由具体用例归纳、提炼,设计一般用例、一般过程、一般活动,然后映射到类。
  老实说UML我是初哥,我学习面向对象还是Turbo Pascal流行的时候,最近这10年主要精力都在数据库、SQL这方面。我不知道这样做符不符合软件工程规律,是不是最有效的工作方法,甚至不知道用什么专业术语去描述这个过程,我是跟着感觉走,按照最有把实现自己的目标方向走。
  由于我是把以前的一些工作整合,以前分散开发的软件已经是面向对象的了,有了思想基础,所以这个过程还比较顺利,对以前的类进行整合——提炼基类,分解——建立新类处理个性化问题。
  类之间的泛化、依赖关系作了比较严谨地推敲,关联、聚集、组合关系就没有仔细斟酌了,全部用了关联。对象图、部署图、构建图之类的也没有画了,一是这个课题还比较简单,二是改造老项目,心里已经有数。
  
  这样大概从头到尾两三个月,把这个项目搞了完。也确实体会到了UML的好处,最主要有两点,一是有效帮助自己梳理思路,二是用图形描述类之间关系,一目了然,类再多都不怕忘记,属性在基类和派生类之间转移也不怕搞乱。所以UML真的值得学习、实践,下一步要把其它没用到的潜质都挖掘出来。
  



内容概要:本文提出了一种基于非合作博弈理论的居民负荷分层调度模型,并结合双层鲸鱼优化算法(Two-level Whale Optimization Algorithm)进行高效求解,模型与算法均通过Matlab代码实现。研究针对电力系统中居民侧用电负荷的复杂调度问题,引入非合作博弈机制刻画各用户之间的利益竞争关系,实现负荷的分层优化分配;同时设计双层优化架构,上层优化资源配置,下层模拟用户自主决策行为,提升了模型的实用性与合理性。通过智能优化算法求解多层级、非凸非线性的博弈模型,有效提高了调度方案的收敛性与全局寻优能力,适用于现代智能电网中的需求侧管理与能源优化场景。; 适合人群:具备电力系统基础理论知识和Matlab编程能力,从事智能电网、能源优化调度、需求侧管理、博弈论应用等方向的科研人员、高校研究生及工程技术人员。; 使用场景及目标:①应用于居民区电力负荷的分层优化调度系统设计与仿真分析;②为非合作博弈在多主体能源系统建模中的应用提供方法论支持;③利用双层鲸鱼算法解决具有嵌套结构的复杂双层优化问题,提升求解效率与调度方案的可行性。; 阅读建议:建议读者结合提供的Matlab代码深入理解模型构建逻辑与算法实现流程,重点关注博弈模型的效用函数设计、纳什均衡求解思路以及双层优化结构的迭代机制,宜配合实际用电数据开展复现实验以验证模型有效性与鲁棒性。
内容概要:本文围绕基于自适应神经模糊推理系统(ANFIS)智能控制器的可再生能源微电网功率管理系统展开研究,结合Simulink仿真实现,深入探讨了微电网中功率的智能调控与经济机组组合调度问题。通过引入ANFIS控制器,有效应对风能、光伏等可再生能源出力的波动性与不确定性,提升系统运行的稳定性与电能质量。研究内容涵盖微电网多源协调控制策略、功率平衡管理、优化调度模型构建及仿真验证,实现了对分布式电源、储能系统和负荷的协同优化,兼顾经济性与可靠性目标,并通过仿真平台验证了所提方法的有效性与优越性。; 适合人群:具备电力系统、自动化或新能源相关专业背景,熟悉Matlab/Simulink仿真环境,从事微电网能量管理、智能控制、能源优化等领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于高比例可再生能源接入场景下的微电网能量管理系统研发与教学实践;②为实现微电网功率稳定控制与经济高效运行提供先进的智能控制解决方案;③支撑高水平学术论文复现、科研课题攻关及实际工程项目的仿真验证与方案优化。; 阅读建议:建议结合提供的Simulink模型与相关代码进行动手实践,重点关注ANFIS控制器的设计流程、规则库构建与参数调优方法,并通过与传统PID或MPC控制策略的对比实验,深入理解其在动态响应与鲁棒性方面的优势。同时可进一步拓展文中提出的优化调度逻辑,应用于多目标、多约束的复杂实际应用场景中。
内容概要:本文档聚焦于“直流电机双闭环控制Matlab仿真”,系统阐述了基于Matlab/Simulink平台实现直流电机双闭环控制系统(主要包括速度环与电流环)的设计与仿真全过程。通过构建直流电机的数学模型,结合PI控制器进行调控,实现对电机转速和电枢电流的高精度动态控制,验证控制策略的稳定性与响应性能。文档详细介绍了仿真模型的搭建流程、关键参数的整定方法、系统动态波形的分析手段以及仿真结果的有效性验证,体现了经典自动控制理论在实际电机系统中的工程应用,是电机控制与电力电子技术相结合的典型研究案例。; 适合人群:具备自动控制原理、电机与拖动基础、电力电子技术和Matlab/Simulink仿真能力的电气工程、自动化、机电一体化等专业的本科生、研究生及从事电机驱动系统研发的工程技术人员。; 使用场景及目标:①作为高校课程设计或实验教学材料,帮助学生深入理解双闭环调速系统的工作机理与工程实现;②服务于科研项目,为新型电机控制算法(如滑模、模糊PID等)的开发与性能对比提供基础仿真验证平台;③作为工业界产品前期设计的仿真工具,用于评估不同控制策略在动态响应、抗干扰能力和稳态精度方面的可行性。; 阅读建议:建议读者在学习过程中紧密结合自动控制理论知识,亲手在Simulink环境中搭建完整的双闭环仿真模型,通过反复调整PI控制器的比例与积分参数,观察并分析转速、电流的阶跃响应曲线,从而深刻理解反馈控制的本质、系统稳定性条件以及参数整定对动态性能的影响,进而掌握电机控制系统的设计精髓。
内容概要:本文研究了基于Benders分解与输电网运营商(TSO)和配电网运营商(DSO)协调机制的不确定环境下输配电网双层优化模型,旨在提升高比例可再生能源接入背景下电网系统的协调性与鲁棒性。模型上层以系统整体经济性为目标进行优化调度,下层采用Benders分解实现TSO与DSO之间的信息交互与协同决策,通过引入割平面迭代机制保障求解的收敛性与全局最优性。研究充分考虑新能源出力与负荷需求的不确定性,构建了具有强适应性的双层优化框架,并基于Matlab完成了模型的编程实现与仿真验证,有效解决了多主体、多层级、多不确定性因素耦合下的电力系统优化调度难题。; 适合人群:具备电力系统分析、运筹学与优化理论基础,熟悉Matlab编程环境,从事智能电网、能源互联网、分布式能源集成、电力市场等方向的研究生、科研人员及工程技术人员。; 使用场景及目标:①研究高渗透率可再生能源条件下输配电网协同优化调度策略;②掌握Benders分解在电力系统双层优化建模中的应用方法与实现技巧;③构建TSO-DSO多主体协调机制,实现跨层级电网资源的高效互动与决策解耦;④提升对不确定性建模、分解算法设计及大规模优化问题求解能力。; 阅读建议:建议读者结合Matlab代码逐模块剖析模型构建流程,重点理解Benders割的生成逻辑、主从问题的信息传递机制及收敛判据设定,推荐在标准IEEE测试系统上复现实验以深入掌握模型特性与算法性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值