《《软件工程教学课件》05-代码生成之道.pptx》由会员分享,可在线阅读,更多相关《《软件工程教学课件》05-代码生成之道.pptx(35页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、大连理工大学软件学院软件工程2023/2/12大连理工大学软件学院2第第5章章 代码生成之道代码生成之道考虑设计方案考虑设计方案向实际运行方式的转变过程,即由向实际运行方式的转变过程,即由概要设计产生出对应的概要设计产生出对应的程序代码程序代码框架的框架的过程。过程。工程化工程化的设计方法将导致的设计方法将导致程序代码具有更好的可程序代码具有更好的可实现性、更好的可维护性和可修改性以及更好的实现性、更好的可维护性和可修改性以及更好的可扩展性可扩展性。先对类图到可运行程序的基本转换过程进行概要先对类图到可运行程序的基本转换过程进行概要的说明,然后考虑对其优化和细化的过程。的说明,然后考虑对其优化
2、和细化的过程。CASE工具工具软件开发环境指软件开发环境指支持软件开发的工具及其集成机制,用以支持软件开发的工具及其集成机制,用以支持软件开发的过程、活动和任务,为软件的开发、维护支持软件开发的过程、活动和任务,为软件的开发、维护及管理提供统一的支持,也即计算机辅助软件工程及管理提供统一的支持,也即计算机辅助软件工程(CASE)。不同不同类型的项目其软件开发环境的构成是不一样的,在工类型的项目其软件开发环境的构成是不一样的,在工具选择上也会有较大的不同具选择上也会有较大的不同。工具的选择会工具的选择会对开发过程的选择产生一定的影响,因为不对开发过程的选择产生一定的影响,因为不同的工具组合对开发
3、过程的支持能力会有所不同同的工具组合对开发过程的支持能力会有所不同。同时涉。同时涉及到工具的集成问题。及到工具的集成问题。集成开发环境(集成开发环境(IDE)是软件开发环境中)是软件开发环境中的的一一种实现种实现方式方式。2023/2/12大连理工大学软件学院3“变更变更”的管理方式的管理方式需求分析需求分析、概要设计和详细设计阶段只进行一次、概要设计和详细设计阶段只进行一次或者迭代或者迭代-增量式的进行增量式的进行。每次修改只发生在代码,。每次修改只发生在代码,其它文档不做更新。其它文档不做更新。每个每个改动的意愿都改动的意愿都要经过要经过完整的分析、概要设计完整的分析、概要设计和详细设计流
4、程,所有必须的改动需要在所属的和详细设计流程,所有必须的改动需要在所属的文档以及代码中对应修改,并保证它们的一致性文档以及代码中对应修改,并保证它们的一致性。以上两种方式的选择需要根据项目需要进行确定,以上两种方式的选择需要根据项目需要进行确定,或者在两者之间折中。或者在两者之间折中。2023/2/12大连理工大学软件学院4逆向工程逆向工程逆向工程逆向工程的作用是将代码的修改反向映射回类图的作用是将代码的修改反向映射回类图的设计中,从而在设计与代码实现之间保证一致的设计中,从而在设计与代码实现之间保证一致性性。逆向工程逆向工程的一种特殊的情况是设计图纸完全由代的一种特殊的情况是设计图纸完全由代
5、码生成码生成。逆向工程使得所有的开发都可以在逆向工程使得所有的开发都可以在CASE工具中同工具中同时展开,并使得设计类图与实现之间的相互对应时展开,并使得设计类图与实现之间的相互对应。逆向工程需要设计和编码工具紧密集成和配合。逆向工程需要设计和编码工具紧密集成和配合。2023/2/12大连理工大学软件学院5单个类的代码实现单个类的代码实现一个类图一个类图如果如果要要成功成功翻译翻译成为代码的蓝图,类模型成为代码的蓝图,类模型中的内容必须要完整中的内容必须要完整。需。需要要包含的包含的信息:信息:每个每个实例变量,需要指定实例变量,需要指定其类型;其类型;每个每个方法中的参数和返回方法中的参数和
6、返回值,需要指定其类型;值,需要指定其类型;每个每个关联关系,其关联类关联关系,其关联类型、使用或导航方向必须型、使用或导航方向必须说明。说明。2023/2/12大连理工大学软件学院6类的信息与基本实现类的信息与基本实现带有下划线的方法带有下划线的方法和和属性属性表示表示静态方法和静态变静态方法和静态变量。量。静态静态变量的使用需要仔细斟酌,变量的使用需要仔细斟酌,因为破坏因为破坏了面向了面向对象的本地性(封装性)原则对象的本地性(封装性)原则。静态变量和静态方法通常用在一般性的常规工作,静态变量和静态方法通常用在一般性的常规工作,如如记录文件记录文件的存储路径的存储路径,常规,常规的数值计算
7、等(工的数值计算等(工具)具)功能。功能。方法参数的输入输出类型:方法参数的输入输出类型:in,out,inout。上上图中的类对应的图中的类对应的代码实现代码实现。2023/2/12大连理工大学软件学院7实现上的补充实现上的补充CASE工具能够自动进工具能够自动进行整个项目代码框架行整个项目代码框架的生成,具体业务的的生成,具体业务的代码一般需要人工补代码一般需要人工补充充。业务业务越复杂,代码能越复杂,代码能够自动生成的可能性够自动生成的可能性就越低,对于这部分就越低,对于这部分需求还需要工具的开需求还需要工具的开发者为此付出大量的发者为此付出大量的努力。努力。2023/2/12大连理工大
8、学软件学院8public Employee(String firstname,String lastname)this.firstname=firstname;this.lastname=lastname;this.empno=Employee.empcount+;Overridepublic String toString()return empno+:+firstname+lastname;关联关系的实现关联关系的实现通过关联的定义明通过关联的定义明确了类与类之间的确了类与类之间的静态关系,关联关静态关系,关联关系的实现最终体现系的实现最终体现为对应类中增加的为对应类中增加的实例变量(成员
9、变实例变量(成员变量)量)。变量变量存在的具体形存在的具体形式依赖于关联的具式依赖于关联的具体类型。体类型。2023/2/12大连理工大学软件学院9导航至导航至“可选可选”方向方向多重多重性性“0.1”明确明确了项目了项目任务可以任务可以不分配工作人员不分配工作人员,即,即在代码中在代码中对应对应类的实例变量可以不赋任何值,在类构造时类的实例变量可以不赋任何值,在类构造时也可不必对该变量初始化,也可不必对该变量初始化,在在具体编程语言具体编程语言中中通常通过通常通过一一个对空值(个对空值(NULL)的引用,不分配任何存储空间)的引用,不分配任何存储空间。实例实例变量并不需要在声明时赋值,可以变
10、量并不需要在声明时赋值,可以通过通过set方法在后期方法在后期需要的时候赋值需要的时候赋值。实例实例变量变量pincharge声明后可以一直为声明后可以一直为NULL值,但却不能值,但却不能通过任何的方法显式的对其赋予通过任何的方法显式的对其赋予NULL值,这是隐含的业值,这是隐含的业务规则。务规则。2023/2/12大连理工大学软件学院10对应代码对应代码导航至导航至“唯一唯一”方向方向描述一描述一个项目任务对象必须要有一位个项目任务对象必须要有一位工作人员对应,也工作人员对应,也就就不存在是否可以对该变量进行空值引用的问题不存在是否可以对该变量进行空值引用的问题。为为确保确保以上约定以上约
11、定,可以在该实例变量声明时同时赋予初始,可以在该实例变量声明时同时赋予初始值,可以按照如下的方式进行实现值,可以按照如下的方式进行实现:private Employee pincharge=new Employee();该该类的每个构造函数中类的每个构造函数中对实例对实例变量变量pincharge都需要指定一都需要指定一个有意义的值个有意义的值。这时可以。这时可以将实例变量声明时的初始化去掉。将实例变量声明时的初始化去掉。2023/2/12大连理工大学软件学院11导航至导航至“任意任意”方向方向描述一描述一个项目任务可以安排任意多个工作人员与个项目任务可以安排任意多个工作人员与之对应之对应。这
12、些这些工作人员也是通过实例变量工作人员也是通过实例变量pincharge进行管进行管理的,只是这时该变量的类型应为某种集合类型理的,只是这时该变量的类型应为某种集合类型(集合类型在(集合类型在C+中也叫中也叫Container)。2023/2/12大连理工大学软件学院12基本的集合类型基本的集合类型2023/2/12大连理工大学软件学院13元素顺序元素顺序要求要求元素唯一性元素唯一性要求要求集合类型集合类型不要求不要求无重复无重复unique集合类型集合类型Set,其中的每个元素最多只能,其中的每个元素最多只能出现一次出现一次unique,不要求元素的顺序性。,不要求元素的顺序性。不要求不要求
13、允许重复允许重复集合类型集合类型Bag或或Multiset,其中的元素可多,其中的元素可多次重复出现,不要求元素的顺序性。次重复出现,不要求元素的顺序性。要求要求ordered无重复无重复unique集合类型集合类型OrderedSet,所有元素具有顺序,所有元素具有顺序性性ordered,每个包含的元素最多只能出,每个包含的元素最多只能出现一次现一次unique,元素依据其所在位置进,元素依据其所在位置进行操作。行操作。要求要求ordered允许重复允许重复集合类型集合类型List或或Sequence,所有元素具有,所有元素具有顺序性顺序性ordered,每个元素允许重复,并,每个元素允许重
14、复,并依据其所处位置进行操作。依据其所处位置进行操作。使用使用List模板类的模型模板类的模型在在Java语言中语言中,可以使用集合,可以使用集合List接口类型对应允许元素接口类型对应允许元素重复的集合类型,并使用重复的集合类型,并使用ArrayList进行实现进行实现。在选用具体的集合类型在选用具体的集合类型时要仔细考虑时要仔细考虑,是否在运行时间和,是否在运行时间和存储空间存储空间上能够上能够真正满足要求并进行了最佳的实现真正满足要求并进行了最佳的实现。比如比如List允许允许元素重复元素重复出现,出现,如果这不是希望的,则应该如果这不是希望的,则应该在元素加入前进行在元素加入前进行目标
15、元素是否已经存在的检查。目标元素是否已经存在的检查。2023/2/12大连理工大学软件学院14对应代码对应代码对象对象间归属间归属聚合聚合Aggregation描述一描述一个员工对象不是仅仅与一个项目任务对应个员工对象不是仅仅与一个项目任务对应,而是可以而是可以同时参与到多个项目任务,即在这些项同时参与到多个项目任务,即在这些项目间共享。目间共享。2023/2/12大连理工大学软件学院15对应代码对应代码关联关联的问题的问题关联关系(包括聚合)的代码在关联关系(包括聚合)的代码在一定程度上破坏一定程度上破坏了实例了实例变量的封装性变量的封装性。比如比如某个获得某个获得Employee对象引用的
16、类就可以直接对象引用的类就可以直接调用调用Employee的所有公共方法,从而可以直接对的所有公共方法,从而可以直接对ProjectTask的实例变量进行修改的实例变量进行修改。2023/2/12大连理工大学软件学院16使用接口的设计使用接口的设计接口中只含有接口中只含有ProjectTask需要需要的方法,屏蔽的方法,屏蔽Employee中其它中其它方法。方法。但通过但通过强制类型强制类型转换(转换(Cast)也)也可以从可以从该接口转该接口转化为类型为化为类型为Employee的的对象。对象。2023/2/12大连理工大学软件学院17“棒棒糖棒棒糖”另一另一种设计种设计另外一种不破坏封装性
17、的设计想法是类另外一种不破坏封装性的设计想法是类ProjectTask的的方法不返回任何方法不返回任何Employee类型的对象,这也意味着只类型的对象,这也意味着只有类有类ProjectTask允许对允许对Employee的对象进行操作的对象进行操作。如需要如需要对外提供对外提供修改员工修改员工对象的服务,则在类对象的服务,则在类ProjectTask对应对应提供提供一具有一具有修改能力的公共修改能力的公共函数:函数:public void updateLastNamePincharge(in lastname:String)其实现是通过调用其实现是通过调用Employee类中的类中的set
18、Lastname()函数函数并通过参数的传递完成实际的修改。这种方式的使用并通过参数的传递完成实际的修改。这种方式的使用在聚合(在聚合(Aggregation)关系中是很常用的。)关系中是很常用的。2023/2/12大连理工大学软件学院18对象间归属对象间归属组合组合Composition描述两个类之间描述两个类之间的一种的一种“存在依赖性存在依赖性”,即如果类,即如果类ProjectTask的对象被删除,其所属的所有工作人员会被同的对象被删除,其所属的所有工作人员会被同时删除时删除。这种这种情况可能的一种解释为:员工指代一种工作合同,通情况可能的一种解释为:员工指代一种工作合同,通过该工作合
19、同被雇佣,当任务合同结束后工作关系自动解过该工作合同被雇佣,当任务合同结束后工作关系自动解除,合同也没有存在的必要了,会被同时删除。除,合同也没有存在的必要了,会被同时删除。2023/2/12大连理工大学软件学院19对应代码对应代码对象间归属对象间归属依赖依赖与静态的关联关系不同,依赖关系主要用来描述对象间访与静态的关联关系不同,依赖关系主要用来描述对象间访问的瞬时性,问的瞬时性,比如将某些类向其它类进行传递,这种瞬时比如将某些类向其它类进行传递,这种瞬时关系并不关系并不在对象间保持在对象间保持可以可以使用使用代替代替如果如果不影响类图的清晰性和阅读性,关联关系和依赖关系不影响类图的清晰性和阅
20、读性,关联关系和依赖关系都可以在设计类图中说明,这种动态的瞬时关系在实现中都可以在设计类图中说明,这种动态的瞬时关系在实现中的一种的一种形式为(形式为(对应代码对应代码)2023/2/12大连理工大学软件学院20关联举例关联举例2023/2/12大连理工大学软件学院21关联关系关联关系依赖举例依赖举例2023/2/12大连理工大学软件学院22依赖关系依赖关系软件架构的构建软件架构的构建将逻辑关系密切将逻辑关系密切的单元划分到一的单元划分到一起,形成系统的起,形成系统的逻辑划分,有利逻辑划分,有利于后续独立的开于后续独立的开发和管理发和管理。软件架构对应的软件架构对应的实现将实现将软件使用软件使
21、用所谓的所谓的“包包(Package)”进行构造,每个进行构造,每个包对应某种专属包对应某种专属的功能。的功能。2023/2/12大连理工大学软件学院23包中的类互相紧密包中的类互相紧密配合完成配合完成包的功能,每包的功能,每个包与其它包个包与其它包中的类间中的类间的接口的接口应量简单应量简单,降低耦合降低耦合性。性。包及其结构包及其结构包结构的套;包的表示和引用:包结构的套;包的表示和引用:常用的一种包结构:三层(界面、常用的一种包结构:三层(界面、业务和数据)业务和数据)包间包间的的虚箭头描述层虚箭头描述层间的使用间的使用(依赖)关系(依赖)关系,表示包中某类,表示包中某类通通过过某方式某
22、方式使用使用了另一包中了另一包中的类的类。包包图中一个重要的要求是在包间图中一个重要的要求是在包间不应出现不应出现循环的循环的依赖。依赖。2023/2/12大连理工大学软件学院24包结构优化包结构优化可适当提供一个可适当提供一个提供基础服务的提供基础服务的包,放置工具、包,放置工具、配置等全局类配置等全局类(静态属性、静(静态属性、静态方法)。态方法)。包的包的分解要分解要满足满足基本的非循环基本的非循环依依赖的结构要求,赖的结构要求,并在后续保持并在后续保持这这条规条规则。则。2023/2/12大连理工大学软件学院252023/2/12大连理工大学软件学院26包结构的优化包结构的优化2023
23、/2/12大连理工大学软件学院27包结构的进一步包结构的进一步优化优化包的代码实现包的代码实现#include Employee.husing namespace Businessclass:ProjectEmployee;namespace Businessclass namespace Projectdataclass ProjectTaskprivate:Employee*pincharge;/.;package businessclass.projectdata;import businessclass.projectemployee.Employee;public class Pro
24、jectTask private Employee pincharge;/*/2023/2/12大连理工大学软件学院28C+Java循环依赖的消除循环依赖的消除上图,两上图,两个个类类A1和和B1具有具有的双向关联的设计图,的双向关联的设计图,A1需要需要B1,同时,同时B1也需要也需要A1,从而导致了两个包之,从而导致了两个包之间的相互依赖。间的相互依赖。对类对类B1在包在包A中中添加接口添加接口IB1,使类,使类A1不直接不直接依赖依赖类类B1而是接口而是接口IB1,而,而IB1位于包位于包A之中之中,打破了两,打破了两个个包循环依赖,包循环依赖,整体上只整体上只保留了包保留了包B对包对包
25、A的依赖。的依赖。2023/2/12大连理工大学软件学院29影响程序运行的其它因素影响程序运行的其它因素类图类图主要用来主要用来对功能性需求进行建模,对非功能对功能性需求进行建模,对非功能性需求的描述能力性需求的描述能力往往不足。往往不足。而且而且将所有信息将所有信息都并入同一都并入同一模型中模型中进行展示也是进行展示也是不明智的,不明智的,因为将因为将导致模型本身的繁琐并难以阅导致模型本身的繁琐并难以阅读,软件读,软件系统各种系统各种信息应以不同信息应以不同的的“视图视图”进行进行重点展示才更有意义重点展示才更有意义。视图表示对视图表示对系统系统进行进行观察和理解的角度,每种角观察和理解的角
26、度,每种角度专注于系统某方面的度专注于系统某方面的特征。特征。所有所有视图的集成保证视图的集成保证最终实现的结果是全面而且最终实现的结果是全面而且成功的软件项目。成功的软件项目。2023/2/12大连理工大学软件学院30系统的系统的4+1视图视图逻辑视图逻辑视图:支持面向对象:支持面向对象的分解。逻辑架构主要用的分解。逻辑架构主要用来支持功能性需求来支持功能性需求满满足用户服务的足用户服务的系统功能系统功能进程进程视图视图:进程的分解。:进程的分解。进程架构考虑一些非功能进程架构考虑一些非功能性的需求,如性能和性的需求,如性能和可用可用性性开发开发视图视图:子系统的:子系统的分解分解物理物理视
27、图视图:软件至硬件的:软件至硬件的映射映射2023/2/12大连理工大学软件学院31用例用例视图视图:综合所:综合所有的视图有的视图。(。(+1)UML的视图的视图进程视图:进程视图:可能的独立运行的进程或可能的独立运行的进程或者线程以及关联的活动对者线程以及关联的活动对象象。Java是从是从Thread类继承或类继承或Runnable接口实现的类,接口实现的类,具有方法具有方法run()。UML中另外的中另外的描述使用描述使用构构造造型型或或对活动对活动类进行类进行表示。表示。2023/2/12大连理工大学软件学院32开发开发视图:视图:构件图能够描述多个构件的构成及构件图能够描述多个构件的构成及它们之间它们之间的联系。的联系。除了接口说明除了接口说明外,可以通过外,可以通过说明说明该构件中包含该构件中包含的的类、其它工件类、其它工件、相关、相关文件和资源等。文件和资源等。2023/2/12大连理工大学软件学院33物理视图物理视图部署图描述哪些部署图描述哪些软件构件软件构件最终在最终在哪些机器上运行的哪些机器上运行的情况情况硬件节点、可运行程序硬件节点、可运行程序和和相关工件相关工件网络连接数目网络连接数目2023/2/12大连理工大学软件学院342023/2/12大连理工大学软件学院35作业作业习题习题13(P93)
限制150内