学库吧 > 软件设计师 > 正文

软件设计师面向对象知识点:思考面向对象是什么? 软件

更新:2008-09-22 整理:www.xuekuba.com
字体:

[软件设计师知识点:面向对象语言概论一]面向对象语言概论(译自Martin Abadi, Luca Cardelli的对象理论一书的第一部分)译者前言这本书是我们上面向对象类型理论的教材。当时上这门课时,心里满不以为然,觉得自己的C++和OO已经颇有造纸,C++和Ja的类型系统不说倒背如流,也是轻车熟路,上这么一门课不是白拿学分?哈哈!但一上起来,才发现自己竟如井底之蛙一样。老天,原来就这么简单的面向对象竟有这么多说道!原来除了C++, Ja, 面向对......+阅读

软件设计师面向对象知识点:思考面向对象是什么?

先考虑一个现实问题, 大家都熟悉的手机发短信. 来看看早期(A 大约是汇编语言时代),中期(B 结构化),现在(C 面向对象)三种思想下的不同实现.
  我说的是思想, 因为虽然现在大家使用着面向对象的工具,但是大部分程序员的思想依然没有面向对象. 比如现在我手下这群程序员里有面向对象分析和设计能力的也就一个..
  用最面向对象ja和C#也可以写出杂乱无章完全不面向对象甚至不结构化的程序.
  注意到现在我们的手机号码分成移动和联通两种, 虽然对我们来说,不过是号码不一样收费不太一样,没多少区别,但是两家的短信接口可是完全不一样的.
  假设程序要求 用户在界面上输入手机号码(TextBox1),输入一条短信内容(TextBox2),按确定(Button1),就可以把短信发到那个手机上
  A 一步一步走,该干什么就干什么...看看伪代码:
  st***号码 = TextBox
  1.Text;
  st***内容 = TextBox
  2.Text;
  int 第3位数字 = int.Parse(号码.Substring
    (2,1)); 把第3位取出来,用来判断是不是移动的手机 如 1390000000 就取出一个 9
  if(第3位数字 >3)
  {
  ....
  ....
  .... 这里是一堆长长的代码用来发送***的短信...省略,我们这里只说程序的思想..不涉及技术细节
  }
  else
  {
  ....
  ...
  ... 又是一堆长长的代码用来发送***的短信
  }
  B 写一个库,定义出发送***短信的函数和发送***短信的函数,还有判断的函数,假设函数原型分别是
  发送移动短信(st***手机号码,st***内容);
  发送联通短信(st***手机号码,st***内容);
  bool 是否是移动号码(st***手机号码);
  然后写程序如下:
  if(是否是移动号码(TextBox
  1.Text))
  发送移动短信(TextBox
  1.Text,TextBox
  2.Text);
  else
  发送联通短信(TextBox
  1.Text,TextBox
  2.Text);
  C 定义一个抽象接口 "短信接收者", 由 "***"和 "***" 两个类分别实现接口. 各自实现发送短信方法.
  然后构造一个 "手机工厂"
  (一时想不到好的名字,暂时叫这个吧) , 接收一个号码,返回一个 "短信接收者"接口(里面根据接收的参数,可能是***或***)
  然后程序如下
  (一行..):
  手机工厂.获取接受者(TextBox
  1.Text).发送(TextBox
  2.Text);
  或写成这样清晰点:
  st***号码 = TextBox
  1.Text;
  st***内容 = TextBox
  2.Text;
  手机工厂.获取接受者(号码).发送(内容);
  OK,对于上面3段伪代码 大家有什么想法? 第3种是不是看起来有点 爽? 也许把,也仅仅是看起来那么一点爽,没什么大不了.
  没错,面向对象是在大型的地方更能体现优势,一小堆是展现不出来的. 我们假设程序中一共有100个这样的地方(比如一个是发短信的,一个接短信的,一个打电话的,一个上网的.....)
  那么对于A程序,很抱歉,非常要命,要在100个地方复制代码,复制100份,然后对其中99份做修改(或多或少,总要改点..)
  B程序只是在每个调用的地方加几行,可以接受.
  C程序在调用点也是加1行,同样也可以接受.
  这个时候,结构化和面向对象共同的优点体现出来了,复用性 (教科书中讲面向对象总是说说复用是面向对象比其他方法的优势,其实结构化本身就是可复用的)
  A方法差不多该抛弃了........这就是结构化发展起来以后, 非结构化很快面临淘汰地步的原因,因为在软件稍微大点,就出麻烦,写写单片机小模块还行.
  软件在一天天变大变复杂,仅仅是变大变复杂而已? 当然不是. 也变得多变. 用户的需求时时在变.软件也容易变,.
  回到刚才的问题, 现在不是有小灵通么? 你又需要多一种类型,变成 小灵通\移动\联通 3种类型.
  那么对于 A ,灾难发生....修改程序的成本不比重新做一个少.
  对于B 需要去100个调用的地方多加一个if来判断,然后多加一个对应小灵通的函数. 修改量有点大,不过也不是不行,因为毕竟现在的工具发达,你可以查找--替换.
  不过程序是需要测试的,你替换一个地方,就需要多测试一个地方,成本高.
  对于C 多加一个实现 接口的 "小灵通" 类 , 然后修改 "手机工厂"的 "获取接受者(st***号码)". 一共2处,测试也只要再测试 这个新类 还有一个方法.
  C 方法 面向对象的优势在这个时候体现出来了.
  有人这个时候出来抗议了,如果程序写的多了,经验丰富了,有人会看出我上面那些假设的漏洞,就是B 并不是的结构化方法, 因为 其实有更好的用一个函数来实现判断类型
  那样就跟 C 一样,只要改很少的地方了.
  没错, 那样C和B又公平平等了,C还是没什么优势. 请注意2点 第一: "面向对象" 不是指 面向对象 的 编程语法, 而是一种思想. 那样写其实 B 已经拿到了一点面向对象的思想了
  只是封装在非面向对象的语法中. 第二 不面向对象的确可以写出低耦合的,高效的,可维护的,很牛逼的程序. 但是那是需要很高造诣的人来做的事. 因为没有类的封装性,名字空间的隔绝

