前言 研究这个问题的起因,是近几日在看《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
网友评论