6.6 面向对象设计

6、面向对象设计 … Object-oriented Design
   面向对象设计在系统开发中的位置

   Contrast the importance of object design skill versus UML notation knowledge
6.1 面向对象设计的关注点

   面向对象设计

     主要工作在 领域相关 domain

     也称为应用 逻辑、业务 逻辑

   面向对象设计 不直接关注

     用户界面

     数据储存
   面向对象设计

     领域层与 UI 层、数据层通过特定的接口,进行通信

     例如,Model-View 划分原则

       View与领域层有不同的关注点

         例如

           GUI 不应该计算税费(这是 domain层应该做的),但是可以对数据进行验证

           Domain 对象不应当去探知外部事件的发生,但应当被通知到

     例如,观察者模式 Observer pattern

       GUI 对象通过专门的接口,到 Domain对象中注册

       Domain 对象并不知道是谁来注册的,仅仅知道通信接口
6.2 领域对象与设计对象的一致性

   领域对象对应真实世界的对象 Domain objects should correspond with real-world objects

   设计活动从领域模型开始
    领域模型中的 Payment 是 一个概念,在设计模型中是 一个软件类。它们不是同一 件事,但前者启发了后者的 命名/定义
    这样就降低了表示差异 这是面向对象技术的一个重 要思路
6.3 从SSD到设计

   GUI产生、或者检测到系统消息,发送到领域层的某个对象(术语:控制器,Controller)
    SSD上的每个系统操作,都将有系统进行处理。它们表示UI层对应用 层或者领域层的调用
6.4 设计思想的来源

   模式 Pattern (及其变种…)

     软件设计最新的概念 Important concept in software design today

       同学们要经常去关注,比如 www.csdn.net , 一些开源网站等

     研习针对大规模/小规模问题的“最佳实践”解决方案

     教材、论文记录的一些方法

     在不同上下文中重用——不要从头开始设计解决方案

     设计, 还需要一点点灵感!
6.5 大规模系统设计遇到的问题

   如何定义领域层对象与子系统之间的协作 How to structure collaborations between domain objects and subsystems

     e.g 永久存储子系统 the Persistence subsystem

   如何定义UI对象到领域层对象之间的协作? How to structure collaborations between the UI objects and the domain layer objects

   如何设计与实现“向上”的协作?How to design and implement “upward” collaborations

     e.g 领域层对象到 UI 对象
6.6 Responsibility-Driven Design (RDD)

   设计的总体思路

     标识职责 responsibilities,并把它们分配给不同的类

   职责

     行为职责 Doing

       create an object, perform calculations

       initiate operations on other objects

       control and coordinate activities

       …

     认知职责 knowing

       about private encapsulated data

       about related objects

       about things it can derive or calculate

       …
   职责描述是一种抽象,粒度大小不一

     软件对象只有方法 methods,没有职责

     从职责到对象方法的转换

       比如,“负责永久存储”,粒度太大

       比如“负责计算税费” ,粒度要好一些
   职责描述是一种很好的隐喻

     职责驱动的设计 RDD,对象设计时可以问这样的问题

       这个对象有哪些职责?

       这个对象与哪个对象协作?
6.7 对象设计的基本原则 GRASP 原则

   该如何分配职责呢?What are the guiding principles to help assign responsibilities

   有没有什么原则可以给予指导?

   它们是

     通用的职责分配软件原则(模式)GRASP General Responsibility Assignment Software Principles(patterns)

       这是一组非常基本和通用的对象设计原则
   The 9 GRASP Principles

     Creator 创建者

     Information Expert 信息专家

     Controller 控制器

     Low Coupling 低耦合

     High Cohesion 高内聚

     Polymorphism 多态

     Pure Fabrication 纯虚构

     Indirection 间接

     Protected Variations 隔离变化

    记住每条原则的名字、含义、如何使用,它们是本课程最重要、 最有用的内容
小结

   大型软件系统的设计

     软件架构

     分层、子系统

   面向对象设计主要关注领域层对象、与 UI 层、数据存储层之间有 接口

   领域层需要完成的功能,以职责来描述

   面向对象设计的主要任务: 把职责分配类和对象

   如何分配呢?

   GRASP是很好的指导原则

   让我们期待课程的下一阶段

     面向对象设计 (OOD, Object-Oriented Design)

posted @ 2019-03-17 19:56  otr  阅读(245)  评论(0编辑  收藏  举报