HeadFirst面向对象分析与设计摘要笔记

来源:互联网 发布:好先生路远将来网络话 编辑:程序博客网 时间:2024/05/03 04:19

伟大软件的三步骤
1.确认你的软件做客户想要它做的事
2、运用基本的OO原则来增加软件的灵活性---OO原则是什么?
3、努力实现可维护、可重用的设计--什么是可重用?

需求
1.好的需求确保你的系统如预期那样运作
2.确认你的需求涵盖所有用例
3.运用用例找出客户忘记的事
4.你的用例将揭露任何不完整遗漏的需求,你可能需新的需求加进你的系统中
5.你的需求总是随着时间成长

分析与设计
1.设计良好的软件容易改变与扩展
2.使用像封装与继承这样的基本OO原则来确保你的软件具有灵活性
3.如果设计没有灵活性,就改变它!别与环设计拖鞋,几时那是你自己的设计,要改就是要改。
4.确认你的每一个类都具有内聚性:没一个雷都应该巨剑在把一件事情做得很好上。
内聚性:每个类确保这件事发生的理由只有一个,类的改变不会一起其他类的改变
5.随着软件的设计生命周期的展开,要持续努力提高内聚力

OO原则
1.讲变化之物封装起来

2.对接口编码,而不是对实现

3.应用程序的每一个类只有一个改变的理由。(内聚性)

4.类是关于行为与功能的

5.OCP(open-closed principle)开闭原则
  对扩展开放,对修改关闭
  扩展有效程序代码,而不是改变当中的程序代码
  简单的实现方式为继承

6.(DRY)do not repaeat yourself不自我重复原则
   通过将共同之物抽取出来并置于单一地方来避免重复的程序代码
   确保你对应用程序中每一个功能与需求只实现一次
   特定片段与信息具有单一来源,该单一来源必须合理

7.SRP(single responsibility principle)单一职责原则
  每一个对象聚焦在一个职责上
  当你得每一个对象都只有一个改变的理由时,你已经正确地实现单一职责原则。
  确保单一职责的方法
  the 类型 方法名 itself 是否合理

8.LSP(liskov subsititution principle)替换原则
  子类型必须能够替换其基类型
  LSP完全关系到设计良好的继承。当你从一个基类继承下来时,你必须需能用你的子类替换该基类且不会把事情弄糟,
  否则,你就错误地使用了继承
  继承必须确保父类型所拥有的特质(属性与方法),对子类型仍然成立(有意义)

假如发现程序代码违反LSP,考虑利用委托,组合或聚合来使用来自其他类的行为而无需使用继承
(子类不恩能够替换它的基类时可能使用)
9.委托
  委托是将特定工作的责任委派给另一个类或方法
  最好在你想要使用另一个类的功能性时使用
  假如你需要使用另一个类的功能性,但不行改变该功能性,考虑以委托代替继承

(子类不恩能够替换它的基类时可能使用)
10.使用组合将来自其他多个类()的行为集合起来
   当引用一整群的行为时,使用组合
   组合让你使用来自一组其他类的行为,并且可以在运行时切换该行为
   若对象有其他对象组成,当拥有对象被销毁时,被拥有对象(组合的一部分)也跟着消失
   在组合中,由其他行为所组成的对象用于那些行为。当对象被摧毁时,其所有行为也被摧毁。组合中的行为不存于组合本身以外。

11.聚合:组合,但没有突然的结束
(子类不恩能够替换它的基类时可能使用)
   聚合时当一个类被用作另一个类的一部分时,但仍然可以存在于该类之外

12.除了继承,有几种方式可以重用来自其他类的行为
   委托:当你不想改变其行为,而实现该行为不是此对象本身的责任时,就将行为委托给另一个类
   组合:使用组合,你可以重用来自一个或多个类的行为,特别是来自一个族群的类的行为。你得主要对象完全用于被组合对象
         ,而且被组合对象不存在主要对象之外
   聚合:当你想要组合的所有好处,但是也想要在主要对象之外使用被组合对象的行为时,就使用聚合

假如你喜欢委托、组合、聚合胜过继承,你的软件通常会更灵活,更易维护,扩展与重用。 
 

解决大问题
1.收集功能列表
2.设计用例图,必须涵盖系统的功能列表
  参与者:与系统交互的部分,不总是系统的使用者
3.领域分析:用客户所用的语言检查你得设计
4.为系统设计模块,将大问题分解成小的功能片段
5.运用设计模式帮助我们解决小的问题

架构
定义:架构是你的设计结构,强调应用程序中最重要的部件以及那些部件之间的关系
从功能入手,找出最重要的功能,可能由多个组成

架构三问:
1.他是系统本质的一部分吗?(你能想象系统没有这个功能吗?)
2.这到底是什么意思?假如你部确定某项功能的叙述究竟是什么意思,把注意力放在改功能上可能就很重要
3.我“到底"该如何做?假如你不知道如何处理某特定问题,最好花点时间去正视该功能

从哪个最重要的功能开始?关键是减少风险

架构拼图与构建场景

开发方式:
1.用例驱动开发
2.功能驱动开发
3.测试驱动开发

编程实践
1.契约式编程为你与软件用户同意遵守的软件行为建立一个共同的协议
2.防御性编程不信任其他软件,进行广泛的错误及数据检查以确保其他软件不会给你不良的或不安全的信息

面向对象分析设计项目的生命周期
1.功能列表:从高层次找出应用程序应该做什么
 客户访谈
 关键功能列表
 

2.用例图:确认应用程序要执行的大流程,以及任何牵涉到的外部力量
 外部启动器

3.分解问题:将应用程序分解成功能性模块,接着决定以什么样的次序处理每个模块
 架构
 分析
 共同性
 委托
 变化性

4.需求:为每个功能模块想出各自的需求,并且确定他们复合整体轮廓
 外部启动器
 场景
 替换路径
 迭代
 需求列表

5.领域分析:想出你的用例如何对应到应用程序理的对象,确认你课客户跟你又相同的认识
 文本分析

6.初步设计:加入关于对象的细节,定义对象之间的关系,并且运用原则与设计模式
 封装
 设计模式
 设计原则
 类图
 迭代

7.实现:编写程序代码,进行测试,确认它有效运作。为每个行为,每个功能,每个用例,每个问题,做这些事,直达你完成.
 OO原则
 封装
 测试驱动
 功能驱动
 用例驱动
 测试场景

8.交付

 

原创粉丝点击