揭开面向对象的神秘面纱

2019-06-10  本文已影响0人  始于尘埃

一、正式开始前

1.1 缘起

面向对象确实是我进入编程的一座高山,虽然是新手,但是我还是来了,来面对他,我们一起探讨,揭开面向对象的神秘面纱。

1.2 书写方式

本教程主要是我的学习笔记,我结合权威教材,并加入自己的看法,我只写最精华的东西了,至于其他的细节,我可能会一笔带过。

二、结构化程序设计

2.1 兴起

20世纪60年代,随着计算机应用领域不断扩大和处理的问题日益复杂,软件的规模越来越大,复杂程度越来越高,从此软件危机开始爆发(软件生产方式落后,供不应求;软件开发效率和维护出现严重问题),这时急需一种高效的生产方式,人们提出了软件工程概念,并开始重视程序设计方法的研究。20世纪70年代,结构化程序设计方式逐步形成。
结构化程序设计是一种自顶而下、逐步求精的模块化程序设计方法。基本思路:把一个庞大的问题分成若干个模块,再把若干个模块分成多个可以简易解决的子模块。其优点是分工编写,流程化设计。
结构化程序设计是一种传统的面向过程的编程(POP);也是在70年代,N.Wirth提出:
算法+数据结构 = 程序
这个公式揭示了程序的本质 ,即结构化程序设计就是定义数据和设计算法(定义数据:选择合适的数据结构;设计算法:根据所选的数据类型设计解决问题的过程。过程是对数据的操作)。

2.2 落寞

虽然结构化实现了流程化设计,提升了生产效率,但是,按照功能划分的程序,一旦用户的需求发生变化们就会导致功能发生变化,这回使得代码维修异常复杂;其次,结构化是数据和函数(过程)分离的,一旦数据发生变化,有可能函数也会变化(这是由数据的作用域决定的)
由于维护成本过高,结构化程序设计开始落寞。

三、面向对象的兴起

3.1为何兴起

面向过程的程序设计在思想上有一定缺点,虽然他实现了流程化,但是那并不能直观的反应解决问题的思路(这个有点像数学的分析法,我们解决一个大的问题,会去寻找能解决这个问题的下一个条件,即必要条件,一直往下找,知道最后一个必要条件我们能够直接解决,然后在反过来推开始的问题;这种方式的缺陷在于:我们写代码大多数情况下是要进行交互的,也就是说我们虽然自己写的代码自己能看懂,但是其他管理代码的人员不一定懂,这就造成了维修代码的困难;其次,也是我个人认为比较致命的缺陷——数据的函数是分离的,这会造成什么?我们知道,每一个变量都有自己的作用域,一旦离开自己的作用域就会失效,但是,面向过程的思想通常是用的全局变量,也就是说我们只有所有代码执行完后才会失效,试想,如果我们的需求变了,突然需要修改某一个参数,这就惨了,我们全部使用这个全局变量的函数都会更改),真是因为这样吗,20世纪80年代,一个伟大的编程思想——面向对象诞生了!

3.2 为什么是面向对象?

3.21基本思想:

从世界观的角度看,面向对象的基本哲学认为世界是由各种各样具有自己运动规律和内部状态的对象所组成,不同对象之间进行相互作用构成了完整的现实世界.
在计算机科学中,对象是系统中用来描述客观事物的一个实体,他是构成系统的基本单位,而系统可以看成是由一个个对象相互作用形成。
从上面的两种描述可以发现,面向对象的程序设计是非常贴合生活,非常有逻辑的思想。
为了描述同一类属性和行为的对象进行分类描述,这就是类的思想。

示例:一个类的描述:属性+行为
class Human{
  Private:
    char name[10];
    char sex;
  Public:
    void eat();
    void wear());
}

3.22 本文精华

结构化程序设计是数据和过程(函数)分离的,而面向对象的程序设计是把数据和处理数据的过程当成一个整体,即对象。
结构化程序设计是以功能为核心划分系统(缺乏稳定性),而面向对象的程序设计是以数据(属性) 为核心划分系统(稳定性强)
程序通过执行对象的各种行为操作,来访问和改变对象的状态(数据属性),并使得该对象发生某些事件。当对象发生某些事件时,通常需要向其他相关对象发送消息,请求响应(他就相当于一个生态系统,某一点改变,其他有可能都会改变)

四、面向对象的四大特征

此内容是面向对象的重点难点

4.1 抽象

把对象进行分类所依据的原则。面向对象程序设计是指对一类对象进行概括,抽象出他们共同的性质并加入以描述的过程。需要从属性和行为两个方面对对象进行描述。良好的抽象策略可以控制问题的复杂程度,增加系统的通用性和可拓展性。

class Dog{
  private:
    char name[10];  //数据抽象
    char color[10];
public:
    void input();  //行为抽象
    void speak();
};

4.2封装

封装是紧接着抽象的:就是讲抽象得到的属性数据和行为代码有机的结合在一起,形成具有类特性的整体。封装是实现抽象的基本手段(用class抽象封装);封装尽可能的隐藏内部的细节,仅通过一些外部可控的接口与外界进行交互,可以防止外界随意获取或更改 对象的内部数据;封装将对象的属性的行为封装成一个整体,有效的避免了外部错误对对象的影响。

4.3继承(面向对象的魅力)

抽象只考虑事物的共性,而继承共性和特性都考虑(继承后可以修改),完整的描述了客观事物的“层次性”。继承实质可以从已有的一类派生(继承方式)出来;继承解决了软件的重用性,并且,继承机制并不影响对象的封装。

4.4 多态

是指不同对象对于同样施加于其上的作用会有不同的反应,体现了事物的行为的“多样性”;其原因是属于不同类的对象的对象对同一消息做出的响应不同。多态使得程序设计更加灵活抽象,通过重载和虚函数机制很好的解决了函数同名的问题。

面向对象从这里正式开始......

上一篇下一篇

猜你喜欢

热点阅读