.NET 高级架构师0004 架构师之路(3)---详解面向对象

 详解面向对象的编程(OOP)

3.5.1 什么是面向对象
    刚接触编程的时候,多数人本能的反映可能是面向过程(OP)的,而不是面向对象(OO)的。这种现象其实是很正常的,改变思维方式是需要一个过程的,我大体归纳了一下其形成的原因:

1、直接原因
    你还没有养成面向对象分析问题和解决问题的习惯。建立面向对象的思维方式需要一定时间的训练和揣摩才能形成,所以你可以在学习或具体项目中刻意地强化这种意识。一般情况下,经过一段时间之后,你会觉得这是自然而然的事情,只有心中OO,眼中自然OO了。

2、历史原因
    我们从小接受的培训都是采用面向过程(OP)的方式分析问题和解决问题,尤其是数学,多数是强调按部就班的解决问题,计算机软件的发展一直就与数学是很有渊源,所以,顺理成章的,把面向过程(OP)的方式带入到软件开发也是很自然的事情。

什么是面向对象,或者谈谈你对面向对象的理解,这恐怕是软件开发人员,尤其是程序员和设计师应聘的时候,面试官常最挂在嘴边的问题吧。面向对象对应的英文是Object-Oriented,把Object-Oriented翻译成“面向对象”,我一直觉得这个译法不太确切,因为多数人第一次看到“面向对象”这四个字,都很难从字面上理解它到底是什么意思。后来,我又查阅了一些有关的资料,发现港澳台的计算机书籍中是把它翻译成了“物件导向”,这个译法,我感觉不错,于我心颇有些戚戚焉。“物件导向”比较准确地反映了面向对象认识和解决问题都是要围绕对象展开的。

所以,面向对象的思维方式认为:软件系统是一组交互的对象的集合。一组相关的对象组合为一个子系统,一组子系统继续组合为更复杂的子系统,直至组合成整个系统。

面向对象方式的出发点是尽可能模拟人类习惯的思维方式,将“问题域”中涉及的内容抽象为“对象”,使软件开发的方法与过程尽可能接近人类认识世界解决问题的方法与过程。

面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。

面向过程认识和解决问题的思维,可以称为“流程论”,重点放在处理过程的步骤,流程是整个系统的核心。

面向对象认识和解决问题的思维,可以称为“组装论”,重心放在对象的抽象和提取上,然后将对象组装为整体。

所以OO和OP从思维方式来讲,出发点还是完全不同的。

3.5.2 OP PK OO
    咱们用象棋对战的例子,来比较OP和OO的不同:

红方:功夫熊猫 黑方:悍娇虎 裁判:龟仙人

采用面向过程(OPP)的设计思路,首先分拆整个对战过程,分析双方对战的步骤,得到如下流程:

把上面每个步骤分别用函数进行实现,问题就解决了。

我们再来看看面向对象是如何来解决问题,整个象棋游戏可以抽象出3种对象:
1、棋手,负责行棋,这两者行为一致。
2、棋盘,负责绘制棋盘画面。
3、裁判,负责判定诸如吃子、犯规和输赢。

三者之间的关系如下:

第一类对象棋手负责行棋,并告知第二类对象棋盘中棋子布局的变化,棋盘接收到了棋子布局的变化后,负责在绘制屏幕,同时利用第三类对象裁判来对棋局进行判定。
从以上两种的实现方式可以看出几点:

1、可维护性
    面向对象是以数据和功能来划分问题,而不是依据流程和步骤。同样是绘制棋盘的行为,在面向过程的设计中分散在了很多的步骤中,很可能出现在不同的绘制版本中,只是不是很像一份“蛋炒饭”中的鸡蛋?在面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一,这就是把鸡蛋从“蛋炒饭”中分离出来的效果。

2、可扩展性
    假如我要加入悔棋的功能,如果要改动面向过程的设计,那么从行棋到显示再到判定这一连串的步骤都要改动,甚至步骤之间的循序都要进行大规模调整。如果是面向对象的话,只用改动棋盘对象就行了,棋盘对象保存了双方的棋谱,简单回溯,减一就可以了,而显示和判定不涉及,同时整体对各个对象功能的调用顺序都没有变化,改动只限定在了局部。

3.5.3 OO的深层思考
    OO认为:软件系统是一组交互的对象的集合。
    因为人类对现实世界是非常熟悉的,所以OO就是通过抽象的方式,把问题域映射到现实世界,尽量模拟现实世界的万事万物。通过这种方式,就可以运用现实世界中解决问题的方法与过程,来解决软件领域内的问题。
有人说:OO眼里一切皆对象,这句话还是很有道理的。
OO到底给软件开发带来了什么样的好处?OO的抽象的尺度是如何把握的呢?这都是问题。

时间: 2024-10-10 22:47:35

.NET 高级架构师0004 架构师之路(3)---详解面向对象的相关文章

Swift研究之编程高级教程(二)属性,存储属性详解

 属性 属性是依赖于某个特定的类.结构体或者枚举类型的值.Swift有两种属性:存储类型和计算类型.其中存储类型可以作为实例的一部分存放变量或者常量的值,而计算类型的属性值是通过运算的来的.计算类型的属性可以在类.结构体和枚举类型中出现,但存储类型只可能出现在类和结构体类型中. 属性一般依赖于一个特定类型的实例,但是也可以依赖于类本身.依赖于类型本身的属性称为类型属性. 可以定义属性观察者来监督属性值的改变,从而作出响应.对集合不明白的看集合类型-数组详解 存储属性 常量属性let的值在初始

