Java面向对象设计
第一章 面向对象软件工程与UML
图形图画是最好的沟通方式,UML就是做这种方式的,各种各样的图形。
软件工程学的研究
用工程学的方法进行软件的开发与维护,并对软件的生产过程进行工程化的管理
软件工程的内容
针对软件生命周期的全过程机器每个具体阶段的工程方法、技术细则、文档规范、技术支持、管理制度、人员组织以及质量保证体系等。每个软件开发者必须按工程的统一要求形式,不能随意的自由发挥。每个开发阶段都要产生健全的、符合工程规范的文档。软件产品是这些文档的总和,而不仅仅是程序。
软件工程的三要素
1、方法:完成软件开发的各项任务的家属方法、为软件开发提供“如何做”的技术
2、工具:为原型方法而提供的自动或半自动的软件的工程的支撑环境
3、过程:为了获得高质量的软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤,如何将软件工程方法与软件工具相结合,合理、及时地进行软件开发。
我们在项目中采用的方法、工具、过程
方法:面向对象方法
工具:EA
过程:基于原型的增量迭代软件
软件的生命周期:
一、寻找商机
1:产品(没有需求明确方,我们自己拿出东西投入到市场中)
2:项目(专门为客户定制的)
二、可行性分析
1:这东西能不能做,法律允不允许
三、需求调研
系统分析师 UI工程师 测试人员(将所有需求量化,不能有模糊的东西) ——经过这三个过程就成文——需求分析说明书:界面
1:搞清楚用户要什么东西,定目标——有哪些功能需求和非功能需求,用某种方法和工具构软件系统模型,并编写软件需求规格说明书。
四、界面设计
1.概要设计:我整个程序的结构,——架构师(项目经理)——产生概要设计书
2.详细设计:设计在项目中遇到各种各样的实体——项目经理(组长、资深老程序员参与进来)
3.数据库设计:有专员设计(项目经理或者DBA)
五、开发阶段
根据详细设计的文档进行开发(程序员或测试员)
六、测试阶段
性能测试、压力测试、用户环境测试、
七、用户培训
教会用户使用,遇到问题怎么办,
八、试运行,验收
九、系统维护
在UM类中表示具体类
抽象类图,类名和抽象方法用斜体表示。
(一)如何衡量软件设计的质量
复用与分离,站在设计上的角度叫做:耦合度和内聚度 内聚:在你自己的事情就自己做,不要把这东西牵扯太多 耦合:好些类好些方法合作,耦合度要低内聚度要高。
如何衡量软件设计的质量
1.满足软件的功能要求 2.满足要求的并不一定是好的设计
好的设计
1.可读性:软件的谁及文档是否轻易被其他程序员理解。解读性差的设计会给大型软件的开发和维护过程带来严重的危害
2.可复用性:软件系统的架构、类、组件等单元能否很容易被本项目的其他部分或者其他项目复用。
3.可扩展性:软件面对需求变化时,功能或性能扩展的难易程度。
4.可维护性:软件维护(主要是值软件错误的修改、遗漏功能的添加等)的难易程度。
以上的标准太抽象了,无法考量
1.内聚度:
定义:表示一个应用程序的单个单元所负责的任务数量和多样性。内聚单个类或者单个方法单元相关
好得软件设计应该做到高内聚:
如果一个系统单元只负责一件事情,就说明这个系统单元有很高的内聚度;如果一个系统单元负责了很多不相关的事情,则说明这个系统的单元是内聚度很低。
内聚度的简单判断方法
如果一个方法可以用简单的“动词+名词”的形式来命名
2.耦合度
耦合度表示类之间关系的紧密程度。
“高内聚,低耦合”是所有优秀软件的共同特征。要做到这样那么在社加时就要遵循一定的设计原则。
一.单一职责:不是指单一功能,而是所有功能都满足它设计的理由
定义:所有的对象都应该有单一的职责,它提供的所有服务也都仅围绕着这个职责。
换句话说就是:一个类而言,应该仅有一个引起它变化的原因,永远不要让一个类存在多个改变的理由
好得设计不是用你的代码写的多还是少来判断好坏,没有一个设计是为了减少你的代码量,好得设计自然而然
二.开闭原则是面向对象中最核心的一个原则
开闭原则是指一个如啊你按实体应该对扩展开放,对修改关闭
遵循开闭原则设计出来的模块具有两个基本特征:
遵循这个原则可以带来灵活性、可重用性和可维护性。
1.对于扩展是开放的:模块的行为可以扩展,当应用的需求改变时,可以对模块进行扩展,以满足新的需求
2.对于更改是封闭的:对于模块行为的扩展时,不必改动模块的源代码或二进制码。
配置文件的出现就是为了开闭原则
三.里氏替换原则
在项目中判断是否该做继承的原则。
定义:在一个软件系统中,子类应该能够完全替换任父类能够出现的地方,并且经过替换后,不会让调用父类的程序从行为上有任何改变
四、依赖倒转原则
业务的分层的时候低层设计接口或者抽象类与高层进行绑定。遵循的是依赖倒转原则,而不是接口隔离原则。高层应该绑定底层的
依赖倒转原则是指将两个模块之间的依赖关系倒置为依赖抽象类或接口。具有两层含义:
1.高层模块不应该依赖于底层没模块,二者都应该依赖于抽象;
2.抽象不应该依赖于细节,细节应该依赖于抽象。
五、组合/聚合复用原则
尽量在设计中尽量使用组合/聚合来达到复用的目的,而不是使用继承来达到目的。
在实际运用中尽量别用继承,除非真的满足里氏替换,和(is a)关系。
组合/聚合的好处:
1.新对象存取成分对象的唯一方法是通过成分对象的接口
2.这种对象的复用是黑箱复用,因为成分对象的内部实现细节对于新的对象是看不见的。
3.这种复用所用的依赖更少。
4.新对象可以在运行时候动态的引用于成分对象类型相同的对象。
继承复用的优点:
1.新的实现比较容易,因为超类的大部功能可以通过继承关系自动进入子类。
2.修改或者扩展继承而来的实现比较容易。
继承复用的缺点:
1.继承服用破坏包装,将超类的实现细节暴露给子类
六、接口隔离原则
尽量少的定义大接口,多的定义小接口
七、迪米特法则
迪米特法则,又称为“最少知识原则”,它的定义为:一个软件实体应当尽可能少的与其他实体发生相互作用。
第三章 创建型设计模式(套路)
模式分为两个模式
一.设计模式
微观:针对某一具体问题,或是某一具体场景。
全球公认的设计模式23种,又分为3个大类:
1、创建模式(产生对象):创建某种特殊对象,用一种特殊的方式产生对象。
——单列模式(考的最多)Singleto:
1.应用场景——当需要设计一种特殊类,能且只能产生一个对象的时候。
2.解决方案(代码)——3.解决方案(多种方案对比优劣)
——工厂模式(以后用的最多)Factory:
将生产对象的类与使用对象的类进行分离。
——原型模式—Prototype
定义:根据一个已有的对象,产生一个一模一样的对象。——引出第二个标记接口:
1.调用(克隆clone)方法的实现被我们成为浅克隆。
2.
4中产生对象的方式:【new】 【反射】 【反序列化】 【克隆】
结构模式:装饰器模式(管道的对接就是装饰器模式)。适配器模式(有可能会被考察)
行为模式:让一些类具有特有的行为——命令模式。——观察者模式(代码级别)
二.架构模式
宏观:比如三层架构(业务成——持久层),主要针对工程中的类与接口的关系进行项目搭建与设计。