本文地址:http://www.xuekuba.com/view/18942057.html

以上内容来自互联网,请自行判断内容的正确性。若本站收录的信息无意侵犯了贵司版权,请给我们来信(willowduanall@hotmail.com),我们会及时处理和回复,谢谢.

类似推荐

软件设计师知识点:面向对象语言概论二4. Subsumption和Dynamic Dispatch (译者按:呵呵,黔驴技穷,找不到合适的翻译了)从上述的几个例子来看,似乎子类只是用来从父类借用一些定义,以避免重复。但是,当我们考虑到subsumption, 事情就有些不同了。什么是Subsumption呢?请看下面这个例子:var myCell: InstanceTypeOf(cell) := new cell;var myReCell: InstanceTypeOf(reCell) := new reCell;procedure f(x: InstanceTypeOf(cell)) is … end;再看下面这段码:myCe...
软件设计师上午知识点软件设计师上午识点分析近三年的考试情况,上午试题的识点分布如表1所示。 表1 近三年上午试题考核内容分布情况 题目编号 考核内容 1-6 计算机基础知识 7-9 10-11 标准化与知识产权 12-14 多媒体技术 15-19 软件开发基础知识 20-22 程序设计语言知识 23-28 作系统基础知识 29-36 软件过程、软件质量管理、文档与软件维护、软件测试 37-47 面向对象技术、UML、设计模式 48-50 程序语言基础知识 51-56 数据库系统基础...
软考程序员上午试题分析和备考建议本站求职网分析近几年程序员上午试题的考试内容,其识点和分值分布如下所示。考核内容 分值计算机应用 5~6计算机系统基础知识 8~10知识 2系统运行维护、性能与指标 2标准化与知识产权 2多媒体技术基础知识 2作系统基础知识 5~6程序设计语言基础知识 6~8面向对象技术基础知识 5软件工程基础知识 6~8数据结构和算法基础知识 8~10数据库系统基础知识 5~6数学应用知识 3网络基础知识 5英语 5...
软件设计师UML知识点:第七章类图前言类图是在面向对象的系统模型中使用得最普遍的图。类图包含了一组类、接口和协作以及他们之间的。你使用类图来为系统的静态视图建模。通常这包括模型化系统的词汇(从系统的词汇表中发现类),模型化协作,或则模型化模式。类图还是一些相关的图的基础,包括组件图、分布图。类图的重要性不仅仅体现在为系统建立可视化的、文档化的结构模型,同样重要的是构建通过正向和反向工程建立执行系统。术语和概念类图:类图是一组类...
如何准备系统分析师考试的上午考试尽管系统分析师考试上午试题分布很广泛,但是总是围绕目前软件开发过程中常用的技术、理论和方法,因此不建议按照大纲和参考按部就班的学有关的系统知识,而是应该注重学重点和技巧。由于考试大纲要求掌握的识点很分散,大多数识点在开始中都有所涉及,因此考生很难把握应该着重学哪些内容。我们通过把试题按照以下方法分类,就可以得到一些有意义的结论:几乎全部软件行业都会涉及到的内容,例如UML,面向对象,这...
软件设计师UML知识点:第一章UML模型的基本概念1 UML的建筑块组成UML有三种基本的建筑块:1、事物(Things)2、(Relationships)3、图(Diagrams)事物是UML中重要的组成部分。把事物紧密在一起。图是很多有相互相关的事物的组。1.1 UML的事物UML中有始终类型的事物:1、结构事物(Structural things)2、动作事物(Behioral things)3、分组事物(Grouping things)4、注释事物(Annotational things)这些事物是UML模型中最基本的面向对象的建筑块。它们在模型中...
软件设计师知识点:面向对象语言概论三传统的基于类的面向对象语言的一个主要特点就是inheritance, subclassing和subtyping之间的密不可分的。很多的面向对象语言的语法,概念,就是从这三者而来的。说,通过subclassing, 你可以继承父类的一些方法,而同时你又可以在子类中改写父类的方法。这个改写过的方法,通过subtyping, subsumption, 又可以从一个类型是父类的对象去调用。但是,inheritance, subclassing, subtyping这三者并不是永远和睦相处的。在一些...
软件设计师面向对象知识点:类和对象类的实现的基本格式:class 类名 类声明{类体的内容}类体中包括:变量的定义 + 方法的定义。例:class Ladder 类声明{float a,b,h,ladderArea; 定义变量float area() 定义方法{float ladArea;ladArea=(a+b)*h/2.0f;return ladArea;}void setHeight(float newH) 定义方法{h=newH;}}成员变量和部变量成员变量:类体中,变量定义部分所定义的变量。部变量:类体中,方法体定义的变量和方法的参数。成员变量的作用范围:在整个类...
软件设计师知识点:面向对象语言概论四四,彻底划清界限(继续分离Subclassing和Subtyping)在第二节我们讨论了部分分离Subclassing和subtyping的方法,即subclassing-implies-subtyping. 现今的多面向对象语言,如Ja, C#都是采用了这种技术。除此之外,还有一种进一步分离Subclassing和subtyping的方法。这种被称作inheritance-is-not-subtyping的方法通过完全割裂subclassing和subtyping之间的而在更大程度上方便了码的。它的产生很大程度上是由于人们想...