跳至主要內容

(32)你了解哪些编程范式


1.你了解哪些编程范式?

  • 过程化 / 命令式编程

过程化编程是将带解决问题的解决方案抽象为一系列概念化的步骤。通过编程的方法将这些步骤转化成程序指令集(算法),而这些指令按照一定的顺序排列,用来说明如何执行一个任务或解决一个问题。程序员必须要知道程序要完成什么,并且告诉计算机如何进行所需的计算工作,包括每个细节操作。

过程化编程中,把待解问题规范化、抽象为某种算法是解决问题的关键步骤。其次,才是编写具体算法和完成相应的算法实现问题的正确解决。

人们把所有支持过程化编程范式的编程语言都被归纳为过程化编程语言。例如机器语言、汇编语言、BASIC、COBOL、C、FORTRAN、语言等等许多第三代编程语言都被归纳为过程化语言。

过程化语言适合解决线性的算法问题,强调“自上而下”、“精益求精”的设计方式。

  • 事件驱动编程

在过程式的程序设计中,代码本身就给出了程序执行的顺序,尽管执行顺序可能会受到程序输入数据的影响。在事件驱动的程序设计中,程序中的许多部分可能在完全不可预料的时刻被执行。往往这些程序的执行是由用户与正在执行的程序的互动触发所致。

事件驱动常常用于用户与程序的交互,通过图形用户接口(鼠标、键盘、触摸板)进行交互式的互动。当然,也可以用于异常的处理和响应用户自定义的事件等等。

事件与轮询的区别:轮询的行为是不断的观察和判断,是一种无休止的行为方式。而事件是静静的等待事情发生。

属于事件驱动的编程语言有:VB、C#、Java(Java Swing的GUI)等。它们所涉及的事件绝大多数都是GUI(图形用户界面)事件。

  • 面向对象编程

面向对象的程序设计包括三个基本概念:封装性、继承性、多态性。面向对象的语言通过类、方法、对象和消息传递,来支持面向对象的程序设计范式。

  • 函数式编程

函数式编程即是在软件开发的工程中避免使用共享状态(Shared State)、可变状态(Mutable Data)以及副作用(Side Effects)。

函数式编程中整个应用由数据驱动,应用的状态在不同纯函数之间流动。与偏向命令式编程的面向对象编程而言,函数式编程其更偏向于声明式编程,代码更加简洁明了、更可预测,并且可测试性也更好。

函数式编程是只使用纯粹的数学函数编程,函数的结果仅取决于参数,而没有副作用,就像 I/O 或者状态转换这样。程序是通过组合函数function composition 的方法构建的。

2.面向对象的优缺点是什么?

面向对象的优点:

  • 符合人类的思维习惯:传统的结构化软件开发方法是面向过程的,以算法为核心,数据和过程作为相互独立的部分,数据和过程分离,忽略了数据和操作之间的内在的联系。面向对象的方法是以对象为核心,尽可能接近人类习惯的抽象思维方法,并尽量一致地描述问题空间和解空间。

  • 稳定性高:面向对象方法用对象模拟问题域中的实体,以对象间的联系刻画实体间联系。当系统的功能需求变化时,仅需做一些局部的修改,不会引起软件结构的整体变化。现实世界中的实体是相对稳定的,以对象为中心构造的软件系统也会比较稳定。

  • 重用性好:面向对象方法具有的继承性和封装性,支持软件复用。有两种方法可以重复使用一个对象,一是创建类的实例,从而直接使用它;二是从它派生出一个满足需要的新类,子类可以重用其父类的数据结构和程序代码,并且可以在父类的基础上方便地修改和扩充,而且子类的修改并不影响父类的使用。

面向对象的缺点:

  • 如果场景简单,反而增加代码复杂度。
  • 继承的特性使得子类和父类紧耦合。
  • 面向对象使用不当时会造成过度设计。

不适合用面向对象的场景:

  • 处理大量的数据集合:关系型数据库以表为单位存储数据,无法对应上“对象”的概念,用SQL处理数据最简单直接。
  • 并行计算:并行计算是指同时使用多个计算资源来解决一个计算问题:一个问题被分解成为一系列可以并发执行的离散部分;每个部分可以进一步被分解成为一系列离散指令;来自每个部分的指令可以在不同的处理器上被同时执行。面向对象这种思维模型完全不适合并行计算的场景。

3.函数式编程用过吗,使用场景是什么?
在Java程序中,我们经常遇到一大堆单方法接口,即一个接口只定义了一个方法。例如Comparator,Runnable,Callable。以Comparator为例,我们想要调用Arrays.sort()时,可以传入一个Comparator实例,以匿名类方式编写如下:

Arrays.sort(array, new Comparator<String>() {
     public int compare(String s1, String s2) {
         return s1.compareTo(s2);
     }
 });

上述写法非常繁琐。从Java 8开始,我们可以用Lambda表达式替换单方法接口。改写上述代码如下:

 Arrays.sort(array, (String s1, String s2) -> {
     return s1.compareTo(s2);
 });

Lambda还可以继续简化,写出更简洁的代码。
参数类型声明可省略,因为编译器可以自动推断出String类型。大括号可省略,如果主体只包含一个语句,就不需要使用大括号。返回关键字return可省略,返回值的类型也是由编译器自动推断的,这里推断出的返回值是int,因此,只要返回int,编译器就不会报错。

 Arrays.sort(array, (s1, s2) -> s1.compareTo(s2));

函数式编程在科学计算、数据处理、统计分析等领域使用非常广泛。这些场景的程序往往容易用数学表达式表示,比起非函数式编程,函数式编程可以用很少的代码搞定。

参考(摘抄的文字版权属于原作者)
https://blog.csdn.net/cxs5534/article/details/112726262open in new window
https://www.zhihu.com/question/20275578?sort=createdopen in new window
https://zhuanlan.zhihu.com/p/344359676open in new window

上次编辑于: