编程范式与设计思想的探讨素材

编程范式与设计思想的探讨素材

目录
[隐藏]

ANI代码示例1

"Hello, World!" ->std.out  
"Goodbye, World!" ->std.out  

ANI代码示例2

s = [string\];  
"Hello, World!" ->s;  
\s ->std.out;  

CAT代码示例1

2 3 +

CAT代码示例2

def foo {
  10 <
  [ 0 ]
  [ 42 ]
  if
}

20
foo

解读:参考《改变开发者编码思维的六种编程范式》。

编程范式简介

编程范型编程范式程序设计法(英语:Programming paradigm),(即模范、典范之意,范式即模式、方法),是一类典型的编程风格,是指从事软件工程的一类典型的风格。如:函数式编程程序编程面向对象编程指令式编程等等为不同的编程范型。

编程范型提供了(同时决定了)程序员程序执行的看法。例如,在面向对象编程中,程序员认为程序是一系列相互作用的对象,而在函数式编程中一个程序会被看作是一个无状态的函数计算的序列。

正如软件工程中不同的群体会提倡不同的“方法学”一样,不同的编程语言也会提倡不同的“编程范型”。一些语言是专门为某个特定的范型设计的(如SmalltalkJava支持面向对象编程,而HaskellScheme则支持函数式编程),同时还有另一些语言支持多种范型(如RubyCommon LispPythonOz)。

很多编程范型已经被熟知他们禁止使用哪些技术,同时允许使用哪些。例如,纯粹的函数式编程不允许有副作用;结构化编程不允许使用goto。可能是因为这个原因,新的范型常常被那些习惯于较早的风格的人认为是教条主义或过分严格。

编程范型和编程语言之间的关系可能十分复杂,由于一个编程语言可以支持多种范型。例如,C++设计时,支持过程化编程面向对象编程以及泛型编程。然而,设计师和程序员们要考虑如何使用这些范型元素来构建一个程序。一个人可以用C++写出一个完全过程化的程序,另一个人也可以用C++写出一个纯粹的面向对象程序,甚至还有人可以写出杂揉了两种范型的程序。

编程范式分类

编程范式多种多样,我们挑选主要的来认识,首先明确编程范式大致可分为命令式和声明式两大类:

  • 声明式编程是目标驱动(Goal-Driven)的,因而目标是显性而算法是隐性的;
  • 命令式编程是行动导向(Action-Oriented)的,因而算法是显性而目标是隐性的。

本文涉及的范式如下图所示:

声明式

SQL语句:

SELECT * FROM collection WHERE num > 5

函数式

函数式编程(英语:functional programming)或称函数程序设计,又称泛函编程,是一种编程典范,它将计算机运算视为数学上的函数计算,并且避免使用程序状态以及易变对象。函数编程语言最重要的基础是λ演算(lambda calculus)。而且λ演算的函数可以接受函数当作输入(引数)和输出(传出值)。

比起指令式编程,函数式编程更加强调程序执行的结果而非执行的过程,倡导利用若干简单的执行单元让计算结果不断渐进,逐层推导复杂的运算,而不是设计一个复杂的执行过程。

JavaScript函数式编程特点与示例

纯函数:纯函数坚持以下属性(坚持纯度的标准不仅将有助于使程序更容易测试,也更容易推理。)

  • 其结果只能从它的参数的值来计算
  • 不能依赖于能被外部操作改变的数据
  • 不能改变外部状态

一切皆函数:参数、返回值等均可以是函数。

示例1:通过将参数从值替换为函数,打开了一个充满可能性的世界。

function repeatedly(times, fun) {
  return _.map(_.range(times), fun);
}

repeatedly(3, function() {
  return Math.floor((Math.random()*10)+1);
});
//=> [1, 3, 8]

示例2:接收2个参数,一个用来执行一些动作,另一个用来进行结果检查。

