面向对象与面向过程

目的

 面向过程和面向对象的工作切换时时常会困扰,本文试图整理已期指导后续工作切换中融会贯通,顺畅一些。

概述

面向过程和面向对象是两种编程语言的方法,其思想基于的哲学基础不一样。计算机编程发展过程是先有面向过程,后有面向对象。面向对象的编程语言也是由面向过程的编程语言为基础实现的。

面向过程:就是程序编写依据事物过程的方式实现。应用上对应是实现某个功能、完成某个任务。比如写一篇文章,那么需要构思,写标题,目录,各功能章节等。面向过程就是找人构思,找人去写目录,写标题,写各个章节,然后按照构思逻辑整合在一起就完成了。 因为其实现的思路基本就是对一个目标进行拆解,然后各个按照其功能内容实现接口。最后有一个大的进程将其串起来就完成。模块之间的接口主要是函数api,数据结构以及全局变量等。面向过程语言最典型的是c语言。 它常用于嵌入式开发系统,完成特定具体的硬件机械功能。另外比较著名的linux操作系统也是c语言写的。这个源于操作系统偏于操作各种底层硬件,并且c语言的效率非常高,linux本人也是c语言高手,所以一直是c语言完成的。

面向对象:对象这个词应该是译文中产生的,哲学上他因该是源于对自然世界的思考后产生的。观察自然界的万物,我们可以得到除了简单罗列的功能和过程外,会发现有其他更深层面的东西。比如它可以是看一个独立自治的系统,有自己的特色功能和特点,称为一类。比如动物类,人类,水,土,木等。另外,这些类之间有相应的联系和关系,比如包含从属关系:猫类从属于动物类。比如个体和共性的关系:人类是一个整理概述,而某个人甲甲甲他就是人类中的具体个例。面向对象就是基于这样的观察和哲学思考产生的编程方法和思想。编程语言以相应的进化出版本。比如c++。使用面向对象的编程语言可以很方便的基于面向对象开发。不过使用面向过程语言有些也是可以完成面向对象的开发,因为毕竟这些都是设计思想,底层是一样的,只不过实现起来会比较类,比较考验编程水平。比如c语言中可以使用函数指针,全局变量,数据结构方式来表达类。实际上c++编程语言就可以理解是编译器做了这方面的工作。

需要注意的是即使面向对象的程序,它最终的入口外围也是有一个大的处理流程,也称为入口,它往往本质上也是面向过程的,就是会启动进程将由对象构成的程序启动起来提供服务。具体对应到代码就是main入口函数,不同的编程语言在实现这一块有些不同,有的会单独的展现为一个全局main函数作为入口,有的是在某个入口类中定义这个main函数,程序启动是找到这个类的main函数开始运行,只是方式有些差别,本质上是相同的。

面向过程开发

面向过程开发,主要是对工作目标进行分析,对其过程进行拆解,划分模块,定义全局变量,数据结构,最后设计主处理流程将所划各模块,各过程串接运行,以达到完成目标工作。

这样的设计与开发过程就是面向过程开发。因而其重点是模块划分,设计各个模块以及交互接口,设计主处理流程,使其为完成特定工作的独立运行的程序。

比如写作一篇文章,那么可以有文章结构、目录、标题、段落和正文。在设计上可以按此进行模块划分。

 

上图,每个方块为一个模块,中间的线条为接口。比如正文提供给段落的接口可以是:正文的字体,大小,行间距,抬头空格大小,文字内容,段落设置这些参数给到正文模块,正文模块生成好对应正文数据返回给段落模块。

主流程处理实现程序的启动和整体运行,比如实现人机交互,根据用户输入调用文章结构模块接口生成文章结构,而后最终生成整体文章数据,并再以人机交互的方式展现给用户。需要注意的是,往往主流程处理整体外围是一个大循环。每一次人机交互成为一个会话session,一个会话结束后会访问最初状态,以不断提供服务功能。

面向对象开发

面向对象开发:就是以对象的概念设计程序,组织内部结构,而后通过main主入口进程串接完成目标对外展现。面向对象的重点是将对象的概念,比如类,比如包含从属关系,比如对象具体话,这些思想运用到设计过程中。在开发上多以类的方式各个实现。

