参考:Process-oriented vs. Object-oriented

前言

软件行业在采用OO的思想后,从一开始只对编码使用OO,到现在“分析-设计-编码”全部环节使用OO,形成了OOA、OOD、OOP。作为Programmer,只知道根据设计编码,但是设计如何指导编码,设计又是怎么开来的却不十分清楚。本文试着粗略概括现实世界如何层层抽象到对象世界。

理解现实世界

  这里说的现实世界,是以“人”为出发点理解的现实世界。软件的目的是服务于“人”,自己简单写的Hello World程序基本上算不上什么软件,除了向你演示如何使用一门语言外没啥作用。如果我们站在很高的抽象层次,以高度归纳的视角来看这个世界的运作,就会发现现实世界无论多复杂,无论是哪个行业,无论做什么业务,其本质无非是由规则组成的。人是一切的中心,人要做事,做事就会使用一些物并产生另一些物,同时做事需要遵循一定的规则。

  在计算机没发明出来前,这个世界也是由规则组成的,没有计算机人类一样活得很好。计算机发明后,有了软件,软件解放了人类部分工作,即帮助人类完成了“”。软件开发就是以“人”为出发点,设计出满足“人”特定期望的东西。在实现“事”的过程中会依据“规则”使用某些“物”。

现实世界到抽象世界

捕获现实世界需求

  软件为人服务,设计软件的第一步便是准确捕获现实世界。现实世界也就是软件建模中的领域问题,一个领域问题极其庞大,我们该如何选取角度建立模型呢?领域问题就好比一座城市,城市各个角落遍布摄像机。想要了解一座城市,只需要根据你所关心的问题选择合适的机位即可。这里面的关键是如何选取领域问题的观察角度,而选取观察角度的关键是人,人所关心的观察角度才是有意义的角度,人不关心的角度呈现给人也没啥乱用。

  回到软件设计上来,客户的需求既是我们面临的问题领域,用户关心的才是我们正确的建模方向。UML中使用用例来准确捕获客户的原始需求,即上图现实世界——业务模型这一环节。当然原始需求不是那么容易捕获的,客户不懂计算机,甚至连他想要实现的业务目标都可能描述不清楚,这需要反复的沟通、甄别、确认。

业务模型——概念模型

  现实世界被业务模型映射并且记录下来,但这只是原始需求信息,距离可执行的代码还很遥远,必须把这些内容再换成一种可以指导开发的表达方式。UML通过称之为概念化的过程(Conceptual)来建立适合计算机理解和实现的模型,这个模型称为分析模型(Analysis Model)。分析模型介于原始需求和计算机实现之间,是一种过渡模型。分析模型向上映射了原始需求,计算机的可执行代码可以通过分析模型追溯到原始需求;同时,分析模型向下为计算机实现规定了一种高层次的抽象,这种抽象是一种指导,也是一种约束,计算机实现过程非常容易遵循这种指导和约束来完成可执行代码的设计工作。

分析模型主要采用的元模型有:

  边界类(boundary)。边界是面向对象分析的一个非常重要的观点。从狭义上说,边界就是大家熟悉的界面,所有对计算机的操作都要通过界面进行。从广义上说,任何一件事物都分为里面和外面,外面的事物与里面的事物之间的任何交互都需要有一个边界。比如参与者与系统的交互,系统与系统之间的交互,模块与模块之间的交互等。只要是两个不同职责的簇之间的交互都需要有一个边界,换句话说,边界决定了外面能对里面做什么“事”。
  实体类(entity)。原始需求中领域模型中的业务实体映射了现实世界中参与者完成业务目标时所涉及的事物,UML采用实体类来重新表达业务实体。实体类可以采用计算机观点在不丢失业务实体信息的条件下重新归纳和组织信息,建立逻辑关联,添加那些实际业务中不会使用到,但是执行计算机逻辑时需要的控制信息等。这些实体类可以看作是业务实体的实例化结果。
  控制类(control)。边界和实体都是静态的,本身并不会动作。UML采用控制类来表述原始需求中的动态信息,即业务或用例场景中的步骤和活动。从UML的观点看来,边界类和实体类之间,边界类和边界类之间,实体类和实体类之间不能够直接相互访问,它们需要通过控制类来代理访问要求。这样就把动作和物体分开了。

概念模型——设计模型

我理解这个阶段就是UML中的类图。在大多数情况下,实现类可以简单地从分析类映射而来。在设计模型中,概念模型中的边界类可以被转化为操作界面或者系统接口;控制类可以被转化为计算程序或控制程序,例如工作流、算法体等;实体类可以转化为数据库表、XML文档或者其他带有持久化特征的类。

