面向对象更是一种方法论,而不仅仅是一种技术。掌握一种技术可以解决某一特定问题,掌握一种方法却可以随机应变、因势利导、因地制宜。就像张无忌学习太极拳,招式忘记的越多,拳中的圆转不断之意领会的越深,所能解决的问题域就越阔,威力也就越大。
如何去看决定了看到了什么。面向对象也是如此。从技术实现角度看,对象就是拥有方法的数据,就是属性和方法的结合。在这种思维的指导下,构建对象就变成了去搜集属性和方法;凡遇一对象,必对该对象的属性、方法勾勒一番;见一人,则心里想着身高、体重、性别、姓名、能跑、能跳;这么做,过早的涉及到了实现细节,这和创建数据库中的一张表有何区别。而且,过早的想当然的规定属性、方法有可能是不正确的;比如人,这个对象在不同的问题域中所扮演的角色不同,虽然人作为一种生物是有性别的,但这个人如果是一位电话接线员,则他(她)的性别则是无关紧要的。此时在人这个对象里加一个性别属性是冗余的。
从更高的层次看对象,对象是拥有一个或若干职责的实体。这是说我们要把注意力放在对象是用来干什么的,而不是把注意力放在对象是如何实现的。先要知道做什么,然后再去考虑怎么做。目标在先,行动在后。先有一个概念上(conceptual) 的对象,再有对象的实现。总之,它是在教我们思考问题的两步法,1,what to do? 2,how to do? 如是而已。如各位所想,这种思考问题的方法也司空见惯、稀松平常,除了软件设计领域外,其他领域又何尝不是如此。人的思维就像溪流,注意力就像小船,有时随波逐流,不知不觉陷入细枝末节,不能自拔。如果有意识的提醒用这两步法去重新认识问题,则可避免使自己在设计上误入歧途。而以职责的角度看对象,让你跳出画外看画。Make it your basic viewpoint for objects. If you do, you will have superior designs.(让它变成你分析对象的基本方式,这样,你定会拥有上佳设计)。
面向对象中的封装是对数据的一种隐藏。而这只是技术层面上所展示的封装思想微不足道的一部分而已。封装实际上是教我们看待问题的一种方法,这种方法就是整体法,而用整体法分析问题,自从有人类出现就一直在使用。封装这个概念,只是这种思想在软件开发领域另一种表述。当你从整体上来考虑一个模块时,你就正在对这个模块进行封装。模块中的细节对你来说是一个黑箱,你只关心它的整体表现。实际上,如果你不用整体法来分析一个系统,你几乎无法对系统进行拆分。面向对象技术只是顺应了这种人类思考的习惯。所以,从这个意义上来说,面向对象是简单的和容易掌握的。
软件系统中,需求永远在变。面向对象技术在捕捉需求变化的方式之一就是封装变化的部分。如果你以前一直把封装简单的看作是一种数据隐藏,那么就不好理解什么是对变化进行封装。对变化的封装,就是对不确定因素的隔离。Win32的回调函数就是一种对变化的隔离,系统调用你(用户写的被系统调用的函数),而不是你调用系统。你是不确定的,系统事先并不知道你这个函数里面会执行什么操作,因为你是变化的,是程序员根据不同的用户需要后天写就的。抽象类也是一种对变化的隔离、对变化的封装。当然你也可以像通常那样把抽象类理解成Object的分门别类,然后用is-a关系来创建子类。但对于设计者来说,正因为他(她)不知道会有多少种这样的子类存在,所以才使用抽象类来对这种不确定性进行封装。如果明确知道有几个这样的子类存在,并且将来不会扩展(扩展性也是一种不确定性的表现),又何必使用抽象类这种在此情况下多此一举的机制的?
是的,这里没有谈及多态,因为多态只是一种技术手段,它的目的正是把做什么和怎么做隔离、不变和变化隔离。传统结构化分析方法中的功能分解就缺乏这种隔离,一旦需求变化而去做代码修改,修改了一处功能或数据往往可能会影响另一处功能,而赶忙跑去对另一处功能进行修改却沮丧的发现该处修改还影响着第三个地方,如此疲于奔命,到最后绝望的发现bug就像个雪球,越滚越大,目睹此景,不免一时觉得心力憔悴,吐血而亡。
更大尺度的封装就形成分层结构。分层隔离变化,隐藏细节,层与层直接通过接口或协议相互协作沟通,层层推演,形成架构。实际软件架构和公司架构、社会架构实无区别!宇宙是向着效率高的方向演进、社会如此、公司如此、软件设计也如是。封装、分层、以及由此引起的分工、协作极大提高了系统运作效率。
(封装、抽象、信息隐藏可以说是一个问题的三个侧面,也可以说它们是同一回事。抽象的过程自然伴随着封装和信息隐藏,封装的同时肯定也就是在进行抽象思考,这种整体思考法自然会不拘小节(信息隐藏))。
分享到:
相关推荐
在当前的软件开发场景中,面向对象技术已成为开发的事实。 它已变得非常流行,并已被证明在软件开发过程中非常有用。遗传算法是解决许多工程应用问题的非常有效... 为此,我们提出了一种遗传算法来评估面向对象的模型。
内容面向对象的数据库设计对象关系模型实体对象关系模型应用总结下载参考资料简介: 面向对象(OO)和三范式(3NF)都是成熟的设计方法,本文基于面向对象设计思想和三范式数据库设计方法,提出一种实体对象分层...
如今主流的软件开发思想有两种:一个是面向过程,另一个是面向对象。面向过程出现得较早,典型代表为C语言,开发中小型项目的效率很高,但是很难适用于如今主流的大中型项目开发场景。面向对象则出现得更晚一些,...
平安是一种能力,新一代企业平安观将 实现"以人为本、以数据为核心、以技术为支撑〞的平安能力。 人是平安能力的载体,平安体系建立要重点考虑人的主观能动因素,企业的普通员工、 专业技术人员以及企业管理层在平安...
面向对象的软件开发方法的关键是对问题域的理解,对象建模技术(OMT)在面向对象的软件系统建模中具有较好的性能。本文研究了OMT的三种模型、对象之间关系的描述策略,以OMT方法为指导设计了一个自动售货机模型,并进行了...
该文凭论文的目的是开发一种用于量化封装级内聚和耦合的方法,以便提出解决方案以提高面向对象系统的设计质量。 封装中类的一致性一旦促进了封装,便是可取的。 它显示了每个程序包中的功能多么强大。 结构良好的...
工资管理信息系统是采用面向对象的程序设计技术来设计生成的一个数据库管理系统,面向对象的编程技术是目前最流行的一种编程方法,它具有强大的功能和更大的灵活性,通过对工资管理系统体系进行的总体设计,功能分析...
通过对目前几种常用的知识表示方法的优缺点的对比,提出了产品概念设计知识的一种新的表示方法——面向对象表示方法.面向对象的知识表示方法是最能体现现代设计的方法,其思想更接近人的思维活动.采用面向对象的...
为更好地支持大规模定制生产的企业工时定额的制定,提出一种大规模定制环境下基于加工特征的零件工时定额的制定方法。在此方法中,运用面向对象方法将零件组内的加工特征进行分类、编码,建立加工特征信息模型,以...
我们还提出了一种新的输出度量标准,称为对象点和相关的简短形式,它们专门用于面向对象的CASE环境(包括中央对象存储库)中的输出测量。 提出这些度量标准是为了更直观,更低成本地测量CASE输出。 我们的初步结果...
Java是一种面向对象的编程语言,它具有安全、可靠、简单、高效、跨平台等特点,被广泛应用于各种类型的应用程序开发。Java程序由Java源代码编写,经过编译后生成Java字节码文件,然后在Java虚拟机上运行。 Java程序...
Java是一种面向对象的编程语言,它具有安全、可靠、简单、高效、跨平台等特点,被广泛应用于各种类型的应用程序开发。Java程序由Java源代码编写,经过编译后生成Java字节码文件,然后在Java虚拟机上运行。 Java程序...
有两种主要的方法可以用数字方式代表法律推理:一种是自上而下的方法,在这种方法中,法律专家可以通过其运作部分来分析和设计法律系统,而相反,自下而上的方法是使用机器学习来建立模型的从已决案件中进行法律...
在更多领域的应用, 当时的软件工程学者开始分析与设计新的软件方法论。 在这期间出现了超 过 50 种的面向对象方法,对于这些不同符号体系的开发方法,软件设计人员和程序员往往很 难找到完全适合他们实际开发的建模...
面向对象分类方法是适合于高空间分辨率影像信息提取的技术之一,主要包括最邻 近和隶属度函数两种分类方法,具有小样本和高维特征的特点。其中,面向对象隶属度 函数的模糊分类更是适合于研究范围较大影像区域。实际...
领域驱动设计(DomainDrivenDesign,DDD)是由EricEvans最早提出的综合软件...领域驱动设计是一种方法论(Methodology)。根据维基百科的定义,方法论是一套运用到某个研究领域的系统与理论分析方法。领域驱动设计就是
随着博客人数的增加, Blog 作为一种新的生活方式、新的工作方式、新的学习方式已经被越来越多的人所接受,并且在改变传统的网络和社会结构:网络信息不再是虚假不可验证的,交流和沟通更有明确的选择和方向性,单一...
通过引人良好的数据结构和事件触发机制,提出了一种面向对象的高度结构化的FSM实现框架,并给出了事件触发转换的调度算法.新框架清晰地表达了FSM中的所有主要元素及它们之间的关系,并将行为部分与结构部分相分离,...
2.JAVA 特性 2.1 面向对象 Java 的特点之一就是面向对象[2],是程序设计方法的一种。 "面向对象程序设计语言" 的核心之一就是开发者在设计软件的时候可以使用自定义的类型和关联操作。代码和数据的 实际集合体叫做...