这里在深入一下类的表达和具体实现。前面讲过类是一种共性的抽象,其最宏观的有两个:包含从属关系,个体共性关系。而再实际使用中还进一步延伸出:继承关系,权限关系。在编码上一个类具体对应构成有:属性、方法。

继承关系:本质上源于包含从属关系,体现的是具备与使用关系。比如动物类和猫类。这两个类就是包含从属关系,在继承关系上就可以是猫类继承动物类。一般讲猫类继承了动物类,动物类所有特性和功能,猫类应都具备。

权限关系:权限源于对目前自然生灵的行为的思考,是属于生灵主动性的一种行为和意愿。比如某某具备的所有物质与功能,有些他原因分享给其他,有些他希望自己独自私有,外界不可以使用。是对资源的一种约束与管理。

因而权限关系有:私有和公开。私有进一步拓展又会有保护权限。比如某某的资源他希望私有,但又不是完全自己私有,他希望比如他的继承者可以使用。这就可以表达为保护权限。在现有诸多语言实现上,定义为保护权限,他的继承关系对象是可以使用,而如果是私有权限,仅他本身可以使用,其他如他的继承类都不可以使用。

权限关系的加入,使得面向对象更多接近于社会学,因而很多由人,群体参与或使用的软件多是用面向对象的方式开发实现。

综上,面向对象开发的重点是设计各个类,整理其中的关系和实现主进程流程串接。其中类设计的好坏直接影响程序的各个方面。

再比如,文章写作,面向对象设计,就需要设计出各个类以及之间的权限,继承关系。可以设计文字类,作为所有类的基类。

如上图,椭圆型为类,矩形为主处理流程,虚线为类的关系,实线为接口关系。由此可见,面向对象设计除了表达类的关系,接口也是需要的,和面向过程设计是一样的。

后述

前面总说了面向过程和面向对象的开发,看上去是简单明了的,但是程序员在实际工作中仍然会遇到很多困扰或错误。这主要是在实际中,编程语言为了适应各种不同场景进化更多的深入功能和概念,这些之间又有相似和模糊,实际过程也是复杂多变的,所以产生这些现象,这里适当描述一些,主要以c++为例描述。

面向对象的深入有:覆盖,虚函数、虚继承、抽象类、多继承、多态、构造函数调用顺序。

覆盖指的是派生类中写作与基类相同的函数,但函数实现不一样。这时在使用时以及指针类型定义,如果是派生类的指针则调用派生类中的函数,如果是基类指针则调用基类的实现函数。

多态理解上与上述类型定义是相反的过程,就是基指针的调用的函数,会根据具体的派生类来决定,就是会调用派生对象对应的实现函数。编程实现使用的virtual关键字,用这个关键字修饰的基类的函数,其所有派生类的相同函数也都会自动是virtual的,在使用时具备多态特征。这就好比一个笔类,在派生时可以有钢笔和铅笔。但你需要一支笔,不关心是什么笔时,你会设法得到一支笔,而你在写时,它是钢笔则会表现为钢笔方式,它是铅笔时则会表现为铅笔的方式。

因而虚函数定义可以作为接口来使用,定义类不实现,由其具体派生类实现。抽象类就是具备这样函数的类。 

多继承,就是一个类可以继承多个类。多继承会带来很多复杂的问题,这样一个简单的概念会引入很多意想不到的问题,这样事情往往是不深入分析不为人知的。多继承会带来二义性问题,就是继承的父类具有相同个的成员,在使用时需要携带分类名称引用方式规避;多继承还会产生多个相同基类实例问题,就是如果多继承的父类有共同的基类,那这个基类就会在新派生的类中有多份;多继承还有构造函数析构函数调用顺序问题,c++中按照派生声明的顺序进行。最后关于多继承:python语言是支持的,java是不支持的。

虚继承,用于解决多继承中出现的多个基类对象的相同实例问题。就是夫类继承共同基类前使用virtual关键字,这样子类再继承时,只会调用一遍共同基类构造函数。c++支持该功能,但这个功能的使用又可能引入其他更复杂的问题。因而实际使用中尽量不要使用多继承,能实现的尽量使用单继承实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值