《大象 Thinking in UML》读书笔记:软件开发——从现实世界到对象世界的更多相关文章

  1. <读书笔记>软件调试之道 :从大局看调试-理想的调试环境

    声明:本文档的内容主要来源于书籍<软件调试修炼之道>作者Paul Butcher,属于读书笔记.欢迎转载! ---------------------------------------- ...

  2. &lt;读书笔记&gt;软件调试之道 :从大局看调试-零容忍策略

    声明:本文档的内容主要来源于书籍<软件调试修炼之道>作者Paul Butcher,属于读书笔记.欢迎转载! ---------------------------------------- ...

  3. &lt;读书笔记&gt;软件调试之道 :从大局看调试-发现代码存在问题

    声明:本文档的内容主要来源于书籍<软件调试修炼之道>作者Paul Butcher,属于读书笔记.欢迎转载! ---------------------------------------- ...

  4. &lt;读书笔记&gt;软件调试之道 :问题的核心-修复后的反思

    声明:本文档的内容主要来源于书籍<软件调试修炼之道>作者Paul Butcher,属于读书笔记.欢迎转载! ---------------------------------------- ...

  5. &lt;读书笔记&gt;软件调试之道 :问题的核心-如何修复缺陷

    声明:本文档的内容主要来源于书籍<软件调试修炼之道>作者Paul Butcher,属于读书笔记.欢迎转载! 修复缺陷 对于一个好的修复来说,不仅仅是让软件运行正确,还需要为将来奠定基础.一 ...

  6. &lt;读书笔记&gt;软件调试之道 :问题的核心-诊断

    声明:本文档的内容主要来源于书籍<软件调试修炼之道>作者Paul Butcher,属于读书笔记. 不要急于动手! 尽管可以利用各种工具和技术以及软件自身查找缺陷,但是你最重要的财富是你的智 ...

  7. &lt;读书笔记&gt;软件调试之道 :问题的核心-重现问题

    声明:本文档的内容主要来源于书籍<软件调试修炼之道>作者Paul Butcher,属于读书笔记. 重现第一,提问第二 问题重现是实证过程的最强大武器,如果不能重现问题,你也无法证明修复了它 ...

  8. &lt;读书笔记&gt;软件调试之道 :实证方法

    有效调试不仅仅是排除缺陷,其包含如下几个步骤 弄明白软件为何运行错误 修复这个问题 避免破坏其它部分 保持或者提高代码的总体质量 确保同样的问题不在其它地方发生,也不会再次发生 构建实验.观察结果 依 ...

  9. VxWorks 6.9 内核编程指导之读书笔记 -- C++开发

    5.1 介绍 针对C++的VxWorks配置 C++头文件 使用C++启动任务 C和C++之前调用代码 C++编译器说明 在信号处理和ISR中使用C++ 下载C++编写的内核模块 C++编译器的不同 ...

随机推荐

  1. 数据结构之图 Part2 - 1

    邻接矩阵 网上很少有C# 写图的数据结构的例子,实际的项目中也从来没用过Array 这坨东西,随手写个,勿喷. namespace LH.GraphConsole { public struct Gr ...

  2. 20145227《Java程序设计》第1次实验报告

    20145227<Java程序设计>第1次实验报告 实验步骤与内容 命令行下Java程序开发 1.打开 cmd ,输入 mkdir 20145227 命令建立实验目录,然后输入 cd 20 ...

  3. 暴力求解——POJ 3134Power Calculus

    Description Starting with x and repeatedly multiplying by x, we can compute x31 with thirty multipli ...

  4. div中的内容居中

    要使div中的内容居中显示,不仅div要设定“text-align:centr"  ,内置对象要添加margin:auto;属性才能使其在firefox等其他浏览器中也能居中.

  5. cc1plus: fatal error: emeralddb-pmdMain.d: No such file or directory

    签名autoscan, aclocal, config啥的都没错,最后make 报下面的错,查了各个文件没发现有啥问题,请哪位帮忙卡看 make[1]: Entering directory `/ro ...

  6. [整理]在命令行执行 UIAutomation

    instruments -t /Developer/Platforms/iPhoneOS.platform/Developer/Library/Instruments/PlugIns/Automati ...

  7. UEP-时间

    时间戳转化为Date(or String) SimpleDateFormat format = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" ...

  8. confusing c++ 重写 与 重定义 记录1

    class parent { public: void f() { cout << "parent f()" << endl; } void f(int i ...

  9. 【原】Redis windows下的环境搭建

    下载地址:https://github.com/dmajkic/redis/downloads 下载下来的包里有两个,一个是32位的,一个是64位的.根据自己的实情情况选择,我的是64bit,把这个文 ...

  10. linux:使用apt、dpkg工具安装软件

    先总结一下安装软件常用命令: % apt sudo apt install xxxx sudo apt list xxxx % dpkg安装deb文件 sudo dpkg -i xxxx.deb 学习 ...