面向对象

来源:互联网 发布:电影售票软件 编辑:程序博客网 时间:2024/04/28 20:36

一:面向对象是什么

严格的说应该是面向对象的编程实现(OOP)中的对象,面向对象编程,也不是面向类的实例编程。对象的定义是我们要研究的任何事物,从简单的整数到复杂的火箭等均可看做对象,它不仅能代表具体事物,还能表示抽象的规则,计划或者事件。也可以定义为“一切皆为对象”。因此面向对象这个对象,指的是客体。客体指客观存在的对象实体和主观抽象的概念。

二:问什么要面向对象

面向对象是为了解决系统的可维护性,可扩展性,可重用性,进一步思考,面向对象为什么能解决系统的可维护性,可扩展性,可重用性。

先来看看面向对象的历史:

1:计算机是帮助我们解决问题的,然而计算机终究是机器,他只会照人所写的代码,一步一步的执行下去,最终得到结果,因此无论程序多么复杂,计算机都能轻松应付,结构化编程,就是按照计算机的思维写出的代码,但是人们看到这么复杂的逻辑,就无法维护和扩展了。

2:结构化设计是以功能为目标来设计构造应用系统,这种做法导致我们设计程序是,不得不将客体所构成的现实世界映射到用功能模块组成的解空间中,这种转换过程,背离了人们观察和解决问题的基本思路;

可见  结构化设计在设计系统的时候,无法解决重用,维护,扩展的问题,而且会导致逻辑过于复杂,代码多且难懂。于是人们就想,能不能让计算机直接模拟现实的环境,用人类解决问题的思路,习惯,步骤来设计相应的应用程序?这样的程序, 人们在读他的时候,会更容易理解,也不需要把现实世界和程序世界来回做交换。

与此同时,人们发现,在现实世界中存在的客体是问题域中的主角,所谓客体是指客观存在的对象实体和主观抽象的概念,这种客体具有属性和行为,而客体是稳定的行为是不稳定的,同时客体之间存在各种联系,因此面向客体编程,比面向行为编程,系统更稳定,在面对频繁的需求更改时,改变的往往是行为,而客体一般不需要更改,所以我们就把行为封装起来,这样改变时候只需要改变行为就可以了,主架构则保持了稳定。于是面下对象及产生了。

然而我们所追求的系统可维护性,可扩展性,可重用性又是怎样实现的呢?

 

来看看面向对象的三大特征:

封装:

找到变化并把它封装起来,你就可以在不影响其他部分的情况下修改或者扩展被封装的变化部分,这是所有模式的基础,就是封装变化,因此封存的作用就解决了程序的扩展性。

继承:

子类继承父类,可以继承父类的属性和方法,实现了多态以及代码的重用,因此也解决了系统的重用性和扩展性,但是继承破坏了封装,因为他是对子类开放的,修改父类导致所有子类的改变,因此继承一定程度上破坏了系统的可扩展性,所以继承需要慎用,只有明确的IS-A才能使用,同时继承在程序开发过程中重构得到的,而不是程序设计之初就使用继承,很多面向对象开发中滥用继承,结果造成后期的代码解决不了需求的变化了。因此有限使用组合,而不是继承,是面向对象开发中一个重要的经验。

多态:

接口的多种不同的实现方式即为多态。接口是对行为的抽象,刚刚在封装提到,找到变化部分并封装起来,但是封装起来后,怎么适应接下来的变化,这就是接口的作用,接口的主要目的是为不相关的类提供通用的处理服务,想象一下,鸟会飞,但是超人也会飞,通过飞这个接口,我们可以让鸟和超人,都实现这个接口,这就实现了系统的可维护性,可扩展性。

因此面向对象能实现我们追求的系统可维护性,可扩展性,可重用性。面向对象是一种思想,起初,“面向对象”是专指在程序设计中采用封装,继承,多态等设计方式,但面向对象的设计思想已经涉及到软件可发的各个方面,现在细分为面向对象的分析(OOA),面向对象的设计(OOD),面向对象的编程实现(OOP)。

三:面向对象编程,可分为几步

面向对象是一种思想,他让我们在分析和解决问题时,把思维和重点转向现实生活中的客体中来,然后通过UMI工具理清这些客体之间的关系,最后用面向对象的语言实现这种客体以及客体之间的联系。他分为面向对象的分析(OOA),面向对象的设计(OOD),面向对象的编程实现(OOP)三大部分。

首先:分析需求,先不思考如何实现它,先分析需求中稳定不变得客体是什么,这些客体之间的关系是什么

其次:把分析出来的需求,进一步扩充模型,变成可实现的,符合成本的,模块化的,低耦合高内聚的模型

再者:使用面向对象的实现模型

四:面向过程到面向思维如何转变

我们在习惯了面向过程编程时,发现在程序过程中到处找不到需要面向对象的地方,最主要的原因,是思维没有转变。程序员通常在拿到一个需求的时候,第一个反应就是如何实现这个需求,这就是典型的面向过程的思维过程,而且很快可能就实现了他。而面向对象,面对的却是客体,第一步不是考虑如何实现需求,而是进行需求分析,就是根据需求找到其中的客体,在找这些客体之间的联系。因此面向过程和面向对象的思维转变的关键点,是在第一步的设计,拿到需求以后,先不考虑你如何实现它,而是通过UML建模,然后按照UML模型去实现它。这个思路的转变需要过程。

五:面向对象和基于对象有和区别

“面向对象”和“基于对象”都实现了“封装”的概念,但是面向对象实现了“继承和多态”,而“基于对象”没有实现这些。因此我们进行WEB开发,普通三层开发的过程中,基本上是基于对象的实现,因为实现了封装,但是没有实现继承和多态,不过这也正常,WEB开发大部分功能就是增删改查,中间的BLL层基本就是直接New一个DAL的实例就return了,关系数据库已经给我们做了很多工作了,所以大部分工作,就是读取然后显示了,因此没有复杂需求的时候,基于过程也没什么不对的,面向过程也没什么不对的,关键是实用。

0 0