什么是面向过程 一个函数的自白:从函数的角度看编程的方式(2)

电脑杂谈  发布时间:2018-02-16 19:49:21  来源:网络整理

基于代码行数的简洁性往往取决于已经构建好的第三方库和方法,当然,运用得当,简洁性也会带来优雅且可读性强的代码。一般地,可以信任核心库,但对第三方库的使用需谨慎。

面向简洁性,融合高阶函数,以至于一切皆为函数, 甚至形成了新的编程模式——函数式编程。纯粹的函数式编程语言,以Haskell 为代表。

我的复杂性度量

吾尝观窍妙 渠敢讥杂驳

我的复杂程度是由程序员决定的,可以非常简单,也可以非常复杂。一般地,可以采用一种叫圈复杂度的方式来评估我的复杂程度。圈复杂度是一个用于衡量代码复杂度的方式,主要是通过描述控制流路径的数量来表示复杂度。圈复杂度把程序看成一个有向图,计算公式如下:

CC = E -N +2P E是边数 N 是节点数,P是节点出口数。

圈复杂度可以衡量程序的复杂性,同样适用于函数。

我调用我自己——递归函数

知人者智 知己者明

什么是面向对象_什么是面向过程_面向过程与面向对象

由于很多的问题都可以使用归纳法进行建模,就象学生时代的数学归纳法那样,即已知n=0的情况和n到n+1的推导规则,对问题进行求解。一般地,在编程世界中,归纳法用递归函数表示。递归函数就是自己调用自己,一直在栈中操作,如果递归层次过深的话,会导致栈溢出问题的出现。

在许多编程语言中,尾递归优化解决了递归调用中的栈溢出问题。 尾调用是指一个函数里的最后一个动作是一个函数调用,即在函数尾部发生的递归调用。尾递归即在函数尾部发生的递归调用,尾递归发生时,程序语言的处理器可以安全地删除先前的栈记录,因为该调用返回时栈中不需要继续其他操作,这就是尾递归优化,尾递归优化有效地将递归函数转为迭代,节省了时间和内存。

需要注意的是,python中并不对尾递归进行优化,一般要对调用深度进行限制。

下一个是我的自动调用——回调和匿名

忽如一夜春风来,千树万树梨花开。

一般地,函数间的调用是显式的,即一个函数执行完毕在执行下一个函数。 但有这样一种使用场景,一个函数有一个额外的参数,通常是最后一个,这一参数是另一个函数,在函数执行到末尾的时候,作为参数的函数也会被调用。

参数函数作为输入,也作为当前函数的输出,函数间的这种管道式传递可以解决处理规模较大的问题,即管道中下一个被调用的函数会当作当前参数的输出。 这种后续传递,通常使用匿名函数。

如果参数函数并不是在末尾被调用,而是在特定的事件或条件发生时由另外的一方调用,参数函数用于对该事件或条件进行响应,通常使用回调函数。在C/C++中,回调函数就是一个通过函数指针调用的函数,把函数的指针(地址)作为参数传递给另一个函数,用这个指针来调用其所指向的函数。回调函数一般使用通知机制。典型的场景如编译器优化,处理程序的正常流程和异常流程,解决单线程语言的IO阻塞问题等等。什么是面向过程

需要注意的是,大量的回调函数可能会增加复杂性,使代码的可读性变差,例如Java 中的回调地狱。

我们长在对象上就成了——方法

千人同心 则得千人之力

我们都是要处理数据的,可以把数据封装起来形成一个可以修改的数据抽象。 将若干函数逐个绑定在数据抽象上,建立函数的调用顺序,查看数据的最终结果,这是一种面向数据的过程封装抽象,特点在于绑定操作将数据抽象作为参数,调用指定函数,并将函数返回值赋回。

如果将问题分解成某些问题领域的相关对象,每个对象都是一个数据封装,处理过程暴露在外,数据只能通过这些过程访问,不可直接访问,每个对象可以重新定义在其他对象中已经定义好的过程。这种长在对象上的函数又叫——方法。

对象的本质是过程分享对象内的数据,与类和继承联系在一起。继承实际上定义了对象间的从属关系,从而有了抽象类,基类,实例,覆盖,子类,单例等等。


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-80890-2.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...