headfirst面向对象读书笔记, 主要设计一个程序的整体设计, 从需求到规划到实现到测试

  • 三步走

    1. 确认软件做客户要他做的事
    2. 运用基本的的 OO 原则增加软件的灵活性
    3. 努力实现可维护可重用的设计
  • 低耦合

  • 封装: 保护应用程序的某一部分的信息免遭其他部分的干扰, 应该将变化之物封装起来

  • 变更: 确保每个类只有一个改变的理由

  • 内聚力: 内聚力越高, 每个类的责任就定义的越好且越相关

  • 当你有一组特性跨对象变化时, 使用集合来动态存储, 可以在新特性加入时避免改变程序代码

  • 根据用户需要的功能整理出需求

  • 需求: 需求列表

  • 领域分析: 识别、收集、组织及表示领域相关信息的流程,根据的是现有系统与其开发历程的研究、领域专家捕捉到的知识、潜在的理论以及领域里新兴的技术。

    • 避免构建不属于你责任范围内的系统部分
  • 用例: 用例过程, 用例中的名词可能是代码里的类

    用用例检查需求, 用例的每一步会满足(涉及)需求

    • 明确的价值
    • 起点与终点
    • 外部启动者
  • 主要路径和替换路径

  • 从第一步到最后一步通过用例的完整路径称为场景

  • 用例图:

    • 系统, 系统中的用例, 参与者
    • 使用功能列表确定用例图是完整的
  • 接口: 对接口编码而不是对实现, 对接口编码, 程序代码将使用该接口的所有子类, 甚至是还没被创建的那些

  • 构建系统时尽可能把细节往后拖延

  • 架构: 片段如何组织在一起以及哪些比较重要

    • 从功能列表中找出比较重要的
    • 架构三问:
      1. 他是系统本质的一部分吗
      2. 他到底是什么意思
      3. 我该怎么做
  • OO 原则

    1. OCP open-close priciple 类应该对扩展开放, 对修改关闭 灵活性!
    2. DRY dont repeat yourself 将共同之物抽取出来置于单一地方来避免重复的额程序代码 一个地方一个需求!
    3. SRP single responsibility principle(内聚力) 每一个对象具有单一职责 $class $method itself!!!
    4. LSP Liskov substitution principle 子类型必须能替换其基类型
  • 继承

  • 委托: 保护对象免受软件中其他对象实现改变的干扰

    • 假如你需要使用另一个类的功能性,但不想改变该动能性,考虑以委托代替继承。
  • 组合: 当你想要使用由接口所定义的行为,并且从该接口的种种实现中进行选择时,组合是最有威力的,不论是在编译期间还是在运行时。

    • 在组合中, 当对象被摧毁时, 其所有行为也会被摧毁
  • 聚合: 可以独立于主要对象之外存在

  • 驱动开发

    • 功能驱动开发
    • 用例驱动开发
    • 测试驱动开发, 测试应该具有原子性
  • 编程方式

    • 契约式编程: 你正在与客户的程序代码 合作,以对你将如何处理有问题的状况达成协议。 (return null)
    • 防御性编程: 你正在确保客户取得“安全的"响应,不管客户要什么。(throw exception)

整体流程

  1. 功能列表
  2. 用例图
  3. 分解问题
  4. 需求
  5. 领域分析
  6. 初步设计(OO 原则)
  7. 实现
  8. 交付