OOA/D 01
建筑师一般不会为一栋100层的楼添加一个新的地下室,因为成本太高无疑会失败,但软件系统里提出类似改动需求时,他们通常都不会多想一下,相反他们会说:这只是一个简单的编程问题
可总会有一些看似极难完成、但却是市场所需的的需求,它可能会让你感觉需要推倒重来,这是我们不得不面对的问题
如果我们能在建造之初就预料到以后的地下室需求,或者对以后未知的需求有丰富的扩展体系,比如,按照对建筑行业的通用认知,建造时先挖个3层高的洞放在那不管以后用作什么,是不是能很好解决呢?这就是OOA OOD的价值
当然了,如果要把地下室改成飞机跑道那就还是无解,这属于畸形业务、需求,并且已经跨领域了,经验再丰富的分析师也没有办法解决,只能推倒重来
顺带一提,OOA ,OOD,OOP,他们正是DDD的基础支撑,不严谨的说,DDD是他们落地方法论的一种,但OO最大的问题在于一股脑去体现 "结构"的表达,而DDD丰富了他们,其中最主要的是丰富了 "行为"的表达
复杂性
人在处理复杂事物时有自身的能力局限,如航空交通控制系统,必须同时处理不同飞机的状态、面对相当大的、交错的、非确定性的等等状态空间,一个人绝对没有办法跟踪所有细节
一些心里学家实验表明,人能同时理解的额最大信息数量是7个左右,大脑需要大约5秒才能接受一组新的信息,并不仅仅只有程序员是金鱼的记忆,所有人都是如此
工业级软件所涉及的问题域本身太大,单个开发者要理解它设计的所有方面太困难,甚至可以说这些系统的复杂性超出了人类智能范围,虽然我们可以掌握这种复杂性,但无法消除它
现状
简单的系统不谈,基于复杂系统的层面上,开发初期
需求方很难用开发者容易理解的方式对需求给出准确的表述,常见的描述方法是用一大段文字偶尔配有草图,这样的文档难以理解,因为双方都缺少另一个领域的经验,双方完全站在了不同角度看待问题
还一个问题是,程序员缺少了系统的、合理的分析与设计方法,只将看到的东西如实反映在程序中,也就是并没有对未来进行预判,或者进行了预判但没有使用正确的设计方式
结果就是程序员开发完成,用户或需求方在经过使用之后,会对需求有更好的理解和表述,同时这个过程也帮助开发者了解了问题域,使他们能问出更好的问题从而发掘出隐藏着的真实需求,对老系统进行不堪入目的改造
这种过程是在一直循环的,企业成本明显提升,老板抱怨程序员任务完成周期太长。程序员自己也痛苦,抱怨需求变态
一般来来说,修正错误是维护,应对改变是演化,而当我们使用一些极端手段来保持系统能继续工作时,这是保护,目前看来大部分开发者在面对修正或改变时,不得不同时进行保护
分而治之
分解系统的空间状态,可以直接解决软件的复杂性,更好的理解与设计系统
目前的分解方式有两种,一种是算法分解,一种是面向对象分解,不能说哪种好哪种不好,在不同的阶段不同的场景都有各自的重要性
对于一个系统,最开始能接收到的信息只有一份基本需求,里面有所需的业务描述,下手的地方就是阅读,找出各种名词、动词等词语
算法分解
算法分解强调事件的顺序,围绕业务的动词建立起来,它是一种自顶向下的结构化设计,这导致了程序具有树的形态,面向了过程
当系统代码数量太多,比如超过10万行时,这种方式似乎就不行了,因为各处耦合而不利于伸缩,尤其是对于复杂系统
但用于某一具体场景时,却可以很直观的看出各流程节点逻辑、关系
面向对象分解
面向对象分解强调了代理,根据问题领域中的关键抽象概念对系统进行分解,每个对象都是真实世界某个对象的模型,它们要么发出动作要么就是这些操作执行的对象
通过复用共同的机制得到一些较小的系统,提供了更加低成本的表达性,作为真实世界实体的抽象,语义上也更加贴近业务,自身又代表了一块密集又内聚的信息,将巨大的状态空间进行关注点分离,直接关注了软件的内在复杂性
并且,对象模型在规模上可以扩展,一组抽象可以构建在另一组抽象之上,可以用更加宏观的视角来观察分析
它围绕各种类型的词语建立起来,具体说来,比如名词代表某一对象,动词代表对象的行为,动词词组代表关联并可能引申出场景,对象又需要分析它的结构,对象与对象之间可能又共享某一场景,这又需要合理的组织,等等等等
结构
植物包含三种主要结构,根、茎、叶,他们各自又拥有不同的特有的结构。例如根包含支根、根毛、根冠,叶有表皮、叶肉、纬管束
这些结构又由一些细胞构成,每个细胞内还可以发现另一层的复杂度,如细胞核等
他们的各个部分组成了一种层次结构,层次结构中的每一层又都有着各自的复杂性
植物细胞由刚性的细胞壁包围,但动物细胞却不是如此,尽管存在着差异,但不管怎么说这些结构都是细胞,这是跨领域共性的一个简单例子
组织
发现共同的抽象和机制可以促进对复杂系统的理解,一个有经验的飞行员,可以很快学习驾驶一架从未驾驶过的飞机,因为飞行员在学习之初就已经了解了他们的共同抽象:舵、节流阀等,只需要花点时间去学习这架飞机的特有特性:比如哪个按钮发射导弹之类
其实这说明层次结构的使用方式是很宽泛的,复杂系统往往有许多不同的层次结构
分析PC主机时,我们可以将它分解为主板、显卡、CPU等,这是一种结构上的层次结构,或者说组成部分的层次结构
而换一种方式分析,GTX980与HD4600都是一种具体的显卡,显卡代表了他们的共同抽象,这代表了"是一种( is a )"的层次结构,他们又有一些独有特征,比如GTX980可以运行很多大型游戏而HD4600却不能,这能帮助我们进一步掌握它们内在的复杂性
我们可以把这些结构分别称为"类结构" 和 "对象结构"(并非具指代码中的类和对象)
( 面向对象分解的建模 )


