首页 > 技术文章 > 13. 编程范式—面向对象与面向过程

superpoint 2021-11-05 21:44 原文

面向机器

最早的时候(1940年之前),计算机编程都是面向机器的,也就是用机器语言(0和1)进行程序的编写,这种二进制代码能够被机器直接执行,程序运行的速度非常快,但是编写程序的效率特别低,尤其是发生错误时,排查的难度堪比登天,这对程序员也提出了更高的要求。

由于计算机编写程序实在太复杂了,于是发展出了汇编语言,汇编语言也叫符号语言,用符号代替机器指令,如使用store表示0001,表示保存指令,尽管汇编语言提高了代码的可读性,但是汇编语言本质上还是一种机器语言,编写程序依旧很困难,编写过程中依旧很容易出错

面向过程

面向机器的语言也被称为“低级语言”,面向机器的语言在编写程序的过程中,不仅要解决实际问题,还要处理好机器本身的操作指令、内存等问题,为了将程序员解放出来,在众多计算机大佬的努力之下,创建了面向过程的语言,注重一步一步的解决问题,也就是解决问题的流程,也就是面向过程的说法的由来

面向过程的编程方法将程序员从复杂的机器操作和运行的细节中解放出来,关注实际解决的问题,同时,面型过程的语言也不再需要和机器进行绑定,具备而一定的移植性和通用性,方便修改和维护

典型的面向过程的语言:C语言、BASIC、FORTRAN等

  • 优点:将复杂的问题流程化,进而简单化

  • 缺点:拓展性非常差,一个地方需要修改的时候,全部代码都要进行修改

应用场景:面向过程的程序设计一般用于那些功能一旦实现之后就很少需要改变的场景, 如果你只是写一些简单的脚本,去做一些一次性任务,用面向过程去实现是极好的,但如果你要处理的任务是复杂的,且需要不断迭代和维护, 那还是用面向对象最为方便。

  1. 并不是所有的软件都需要频繁更迭:编写脚本等
  2. 即使一个软件需要频繁更迭,也并不是所有的部分都需要一起更迭

结构化程序设计

面向过程语言中的goto语句导致的面条式代码(spaghetti code),可能导致编码会乱,一般情况下都会提倡不使用gto语句,但是实际上还是有很多goto语句的使用环境,这时,出现了结构化程序设计(Structured Programming),采用子程序,代码区块,for循环等结构,改善程序的明晰性,提高代码可读性以及代码的开发效率,避免出现面条式代码

结构化程序设计的主要思想是“自顶向下,逐步细化,模块化”的指导思想,一定程度上解决了“第一次软件危机”

面向对象

随着计算机硬件发展与计算机软件发展的不同步,软件的发展跟不上硬件与业务的需求,第二次软件危机发生了,第二次软件危机主要体现在程序的可拓展型,可维护性上面,传统的编程方法已经越来越不能适应快速多变的业务需求了,在这种背景下,面向对象的思想开始流行起来。

面向对象的思想并不是在第二次软件危机后才出现的,早在1967年的Simula语言中就开始提出来了,但第二次软件危机促进了面向对象的发展。面向对象真正开始流行是在1980s年代,现在,面向对象已经成为了主流的开发思想

虽然面向对象并不是解决软件危机的银弹,但和面向过程相比,面向对象的思想更加贴近人类思维,更加脱离机器思维,是一次软件设计思想上的飞跃

补充知识:函数式编程

​ 函数式编程并非用函数编程这么简单,而是将计算机的运算视为数学意义上的运算,比起面向过程,函数式更加注重的是执行结果而非执行的过程,代表语言有:Haskell、Erlang。

​ python并不是一门函数式编程语言,但是仍为我们提供了很多函数式编程的好的特性,如lambda,map,reduce,filter

匿名函数lambda

之前学习的函数都是在函数定义的时候就将函数名称确定了,为了精简,产生了匿名函数

# 定义格式: lambda:函数参数,函数返回值
# 调用格式:第一种 (lambda x,y:x+y)(1,2)
# 第二种 func=lambda x,y:x+y——》func(1,2)
# 但是两种方式都不怎么用,一般都是放在函数中作为参数,也就是与其他函数配合使用(没有名字,用完一次就丢,不然就成了内存垃圾)
salaries={
    'siry':3000,
    'tom':7000,
    'lili':10000,
    'jack':2000
}
# 找出薪资最高的人
max=(salaries,key=lambda k:salaries[k] )  # 前面的是迭代的对象,后面的是对迭代对象个进行的操作,简单的说就是将每个元素进行key指定的操作之后再取最大值
# 相同的函数操作还有:min(),map(),filter(),reduce()

sorted(salaries,key=lambda k:salaries[k])  # 排序,默认从小到大
sorted(salaries,key=lambda k:salaries[k],reverse=True) # reverse参数就是将从小到大的排列变成从大到小
map(lambda name:name+'挣钱啊' ,salaries)  # 映射函数map(函数,可迭代对象)将得到的结果作为返回值,python3结果返回一个生成式,python2返回一个列表
filter(lambda name:name.endswith('y'),salaries)  # 返回迭代器
# reduce
from functools import reduce
# reduce(函数,可迭代对象,初始值)
l=[1,2,3]
reduce(lambdax,y:x+y,l,10)  # 工作原理就是将初始值按照函数的功能与元素相加,先算10+1,得到11再加2,得到13再加3得到16,初始值可以不写

​ 上面的都是典型的函数式编程的函数

推荐阅读