代码编程中的编程范式

上传人:I*** 文档编号:152583785 上传时间:2020-11-24 格式:PDF 页数:71 大小:39.81MB
返回 下载 相关 举报
代码编程中的编程范式_第1页
第1页 / 共71页
代码编程中的编程范式_第2页
第2页 / 共71页
代码编程中的编程范式_第3页
第3页 / 共71页
代码编程中的编程范式_第4页
第4页 / 共71页
代码编程中的编程范式_第5页
第5页 / 共71页
点击查看更多>>
资源描述

《代码编程中的编程范式》由会员分享,可在线阅读,更多相关《代码编程中的编程范式(71页珍藏版)》请在金锄头文库上搜索。

1、代码编程中的编程代码编程中的编程范式范式 陈皓 个人简介个人简介 1818年工作经历,超大型分布式系统基础架构研发和设计年工作经历,超大型分布式系统基础架构研发和设计 擅长领域:金融、电子商务、云计算、大数据擅长领域:金融、电子商务、云计算、大数据 职业背景职业背景 阿里巴巴资深架构师(阿里云、天猫、淘宝) 亚马逊高级研发经理(AWS、全球购、商品需求预测) 汤森路透研发经理(实时金融数据处理基础架构) 目前在创业,致力于为企业提供技术架构管理产品目前在创业,致力于为企业提供技术架构管理产品 目标:用户不用改一行代码就可以提高系统的性能和稳定性 从从 C C 语言开始说起语言开始说起 C C

2、语言的语言的 swapswap 函数函数 现实世界的一个类比现实世界的一个类比 是否可以做得更好?是否可以做得更好? C C语言的泛型语言的泛型 swapswap函数函数 C C语言泛型的问题语言泛型的问题 接口开始变得复杂,需要加入接口开始变得复杂,需要加入sizesize 如果是字符串如果是字符串 charchar* * ,那么,那么 swapswap的参数是否要二级指针的参数是否要二级指针 voidvoid* * ? ? 指针看不到类型,那么如果不同的类型会怎么样?指针看不到类型,那么如果不同的类型会怎么样? swapswap ( ( &double,&double, & &intint

3、) ) ? C C语言的宏只是做字符串替换,可能会造成很能多问题语言的宏只是做字符串替换,可能会造成很能多问题 检查类型的长度检查类型的长度 - - sizeofsizeof可能会有问题可能会有问题 检查类型的长度检查类型的长度 vsvs 类型转换类型转换 - - 痛苦的二选一痛苦的二选一 C C 语言的语言的 searchsearch 函数函数 C C语言语言 searchsearch 函数泛型化函数泛型化 C C 语言泛型的问题语言泛型的问题 数据类型的自适应问题数据类型的自适应问题 随着算法越来越复杂,接口越来越复杂。随着算法越来越复杂,接口越来越复杂。 如果再继续进入数据结构中的泛型。

4、如:如果再继续进入数据结构中的泛型。如:vector,vector, stack,stack, mapmap 几乎很难了几乎很难了 太多的数据封装太多的数据封装和基于此类数据类型的算法实现,几乎不可能完全照顾到和基于此类数据类型的算法实现,几乎不可能完全照顾到 数据容器还需要解决两个问题:数据容器还需要解决两个问题: 数据对象的内存是如何分配和释放的? 数据对象的复制是如何复制的?深拷贝 还是 浅拷贝? 纠结纠结 - - 哪些工作应该是“用户处理”?哪些应该是“自己处理”?哪些工作应该是“用户处理”?哪些应该是“自己处理”? 泛型编程泛型编程 程序抽象程序抽象 程序的算法(或应用逻辑)应该是和

5、数据类型甚至数据结构无关的。程序的算法(或应用逻辑)应该是和数据类型甚至数据结构无关的。 各种特殊的数据类型(或数据结构)理应做好自己的份内的工作。各种特殊的数据类型(或数据结构)理应做好自己的份内的工作。 算法只关于一个完全标准和通用的实现。算法只关于一个完全标准和通用的实现。 对于泛型的抽象,我们需要回答一个问题:对于泛型的抽象,我们需要回答一个问题: 如果让我的数据类型符合通用的算法,那么什么是数据类型最小的需求? C+C+有效地解决了程序的泛型问题有效地解决了程序的泛型问题 类的出现类的出现 构造函数、析构函数 定义了数据模型的内存分配和释放。 拷贝函数函数、赋值函数 定义了数据模型中

