很多做软件开发同学的幻想都是成为一名架构师,而架构师的外围工作就是做好软件设计。软件设计是软件开发过程中的一个重要环节,那么如何进行软件设计,其输入规范又是什么呢?软件设计过程中,如何和各个相干方沟通,使软件设计能同时满足用户的性能需要和非性能需要,并升高公司的开发成本?
后期思考
很多软件开发同学的职业规划都是架构师,试想这样一个场景,如果公司安顿你做架构师,让你在我的项目开发后期进行了一些架构设计。
- 你该如何发展你的工作?
- 应该如何说出你的工作成绩?
- 你如何确定你的设计是否满足用户需要的?
- 你是否有把握最初交付的软件是满足要求的?
- 是否有把握让软件团队每个工程师清晰理解本人的职责范畴,并无效的实现开发工作?
架构师的外围工作就是做好软件架构设计,软件设计是软件开发过程中一个重要的环节。
- 如何进行软件设计?
- 软件设计的输入是什么?
- 软件降级过程中如何和各个相干方沟通?
- 软件设计如何既能满足用户的性能需要,又能满足用户的非性能需要,也能满足用户的老本要求?
- 如何可能使开发工程师,测试工程师,运维工程师,了解软件的整体架构,次要模块划分,关键技术实现,外围畛域模型,使他们可能做好本人的工作,从而使整个软件开发过程,处于一个可控的范畴之内,并在软件开发之初,就对软件将来的蓝图有个清晰的意识?
以上这些诉求能够说是软件开发治理与技术的外围诉求,这些问题搞定了,软件的开发过程和后果也就失去了保障。
外围关键点
两个客观存在
咱们再来看看,解决这些问题你须要了解的外围关键点,也就是说到底如何做软件设计,解决办法就是 软件建模 ,就是软件的形象模型,这些模型之上配上 文字说明,就造成了软件的设计文档。
模型是对客观存在的形象,在软件开发中有两个客观存在:
一个是咱们要解决的 畛域问题,比方咱们要开发一个电子商务网站,那么主观的畛域问题就是如何做生意,卖家如何治理商品,治理订单服务用户,买家如何筛选商品,如何下单,如何领取等等,对于这些主观畛域问题的形象就是各种性能及其关系,各种模型对象及其关系,各种业务解决流程。
另一个客观存在就是最终开发进去的 软件系统,这个软件系统也是客观存在的。
- 软件有哪些次要组成?
- 这些类如何组织成一个一个的组件?
- 这些内核组件之间的依赖关系是如何的?
- 运行期如何调用,须要部署多少台服务器?
- 服务器之间如何通信?
所以这两方面的客观存在的形象就是咱们的软件模型。
一方面,咱们要对畛域问题和软件系统 进行剖析,设计形象,另一方面,咱们依据形象进去的模型,进行软件开发,这就是软件开发的次要过程。
而对畛域问题和软件系统进行剖析,设计形象,这个过程咱们称它为 软件建模与设计。
UML 工具
软件建模工具很多,目前次要是对立建模语言 UML。
所谓的建模,就是对畛域问题和软件系统进行形象设计,一个工具实现前述软件开发过程中的两个客观存在的建模。
而所谓的语言,一则用于 沟通 ,满足设计阶段和各个相干方沟通的目标,一则用于 思考,即便软件开发过程中不须要跟其他人沟通,或者还没有到了沟通的时候,仍然能够应用 UML 建模,帮忙本人进行设计思考。
此外,语言还有个特点,就是有方言,就我察看不同公司,不同团队,都有本人的特点,并不需要拘泥于以往那样标准和语法,只有不引起歧义,在应用过程中对语法元素适当变通,这是 UML 的最佳实际。
软件建模与设计过程又能够拆分成需要剖析,概要设计,具体设计三个阶段,而软件建模的次要工具是 UML,上面咱们看一下应用办法蕴含了哪些软件模型,罕用的有 7 种。
7 种软件模型
上面咱们探讨这 7 种模型图,如何在三个阶段应用。
类图
类图是最常见的 UML 图形,用来形容类的个性和类之间的 动态关系 ,一个类蕴含三个局部,类的 名称,类的属性 列表,类的办法列表之间有 6 种动态关系关联,关联,依赖,聚合,组合,继承,泛化,而相干的一组类及其关系,用一张图画进去就是类图,类图次要是在具体设计阶段化,如果内图曾经设计进去了,那么开发工程师只须要依照内图实现代码就能够了,只有类的办法逻辑不是太简单,不同的工程是实现进去的代码简直是一样的,从而保障软件的标准对立。
实际中通常不须要把一个软件所有的类都画进去,把 外围 的有代表性的,有肯定技术难度的内画进去,个别就能够了,除了在 具体设计 阶段画类图,在 需要剖析 阶段,也能够将要害的畛域模型对象图,用例图画进去,这个阶段,关注的是畛域对象的辨认及其关系,所以通常用 简化 的类图来形容。
序列图
序列图形容类之间的关系,形容参与者本人的动静调用关系,每个参与者有一条垂直向下的 生命线,用虚线示意,而参与者之间的音讯,也从上到下示意其调用的前后程序关系。
每个生命线都有个后果,只有在参与者流动的时候才是 激活 的,序列图通常用于形容 对象之间的交互 ,这个对象能够是类对象,也能够是更大粒度的参与者,比方组件,比方服务器,比方子系统。总之,只有形容不同参与者之间的交互的,都能够应用序列图,也就是说,在软件设计的 各个阶段,都能够画序列图。
组件图
组件是更大粒度的设计元素,一个组件中通常蕴含多个类,组件图有时候和包的用处比拟靠近,组件能够形容逻辑上的组件,也能够形容物理上的组件,比方一个 JAR,一个 DLL 的,因而组件图更灵便一点,实际中,用组件图而不是包图进行模块设计更常见一些。
组件图形容两头之间的动态关系,次要是依赖关系,如果想要形容组件之间的动静调用关系,能够应用组件序列图,以组建作为参与者,形容组件之间的音讯调用关系,因为组件的力度比拟粗,通常用于形容设计软件的模块及其之间的关系,须要在设计晚期阶段就画进去。
部署图
他是形容软件系统的最终部署状况,须要部署多少台服务器?要害组件都部署在哪些服务器上?部署图出现的是零碎最终物理出现的蓝图。
- 依据部署图,所有相关者,客户,老板,工程师,都可能清晰的理解到最终运行的零碎,物理上是什么样子?和现有零碎服务器的关系,和第三方服务器的关系。
- 依据部署图,还能够估算出服务器和第三方软件的洽购老本。
因而,部署图是整个软件设计模型中比拟宏观的一张图,在 设计晚期 就须要画的一张模型图。依据部署,各方能够探讨是否对这个计划认可,只有对部署图达成共识,才可能持续前面的细节设计,部署图次要用在 概要设计 阶段。
用例图
次要在需要分析阶段,通过反映用户和软件系统之间的交互,形容软件的性能需要,图中大人物被称为 角色 ,角色能够是人,也能够是其余的零碎,零碎的性能可能会很简单,所以一个用例图,可能只蕴含其中一小部分性能,这些性能被一个巨型框框起来,这个巨型框被称为使劲的边界,框里的椭圆,示意一个一个的性能,性能之间能够调用依赖,也能够进行性能扩大,因为用例图中性能形容比较简单,通常还须要对用例图配以 文字说明,造成需要文档。
状态图
用来展现单个对象生命周期的状态变更,业务零碎中,很多重要的畛域对象对于比较复杂的状态变迁,比方账号,有守业状态,激活状态,解冻状态,欠费状态等等各种状态,因而,用户订单商品红包这些常见的畛域模型,都有多种状态,这些状态的变迁形容,能够在用例图中用文字描述,随着角色的各种操作而扭转,然而这种形容形式,状态散落在各处,做开发的时候容易搞错,就是产品经理本人在设计的时候,也容易搞错对象的状态变迁,状态图能够很好的解决这一问题。
一张状态图形容一个对象 生命周期的各种状态及其变迁 的关系。
流动图
次要用来形容过程逻辑,业务流程。UML 中没有流程图,很多时候人们用流动图代替流程图,流动图和晚期流程图的图形元素也很靠近.
实心圆代表流程开始,空心圆代表流程完结,圆角矩形示意流动,菱形示意分支判断,此外,引入了一个重要的概念,泳道。能够依据流动的范畴,将流动依据畛域,零碎角色的,划分到不同的泳道中,使流程边界更加清晰明了。
总结
模型图自身并不简单,几分钟的工夫就能够学习一个模型图的画法。难的是如何在适合的场合下用正确的 UML 模型,表白本人的设计用意,从而造成一套残缺的软件模型,进而组织起一个言之有物,层次分明,能够领导开发,在团队外部达成共识的设计文档。
咱们从软件设计的不同阶段这一维度从新梳理一下,如何应用正确的模型进行软件建模。
需要剖析
在需要分析阶段,次要是通过用例图形容零碎的性能与应用场景;对于要害的业务流程,能够通过流动图形容。如果在需要阶段,就提出要和现有的某些子系统整合,能够通过时序图,形容新零碎和原来的子系统的调用关系。
外围畛域对象,能够通过简化的类图进行模型畛域形象,并形容外围畛域对象之间的关系。
如果某些对象外部有简单的状态变动,比方用户,订单这些,能够用状态图进行形容。
概要设计
在概要设计阶段,通过部署图,形容零碎最终的物理蓝图,通过组件图以及组件时序图,设计软件次要模块及其关系,还能够通过组建流动图,形容组件之间的流程逻辑。
具体设计
在具体设计阶段,次要输入的就是类图和类的时序图,直到最终的代码开发,如果某个类办法外部,有比较复杂的逻辑,那么能够画办法的流动图进行形容,UML 的工具能够是很简单的,免费的,比方 EA 这样的大型软件工具。也能够应用 processon 在线的收费的工具。对于个别的开发者,倡议从简略的用起,因为那个建模能够很简单,也能够很简略,简略把握类图,时序图,组件图,部署图,用例图,状态图,流动图。在 7 种模型图,灵便的在需要剖析,概要设计具体设计阶段,依据场景的不同,绘制对应的模型图,能够实实在在的做好软件建模,搞好零碎设计,作为一个掌控场面,引领技术团队的架构师。
起源:https://www.cnblogs.com/jacky…
欢送关注公众号【码农开花】一起学习成长
我会始终分享 Java 干货,也会分享收费的学习材料课程和面试宝典
回复:【计算机】【设计模式】【面试】有惊喜哦