例:假设我是一个学术联合会的讲师。参加我的课程的人在你的课程之后还将参加其它的课程,但他们不知道下一节课的上课地点。我的责任之一,就是确保每个人都知道到哪里去上下一节课。

分析之前,我们先以结构化的程序设计方法来尝试解决问题:

1. 获取课堂上人的名单

2. 对于名单上的每个人:

a)         查找他的下一节课程。

b)         查找下一节课的地点。

c)         查找去的路径。

d)         告诉他怎样去上下一节课

这是理想的执行步骤,没有任何问题。但是大家想想,我们真的会按照上面的流程去做吗?

可能实际中,我们应该会采用这种方法:把从我讲课的教室到其他教室的路径张贴出来,然后告诉上我课的所有人:“我把其它的课程和相应教室的地址张贴在教室后面了。大家按照这份表去你们的下一个教室。”。这样就完事了。

那我们来看看这两种方法有什么不同呢?

第一种方法——对每个人都需要去明确的指出路径。你会疯掉!

第二种方法——你给了一个告示,并期望每个人都能自己知道如何完成你的告示。

两者最大的区别就是责任的转移。在第一种方案中,我对所有事情负责;第二种方案中,学生对他们自己的行为负责。两者用于实现同样的目的,但组织方式有巨大的差异。

这样做有什么效果?我们来看新需求出现时会发生什么。

这样子做有什么效果呢?我们来看当有新需求出现时会发生什么?也就是需求发生变化时。

假设我们被告知:需要给毕业后助教的学生特殊的指令。也许他们需要在到下一个教室之前先收集课程评价并把课程评价交到办公室。在第一种方案中,我必须修改控制程序来区分毕业和未毕业的学生,然后给毕业的学生特殊的指令。很可能我必须对程序做相当多的修改。

但,在第二种方案中——每个人对自己的行为负责——我只需要给毕业生一个附加的说明。然后仍然是执行“去你的下一个教室”的动作。

这是控制程序中重大的区别。第一种放啊,每当出现一种新需求时,控制程序都必须修改。

第二种方案:新类型的学生也必须对自己的行为负责。

三处改变早就了这样的效果:

每个人对自己负责,而不再有控制程序对他们负责。

控制程序可以与不同类型的人对话。

控制程序不需要知道学生在教室之间的任何步骤。

这里引进一些专门的UML术语:

软件开发过程中的三个不同的视角:

概念:展现问题领域中的概念

规格:只看软件的接口,不要看具体的实现

实现:也就是实体的代码

从这三个角度,我们再看看上面的那个例子:

我也就是讲师是在概念层上跟学生做交流。换句话说,我告诉学生“希望他做什么”,而不是“怎样做”。但是,他们各有有各自的课和,走到下个教室的路径也是不同的,可以自由选择,这就是实现层的事情了。

在一个概念层上通信,而在别一个实现层上执行。其结果就是我不需要知道具体发生了什么,只要在“概念上”发生了什么。

关于程序中的需求的变化,责任的分配相关推荐

  1. 黑科技:轻松实现JS与微信小程序中的多线程

    前言 众所周知,js是单线程的去跑代码,如果使用一个较长时间的循环来执行代码,浏览器就会卡死,直到js执行完毕,用户体验极差:因此对于较长时间的代码块,最好使用多线程去执行,关于这一点网上说可以用De ...

  2. 解决WPF程序中ListBox ItemsSource变化时不重置ScrollBar的问题

    解决WPF程序中ListBox ItemsSource变化时不重置ScrollBar的问题 参考文章: (1)解决WPF程序中ListBox ItemsSource变化时不重置ScrollBar的问题 ...

  3. 微信小程序app.js中的全局变量globalData改变,如何通知其它页面界面显示改变,小程序中如何在其他页面中监听到globalData中值的变化

    微信小程序app.js中的全局变量globalData改变,如何通知其它页面界面显示改变,小程序中如何在其他页面中监听到globalData中值的变化 在小程序中,我们一般在app.js的onLaun ...

  4. 桌面应用程序 架构_关于该架构的全部内容:探索不同的架构模式以及如何在您的应用程序中使用它们

    桌面应用程序 架构 Kriptofolio应用程序系列-第3部分 (Kriptofolio app series - Part 3) The most important thing to focus ...

  5. 在.NET客户端程序中使用多线程

    在.NET客户端程序中使用多线程通常认为在编写程序中用到多线程是一个高级的编程任务,容易发生错误.在本月的栏目中,我将在一个Windows窗体应用程序中使用多线程,它具有实际的意义,同时尽量使事情简单 ...

  6. 程序中保留一个Dump

    这段时间的主要任务是整理代码,有点类似代码考古学,呵呵,所以,看的书与重构和设计模式关系很大了,由于在修订过程中心态是很重要的,所以抽空再看<悟空传>了,否则很难达到一种心态的平衡. 修订 ...

  7. insert时调用本身字段_「技术篇」ETL工具Kettle数据对比同步以及Java程序中调用

    作为一个技术栈出身的攻城狮,虽然走上管理之路,但是技术是不能扔下的,时不时的拿起来重温一下,理论与实践相结合... 使用背景: 住建部某区块链共享平台(下游系统)需要自于上游系统的生产库数据,数据量不 ...

  8. 在C#程序中实现插件架构

    原文链接: http://www.cuj.com/documents/s=8209/cujweb0301walcheske/ 原文作者: Shawn Patrick Walcheske 译者: 电子科 ...

  9. ABAP 在被访问的程序中获取访问程序的全局变量

    前些日子接到过一个看起来比较普通的需求: 存在一个系统标准函数组FG01,内含函数模块FM00,FM01--等等.在系统程序中,FM00会调用FM01,通过FM01获取获取某些数据. 需求要求,复制一 ...

最新文章

  1. 美国卡尔顿学院计算机专业怎么样,美国卡尔顿学院排名
  2. python字典之defaultdict详解
  3. 解决gnome3 不能设置无线网络属性
  4. 第七届蓝桥杯-剪邮票(深搜+广搜)
  5. 【JUC系列】Java的锁机制
  6. JAVA中System.out.println和System.out.print有什么区别
  7. MongoDB数据库(了解MongoDB及基础命令,备份数据库)
  8. 黑科技绝对不能错过!随机采样方法MCMC
  9. 程序员1w2以下的,2020年就要面对现实了...
  10. seay代码审计工具_代码审计入门实战
  11. 模糊控制算法基础知识
  12. Win7连接蓝牙耳机(千月蓝牙激活码分享)无需破解软件
  13. 关于美图秀秀的flash在线版
  14. 计算机模拟超光速,超光速十代笔记本电脑怎么样-电脑测评
  15. U盘启动CDLinux制作方法
  16. 知识众筹服务平台网盘[入口]
  17. NOIP2016 暑期培训 D6
  18. Wi-Fi当前的趋势及对IT和物联网的影响
  19. 用批处理文件实现同步到个人时间服务器,局域网内时间同步net time的使用
  20. 华为怎么改输入法皮肤_华为输入法

热门文章

  1. Java 23种设计模式案例:原则及分类
  2. 小黑小波比.搭建个人网站
  3. Camera360SDK
  4. silverlight for olap version milestone 07 updated!
  5. SecureCRT内让npm进程后台执行不受关闭终端影响
  6. 解决git push 中remote: Permission to xxxxx.git denied to xxx. fatal: unable to access xxxx 403(转)
  7. sql判断null/空缺值
  8. 患者如何区分股癣和银屑病+药膏根治
  9. 错误代码#1045 Access denied for user 'root'@'localhost' (using password:YES)
  10. 2021-09-30