6、数据的拷贝和赋值。 重载操作符 定义了数据模型中数据的操作是如何进行的 模板的出现模板的出现 根据不同的类型直接生成不同类型的函数,对不同的类型进行了有效的隔离。 具化的模板和特定的重载函数,可以为特定的类型指定特定的操作。 C+C+ 的模板泛型初探的模板泛型初探 问题一:数组方式的迭代只适合顺序式的数据结构问题一:数组方式的迭代只适合顺序式的数据结构 问题二:问题二:resultresult初始化的那个值还没有被泛型化初始化的那个值还没有被泛型化 问题三:解决问题一,我们需要使用一个更通用的“迭代器”,那么,问题三:解决问题一,我们需要使用一个更通用的“迭代器”,那么,templatetem

7、plate 的参数的参数 会变成“迭代器”的类型,那么,算法里面的会变成“迭代器”的类型,那么,算法里面的 resultresult 的类型怎么办?的类型怎么办? 泛型中需要解决的问题泛型中需要解决的问题 1.1. 需要把数据类型抽象化掉。需要把数据类型抽象化掉。 2.2. 需要用一个更为通用的“迭代泛型”,而不只是基于数组的需要用一个更为通用的“迭代泛型”,而不只是基于数组的 forfor- -looploop 3.3. 需要一个需要一个 ValueValue TypeType 的抽象。的抽象。 4.4. 需要解决数据对象的创建、销毁、拷贝、复制、比较、需要解决数据对象的创建、销毁、拷贝、复

8、制、比较、+ + - - * * / /等算术操作等算术操作。 5.5. 需要解决数据容器对内部对象的“取引用”,“”需要解决数据容器对内部对象的“取引用”,“” 一个糙快猛的“迭代器”一个糙快猛的“迭代器” 在模板上扩展了一个参数,用于数据容器的迭代器在模板上扩展了一个参数,用于数据容器的迭代器 IterIter,而,而 T T 则变成了数据类型则变成了数据类型 在在 sumsum 函数上也扩展了一个参数,用于做函数上也扩展了一个参数,用于做 初始化值。初始化值。 问题:问题:我们可不可以把我们可不可以把 IterIter 的类型给映射到的类型给映射到 T T 上?上?() () 泛型:容器

9、、迭代器、算法泛型:容器、迭代器、算法 泛型需要处理的三件事:泛型需要处理的三件事: 数据容器 数据容器的迭代器 泛型的算法 是否足够泛型了?是否足够泛型了? 如果我们有这样的数据结构如果我们有这样的数据结构 如果我即想计算员工的总薪水,也想 计算员工的总休假 如果我想想计算员工中拿薪水最高了, 和休假最少的? 面对这么多的需求,我们是否还能再面对这么多的需求,我们是否还能再 泛型一些?泛型一些? 更加泛型更加泛型 - - ReduceReduce函数函数 使用函数对象有两个好处:使用函数对象有两个好处: 函数式编程 不用维护状态 函数式可以组合出更多的东西函数式可以组合出更多的东西 函数式编

10、程函数式编程 函数式编程函数式编程 借鉴于数学代数借鉴于数学代数,函数是所有的一切函数是所有的一切 函数就是一个表达式,是一个单纯的运算过程 通过对比简单的函数的组合,完成复杂的功能通过对比简单的函数的组合,完成复杂的功能 函数只是定义“输入数据”到“输出数据”的相关关系(表达式)函数只是定义“输入数据”到“输出数据”的相关关系(表达式) = + + = + = + + , = + = + + = 1 + ( 2) 函数式的核心精神函数式的核心精神 PurePure FunctionFunction 特征特征 Stateless - 函数不维护任何状态 Immutable - 也不修改输入数据