(附加了四色原型模式的对象建模)

OOA/D 01的更多相关文章
- [自制简单操作系统] 1、从0-1到汇编再到c语言的奥秘
目录: 1.用0-1编写最简单的操作系统 2.用汇编改写上面0-1程序 2.1 只用DB的汇编改写版 2.2 加入RESB汇编的改写版 2.3 进一步使用汇编替换0-1文件 2.4 核心程序也用 ...
- 01.SQLServer性能优化之----强大的文件组----分盘存储
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 文章内容皆自己的理解,如有不足之处欢迎指正~谢谢 前天有学弟问逆天:“逆天,有没有一种方 ...
- 用Kotlin创建第一个Android项目(KAD 01)
原文标题:Create your first Android project using Kotlin (KAD 01) 作者:Antonio Leiva 时间:Nov 21, 2016 原文链接:h ...
- Java企业实训 - 01 - Java前奏
前言: 虽然个人专攻.NET方向,不过由于个人是干教育行业的,方方面面的东西,不能说都必须精通,但肯定多少都会涉及到. 一个菜鸟学员,从啥都不会,经过一步步学习,最后到企业上手掌管一个模块甚至一个项目 ...
- Node.js 教程 01 - 简介、安装及配置
系列目录: Node.js 教程 01 - 简介.安装及配置 Node.js 教程 02 - 经典的Hello World Node.js 教程 03 - 创建HTTP服务器 Node.js 教程 0 ...
- 0042 MySQL学习笔记-入门--01
基本概念: 数据库DB(database): 数据的仓库,数据的集合,是数据的一种结构化的存储 数据库管理系统DBMS(database management system): 管理数据库的一套软件 ...
- Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录
一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...
- ArtifactTransferException: Failure to transfer org.apache.openejb:javaee-api:jar:5.0-1
最近在myeclipse上创建maven类型的web项目的时候,出现了一个错误. ArtifactTransferException: Failure to transfer org.apache.o ...
- Python学习--01入门
Python学习--01入门 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.和PHP一样,它是后端开发语言. 如果有C语言.PHP语言.JAVA语言等其中一种语言的基础,学习Py ...
随机推荐
- Phpcms v9 实现首页|列表页|内容页调用点击量的代码
很多朋友经常问Phpcms v9的首页.列表页.内容页点击量如何调用.今天给大家分享phpcms V9如何分别在首页.列表页.内容页调用点击量代码 1,Phpcms v9首页调用点击量 {pc:con ...
- RHEL5 yum更新源
1.检查yum是否安装 rpm -qa |grep yum 2.利用CentOS的yum更新源来实现RHEL5的YUM功能 vi /etc/yum.repos.d/CentOS-Base.repo [ ...
- Java -- 异常的捕获及处理 -- throws与throw关键字
7.2 throws 与 throw关键字 7.2.1 throws 关键字 在定义一个方法时可以使用throws关键字声明,使用throws声明的方法标识此方法不处理异常,而交给方法的调用处进行处理 ...
- 8 -- 深入使用Spring -- 4...4 Spring 的 AOP 支持
8.4.4 Spring 的AOP 支持 Spring中的AOP代理由Spring的IoC容器负责生成.管理,器依赖关系也由IoC容器负责管理.因此,AOP代理可以直接使用容器中的其他Bean实例作为 ...
- 升级MAC OX上的Python到3.4
第1步:下载Python3.4 下载地址如下: 下载Mac OS X 64-bit/32-bit installerhttps://www.python.org/downloads/release/p ...
- 测试amqplib实例,报错 Error: connect ECONNREFUSED 127.0.0.1:5672
研究消息队列处理库amqplib(https://www.npmjs.com/package/amqplib)时,把实例直接拿过来运行的时候报错如下 不知道为什么会出这样的问题,后来跑到github上 ...
- PHP代码审计笔记--任意文件下载漏洞
在文件下载操作中,文件名及路径由客户端传入的参数控制,并且未进行有效的过滤,导致用户可恶意下载任意文件. 0x01 客户端下载 常见于系统中存在文件(附件/文档等资源)下载的地方. 漏洞示例代码: ...
- 【权限维持】window几种隐藏技术
“真正”隐藏文件 使用Attrib +s +a +h +r命令就是把原本的文件夹增加了系统文件属性.存档文件属性.只读文件属性和隐藏文件属性. attrib +s +a +h +r c:\test 这 ...
- ajax做省市联动
原理: 当select.jsp页面打开时,向服务器发送异步请求,得到所有省份的名称(文本数据).然后使用每个省份名称创建<option>,添加到<select name=”provi ...
- [Vim] 搜索模式(正则表达式)
本文介绍如何使用Vim的搜索模式. 搜索单词 Vim中使用 \< 和 \> 分别表示单词的开头和结尾,例如查找单词 i 而不是字母 i ,在正常模式下,按下 / 启动搜索模式,输入 \&l ...