function iterateUntil(fun, check, init) {
  var ret = [];
  var result = fun(init);

  while (check(result)) {
    ret.push(result);
    result = fun(result);
  }

  return ret;
};

扩展阅读

非结构化

一个使用非结构化语言的程序经常包含按顺序排列的命令或声明,通常每个都占用一行。每一行都有编号或者标签,这样程序中的任意行都可以被执行。

非结构化程序设计引入了基本控制流的概念,比如循环、分支和跳转。尽管在非结构化模式中不存在过程,不过子程序还是可以使用的。和过程不同,子程序可能有多个入口和出口。子程序中是允许直接跳转入或跳转出的。这种灵活性可以实现协同程序,而这在过程化程序设计中是相当困难以至于不可能的。

非结构化程序设计被批评最严重的方面就是会产生很难读懂的代码(戏称面条式代码),在创建大型工程方面有时会被认为是很差的,不过,因为赋予程序设计者很大的自由,被人称赞为如同莫扎特在谱曲。

讨论点:非结构化程序设计中有本地变量的概念吗?答案

结构化

一种编程典范。它采用子程序、代码区块、for循环以及while循环等结构,来取代传统的 goto。希望借此来改善计算机程序的明晰性、质量以及开发时间,并且避免写出面条式代码。扩展阅读

过程式

过程式程序设计(英语:Procedural programming),又称过程式编程、过程化编程,一种编程典范,有时会被视为是指令式编程的同义语。派生自结构化编程(Structured programming),主要采取程序调用(procedure call)或函数调用(function call)的方式来进行流程控制。流程则由包涵一系列运算步骤的程序(Procedures),例程(routines),子程序(subroutines), 方法(methods),或函数(functions)来控制。在程序运行的任何一个时间点,都可以调用某个特定的程序。任何一个特定的程序,也能被任意一个程序或是它自己本身调用。

著名的例子有Linux内核,git,以及Apache HTTP Server等。

面向对象

面向对象程序设计(英语:Object-oriented programming,缩写:OOP)是种具有对象概念的程序编程典范,同时也是一种程序开发的抽象方针。它可能包含数据、属性、代码与方法。对象则指的是类的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性,对象里的程序可以访问及经常修改对象相关连的数据。在面向对象程序编程里,计算机程序会被设计成彼此相关的对象[1][2]。

面向对象程序设计可以看作一种在程序中包含各种独立而又互相调用的对象的思想,这与传统的思想刚好相反:传统的程序设计主张将程序看作一系列函数的集合,或者直接就是一系列对计算机下达的指令。面向对象程序设计中的每一个对象都应该能够接受数据、处理数据并将数据传达给其它对象,因此它们都可以被看作一个小型的“机器”,即对象。目前已经被证实的是,面向对象程序设计推广了程序的灵活性和可维护性,并且在大型项目设计中广为应用。此外,支持者声称面向对象程序设计要比以往的做法更加便于学习,因为它能够让人们更简单地设计并维护程序,使得程序更加便于分析、设计、理解。反对者在某些领域对此予以否认。

当我们提到面向对象的时候,它不仅指一种程序设计方法。它更多意义上是一种程序开发方式。在这一方面,我们必须了解更多关于面向对象系统分析和面向对象设计(Object Oriented Design,简称OOD)方面的知识。许多流行的编程语言是面向对象的,它们的风格就是会透由对象来创出实例。

扩展阅读

Linux设计思想探讨

  • NIH综合征
  • 小即是美
  • 让每个程序只做好一件事情
  • 尽快建立原形
  • 舍高效而取可移植性
  • 使用纯文本文件来存储数据(数据可移植性)
  • 充分利用软件的杠杆效应(模块重用)
  • 使用shell脚本来提高杠杆效应和可移植性
  • 避免强制性的用户界面(Windows中的模态窗口)
  • 让每一个程序都成为过滤器

推荐书籍

  1. 《Linux&Unix设计思想》
  2. 《O’Reilly:Head First设计模式》

写下评论