11、,返回新的数据集 好处好处 没有状态就没有伤害 并行执行无伤害 Copy-Paste 重构代码无伤害 函数的执行没有顺序上的问题 劣处劣处 数据复制比较严重,性能不是很好 完全纯函数式完全纯函数式 Haskell 容易写纯函数容易写纯函数 F#, Ocaml, Clojure, Scala 纯函数需要花点精力纯函数需要花点精力 C#, Java, JavaScript 函数式编程函数式编程 - - 无状态的函数无状态的函数 不依赖也不改变不依赖也不改变外部数据的外部数据的值值 主要描述输入数据和输出数据的关系主要描述输入数据和输出数据的关系 函数就是表达式函数就是表达式 关注于描述问题而不是怎

12、么实现关注于描述问题而不是怎么实现 函数式代码示例函数式代码示例 SchemeScheme 函数式的三套件函数式的三套件 map/reduce/filtermap/reduce/filter 函数式编程的示例函数式编程的示例 代码变得更简洁和优雅了 数据集,操作,返回值都放到了 一起。 没有了循环体,于是就可以少了 些临时变量,以及变量倒来倒去 逻辑 代码变成了在描述你要干什么, 而不是怎么去干 函数式编程函数式编程 vsvs UnixUnix 管道管道 UnixUnix ShellShell pipelinepipeline 抽象成函数式的样子抽象成函数式的样子 面向过程面向过程 vsvs

13、函数式函数式 函数式编程示例函数式编程示例 我们有3辆车比赛,简单起见,我们 分别给这3辆车有70%的概率可以往 前走一步,一共有5次机会,我们打 出每一次这3辆车的前行状态。 抽取出函数抽取出函数 - - 但函数间强耦合但函数间强耦合 函数式编程函数式编程 它们之间没有共享的变量 函数间通过参数和返回值 来传递数据 在函数里没有状态。 PythonPython 的修饰器的修饰器 PythonPython 的修饰器的修饰器 - - 示例一示例一 $ python $ python hello.pyhello.py hello, foo i am foo goodby, foo PythonPy

14、thon 修饰器修饰器 - - 示例二示例二 输出输出 hello world PythonPython 修饰器修饰器 + + 管道管道 面向对象编程面向对象编程 面向对象面向对象 把数据、属性、方法的封装或抽象成对象。把数据、属性、方法的封装或抽象成对象。 每个对象都可以接受/处理数据并将数据传达给其它对象,就像一个小型独立的“机器”。 通过独立对象的抽象(多态),提高软件的重用性、灵活性和扩展性 支持面向对象的语言:支持面向对象的语言: Common Lisp、Python、C+、Objective-C、Smalltalk、Delphi、Java、Swift、C#、Perl、 Ruby 、

15、PHP、Javascript等。 面向对象的核心理念面向对象的核心理念 Program to an interface, not an implementation. Program to an interface, not an implementation. 使用者不需要知道数据类型、结构、算法的细节。 使用者不需要知道实现细节,只需要知道提供的接口。 利于抽象、封装,动态绑定,多态。 符合面向对象的特质和理念。 Favor object composition over class inheritance. Favor object composition over class inhe

16、ritance. 继承需要给子类暴露一些父类的设计和实现细节。 父类的实现的改变会造成子类也需要改变。 我们以为继承主要是为了代码重用,但实际上在子类中需要重新实现很多父类的方法。 继承更多的应该是为了多态。 面向对象算法拼装面向对象算法拼装 面向对象中的对象拼装面向对象中的对象拼装 示例:示例: 四个物体:木头桌子、木头椅子、塑料桌子、塑料椅子 四个属性:燃点、密度、价格、重量 面向对象的优缺点面向对象的优缺点 优点 能和真实的世界相辉映,符合人的直觉。 面向对象和数据库模型设计类型,更多的关注对象间的模型设计。 强调于“名词”而不是“动词”,更多的关注对象和对象间的接口。 根据业务的特征形成一个个高内聚的对象,有效地分离了抽象和具体实现,增强了重用性和扩展性。 拥有大量非常优秀的设计原则和设计模式 、S.O.L.I.D、IoC/DI 批评 代码都需要附着在一个类上,从一侧面上说,其鼓励了类型。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > IT计算机/网络 > 云计算/并行计算

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号