1.2 面向对象编程概述

面向过程的编程语言也称为结构化程序设计语言,是高级语言的一种,C语言是常见的面向过程语言。在面向过程程序设计中,问题被看作一系列需要完成的任务,函数则用于完成这些任务,解决问题的焦点集中于函数。

面向过程的概念最早由E.W.Dijkstra在1965年提出,是软件发展史上的一个重要里程碑。面向过程程序设计的主要特点是采用自顶向下、逐步求精的程序设计方法,使用3种基本控制结构构造程序,即任何程序都可由顺序、选择、循环3种基本控制结构构成。

面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计流程,面向过程往往需要把一个复杂的函数切分为若干易于控制和处理的子函数,即通过把大块函数切割成小块函数来降低系统的复杂度。

面向过程的程序设计语言往往具有如下一些特点。

1.严格的语法

面向过程语言的每一条语句的书写格式都有着严格的规定。

2.接近自然语言

机器语言程序晦涩难懂的原因主要有两个,一是机器语言使用二进制数来表示机器指令的操作码和存放操作数的存储单元地址,二是每一条机器指令只能执行简单操作。而面向过程语言为了达到简化程序设计过程的目的,对语法做了大量的改进和创新,使语句的格式尽量接近自然语言的格式,同时能够用一条语句来描述运算的过程。因此,接近自然语言的语法格式和描述运算过程的方法是面向过程语言的一大特色。

3.模块化设计

在面向过程编程设计中,一个程序可以分解为多个函数,通过函数调用过程,可以用一条函数调用语句来实现复杂函数的运算过程,从而降低系统的复杂度。

4.与编译器相关

虽然面向过程语言与计算机硬件结构无关,但用于将面向过程语言程序转换成机器语言程序的编译器与计算机硬件是有关的,在计算机硬件系统中,每一种计算机都有一个独立的编译器用于将面向过程语言程序转换成对应的机器语言程序。

因此,只有具备了将面向过程语言程序转换成对应的机器语言程序的编译器,面向过程语言程序才能在该计算机上运行。对于同一面向过程语言程序,只要经过不同计算机对应编译器的编译,就可在其他计算机上运行,这种特性称为程序的可移植性。

5.解决问题的步骤

虽然面向过程语言中的语句功能比机器指令和汇编指令要强得多,但还是无法用一条语句来完成复杂运算过程所需的全部步骤,仍然需要将完成复杂运算的过程细化为一系列步骤,每一个步骤可以用一条语句描述执行。简单来说,面向过程语言程序设计就是用语句来描述解决问题过程的一系列步骤。

相比于面向对象的编程语言,面向过程的编程语言执行效率更高,因而被大量应用在单片机、嵌入式和Linux/UNIX系统开发中。而不足的是,面向过程语言难复用、易扩展,因而不适合开发大型软件系统。

面向对象编程(Object Oriented Programming,OOP)是一种程序设计思想,OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。在面向对象的程序设计语言中,一切事物皆对象,通过面向对象的方式,将现实世界的事物抽象成对象,现实世界中的关系抽象成类、继承,帮助人们实现对现实世界的抽象与数字建模。

面向对象编程作为一种新的程序设计思想,其本质是通过建立模型来体现抽象思维过程和面向对象的方法。该模型作为现实世界中事物的抽象表现,不可能反映客观事物的一切具体特征,只能对具有相同特征和表现的事物进行抽象。

面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息并处理它们,计算机程序的执行就是一系列消息在各个对象之间传递的过程。在面向对象编程中,主要的内容包括对象、类、数据抽象、继承、动态绑定、数据封装、多态性和消息传递等。

谈到面向对象编程,就不得不说一说面向对象的三大特征:封装性、继承性和多态性。

1.封装性

所谓封装,就是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部的信息,而只能通过该类所提供的方法来实现对内部信息的操作与访问。

封装隐藏了数据的内部信息,是保证程序和数据不受外部干扰和破坏的一种安全机制,同时,封装后代码可供多处调用,减少了程序的耦合度。

2.继承性

继承是面向对象的又一重要特征,一个对象可以直接使用另一个对象的属性和方法,继承可以实现代码的重用。和大多数编程语言一样,Kotlin只能单继承,但允许有多层继承。同时,子类只能继承父类中非私有的属性和方法,构造方法不能被继承,子类可以重写父类的方法,也可以命名与父类同名的成员变量。

3.多态性

多态又称为多种形态或者多种实现,是面向对象程序设计的一个重要特征,是同一函数在不同情况下的不同实现。多态是对继承的一种扩展,增强了程序的灵活性和重用性,减少了代码的耦合度。

面向对象编程作为一种程序设计范型,同时也是一种程序开发的方法,已经被大量应用到软件生产中。正如面向过程程序设计对于结构化程序设计的技术提升,面向对象程序设计方法使得设计模式的契约式设计和建模语言技术也得到了一定改善。