Html5之高级-2 HTML5表单属性(属性介绍、属性详解)

一.属性介绍 属性介绍 - 有一些输入类型要求使用特定的属性才能显示效果,如前面提到过min,max,step. 其他输入类型需要使用一些属性来改进其他性能,或者决定验证过程的重要性.HTML5 标准中再原来的基础上增加了一些新的属性. - Placeholder 属性 - Nultiple 属性 - Autofocus 属性 - Form 属性 二.属性详解 Placeholder 属性 - Placeholder 属性通常用于search输入类型,也可以用在文本域.它表示一个简单提示.单词或

软考之高级系统架构设计师(包含2009-2018历年真题详解+课本教程+论文范文+视频教程)

软考-高级系统架构设计师2009-2018历年考试真题以及详细答案(试题和答案分离的哦),同时含有课本教程.系统架构设计师视频教程.系统架构设计师论文范文.持续更新后续年份的资料.请点赞!!请点赞!!!绝对全部货真价实的资料!!!! 全网最全,独此一家,费心整理,希望各位同学顺利通过考试!!! 高级系统架构师历年真题以及答案解析.希赛第四版教程.最新清华版官方指定教程.论文范文等资源下载地址: 百度网盘: https://pan.baidu.com/s/1LDTJgGkuuNPKZ6K8eEzV

架构进阶,Dagger2的原理及使用详解

目录 一:Dagger2是什么? 二:为什么要有Dagger2 三:Dagger2如何使用 基本的概念 如何使用Dagger2 高级用法 (1)构造方法需要其他参数时候(2) 模块之间的依赖关系(3) @Named注解使用(4) @Singleton注解(5)自定义Scoped(6)Subcomponent(7)lazy 和 Provider 四: MVP + Dagger2 Ps:文末有架构师进阶资料和面试题资料 一:Dagger2是什么? 是一个依赖注入框架,butterknife也是一个依

linux架构学习第二十五天HTTP协议详解

内容: 1.http协议概述 2.http协议特点 3.http的工作模式(过程) 4.http请求报文.响应报文格式.常见状态码解析 5.web资源概述(静态资源.动态资源) 1.http协议概述 http协议工作在TCP/IP模型的应用层,其定义web服务间通信的约定通信方式,HTTP基于tcp传送数据,默认是80端口(服务器端) 几个名词: http:hyper text transfer protocol,超文本传输协议,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(

辛星网站构架师笔记第五篇即缓存详解

前面我们介绍了缓存技术,但是对于单纯的使用缓存技术是不够的,还需要掌握一下对于提高网站的性能.减轻因为大量访问而给后台应用带来巨大压力的应用技术,也就是缓存技术. 首先说一下什么是缓存吧,缓存一般也就是成为cache,系统的缓存和硬件设备的缓存作用一样,用来暂时存放需要处理的数据,因为我们知道,从缓存读取的速度要远远高于从硬盘读取的速度,所以缓存服务器存储的数据越多,后台应用服务器的压力就越小,性能也就会越高. 而网站缓存的目的就是为了提高网站的性能,加快访问速度,合理的缓存某种类型的数据,可以

软考之信息系统项目管理师(包含2005-2018历年真题详解+官方指定第三版教程+高清学习视频)

基本搜集整理了全网所有的信息系统项目管理师资料,建议不要各位再浪费时间去各个网站下载找寻了,时间宝贵!!!全网独此一家,不要倒卖,收集不易!!!!谢谢!!!! 持续更新后续年份的资料.请点赞!!请点赞!!!绝对全部货真价实的资料!!! 全网最全,独此一家,货真价实,我整理了几天,才整理完,部分真题和教程网上没免费的,是我掏钱买的,费心整理,希望各位同学顺利通过考试!!! 软考之信息系统项目管理师的资料,由于资料太大,分成了三个部分,各位可以根据自己的需要进行下载,如果条件允许,建议各位到专业的培

【转】apue《UNIX环境高级编程第三版》第一章答案详解

原文网址:http://blog.csdn.net/hubbybob1/article/details/40859835 大家好,从这周开始学习apue<UNIX环境高级编程第三版>,在此,我要感谢网易的一个工程师朋友和室友,没有他们,我不会开始真正的学习这本书,希望大家以后开始慢慢进步.废话少说,直接上课后习题了. UNIX高级编程第一章习题答案: 1.1在系统上验证,除根目录外,目录l和l l是不同的. 答:这个验证有很多方法可使用命令ls .cd.vim等,目录.指向当前目录,目录..指

JS高级调试技巧:捕获和分析 JavaScript Error详解

前端工程师都知道 JavaScript 有基本的异常处理能力.我们可以 throw new Error(),浏览器也会在我们调用 API 出错时抛出异常.但估计绝大多数前端工程师都没考虑过收集这些异常信息 反正只要 JavaScript 出错后刷新不复现,那用户就可以通过刷新解决问题,浏览器不会崩溃,当没有发生过好了.这种假设在 Single Page App 流行之前还是成立的.现在的 Single Page App 运行一段时间后状态复杂无比,用户可能进行了若干输入操作才来到这里的,说刷新就