编程范式和程序设计模式

前言 研究这个问题的起因,是近几日在看《python 深度学习--Keras》的过程中,一边体味书中深度学习任务开发的搭建模式,回想起之前在做WSI_TMB项目过程中“识途”所编写的python和R代码,同时脑中一直对“面向对象编程(OOP)、函数式编程、面向过程编程”等概念及内涵的设计理念含混不清,因而想要对程序设计哲学(范式)、模式和原则有更深入的了解,也为后续自己进行代码编写有更为高屋建瓴的指导,故浏览了多篇博文和资料。此处做一记录,一则梳理思路、将所看转化为心得体会,二则记录原始资料出处,便于后续翻看。

1. 首先明确编程范式和程序设计模式的概念及二者区别

编程范式/编程范式/程序设计法(Programming paradigm):是指从事软件工程的一类典型的编程风格(此概念好比“战略”)
程序设计模式 : 设计模式是软件设计中常见问题的典型解决方案(此概念好比“战术”)

编程范式体现编写程序的人如何看待程序设计的“哲学观”;
程序设计模式则是解决一系列实际问题的“方法学”

2. 编程范式(Programming paradigm)的分类

想要理解编程范式,首先应该明白程序设计的核心是“数据和控制”--即“有什么菜,如何做”;而任何编程范式都是围绕该核心如何实施的设计哲学,编程范式的不同是因为实施程序设计核心的思路不一样,即对程序的抽象方式不同
程序设计核心.png

按照抽象方式的不同,编程范式可分为:

编程范式分类.png

图片源自:https://www.geeksforgeeks.org/introduction-of-programming-paradigms/
另:狭义的命令式编程特指面向过程编程:There is no difference in between procedural and imperative approach

目前应用较为普遍(也是我接触和正在使用)的包括:1)面向过程编程(Procedural Programming) ,2)面向对象编程(Object Oriented Programming,OOP) ,3)函数式编程(Functional Programming,FP)

1)面向过程编程(Procedural Programming,PP):以状态(变量)抽象现实世界 "用变量来储存数据,用语句来执行指令,其设计思想就是结构化设计"。PP是以过程为中心,自顶向下、逐步求精。过程就是事物发展的先后顺序,一个个事件发展连起来就是一个过程,而面向过程就是重点分析这个先后顺序,先干什么,后干什么,然后干什么。比如5除以2这个事件,面向过程的思维首先想到的是除法这个事件,所以它会先写一个除法的方法,用来接收数据5和3,就像这样div(5,3)。面向对象编程可以将数据与函数绑定到一起,进行封装。
2)面向对象编程(Object Oriented Programming,OOP):以对象抽象现实世界“概括出事物的属性和方法(本质是函数),其设计思想就是将相关的函数用数据粘合”。与PP正相反的是OOP以数据为中心,自底向上、逐步合并。比如5除以2这个事件,面向对象的思想首先想到的是5和2是一个整型,于是先创建一个整数类型的对象,对象包含一个基本的数据类型以及一个除法的方法,就像这样 5.div(2)。
3)函数式编程(Functional Programming,FP):以计算(函数)抽象现实世界“使用函数来抽象作用在数据之上的控制流和操作,从而在系统中消除副作用并减少对状态的改变”。函数式编程最大限度的写pure function(没有变量),让函数最大限度的减少side effect,并且保证函数在任何时候传递相同参数时,得到的结果都相同。函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数:python中的map/reduce/filter/sorted等都体现了函数式编程的思想。

以上三者的异同、适用领域概括为下图
不同编程范式对比.png

下图很生动地概括了面向过程编程和面向对象编程的差别
面向过程与面向对象编程对比.jpg

3. 程序设计模式(Design pattern)共三类:1)创建型模式 2)结构性模式 3)行为模式,总计23种。了解了设计模式的概念和分类后,剩下的就只需要对以上具体的模式进行学习,见:

设计模式学习网站 https://refactoringguru.cn/design-patterns#intro-patterns
设计模式介绍 https://www.runoob.com/design-pattern/design-pattern-intro.html

什么是 GOF(四人帮,全拼 Gang of Four)?
在 1994 年,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 
四人合著出版了一本书,名为 Design Patterns - Elements of Reusable Object-Oriented Software
该书首次提到了软件开发中设计模式的概念。
四位作者合称 GOF(四人帮,全拼 Gang of Four)。他们所提出的设计模式主要是基于以下的面向对象设计原则。
    对接口编程而不是对实现编程。
    优先使用对象组合而不是继承。
API(应用编程接口)就是接口,就是通道,负责一个程序和其他软件的沟通,本质是预先定义的函数
百度词条:API是一些预先定义的函数,用来提供应用程序与开发人员基于某软件或硬件得以访问的一组例程,而又无需访问源码或理解内部细节

进一步理解python中上述内容的具体细节

python 中OOP和FP对比 https://zhuanlan.zhihu.com/p/111314360
python与设计模式 https://zhuanlan.zhihu.com/p/31675841?utm_source=wechat_session&utm_medium=social&utm_oi=968146188821860352
python官方文档中的函数式编程指导https://docs.python.org/zh-cn/3/howto/functional.html

python史上最全OOP :https://zhuanlan.zhihu.com/p/61042358?utm_source=wechat_session&utm_medium=social&utm_oi=968146188821860352

以及下一步学习内容:计算机常见 “数据结构” 和《程序员修炼之道:通向务实的最高境界(第2版)》,未完待续

参考链接:

编程思想1 https://blog.csdn.net/ITNNN001/article/details/104168709
编程思想2https://blog.csdn.net/shupan001/article/details/6824668?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

面向过程/对象/函数式编程的异同(另附五子棋例子)https://blog.csdn.net/Mr_fengzi/article/details/91386040
编程范式|这么些年的技术总结 https://chen-shang.github.io/2019/10/08/ji-zhu-zong-jie/java/bian-cheng-fan-shi/
编程范式与语言 https://www.cnblogs.com/wahaha02/p/4561569.html
再谈编程范式—程序语言背后的思想 https://zhuanlan.zhihu.com/p/64418426?utm_source=wechat_session&utm_medium=social&utm_oi=968146188821860352
网站GeeksForGeeks介绍编程范式 https://www.geeksforgeeks.org/introduction-of-programming-paradigms/
函数式编程思维 https://www.zhihu.com/question/28292740
廖雪峰讲python函数式编程 https://www.liaoxuefeng.com/wiki/1016959663602400/1017328525009056
python官方文档中的函数式编程指导https://docs.python.org/zh-cn/3/howto/functional.html
设计模式学习网站 https://refactoringguru.cn/design-patterns#intro-patterns
设计模式介绍 https://www.runoob.com/design-pattern/design-pattern-intro.html
R属于非纯函数式编程语言里面的强动态类型https://zh.wikipedia.org/wiki/%E5%87%BD%E6%95%B0%E5%BC%8F%E7%BC%96%E7%A8%8B
R的编程范式 https://www.geeksforgeeks.org/classes-in-r-programming/?ref=rp
什么是应用编程接口https://www.zhihu.com/question/38594466
知乎提升编程思想和能力https://www.zhihu.com/question/35648714

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容