编程范式00

编程范式游记

  1. C语言是静态弱类型语言 使用变量的时候需要声明变量类型 但是类型间可以有隐式转换

  2. 不同的变量类型 可以用结构体组合起来 以此来声明新的数据类型

  3. typedef 关键字定义类型的别名 以此达到变量类型的抽象

  4. 变量作用域 递归功能的过程式语言

  5. 传递参数一般是传值 也可以传递指针

  6. 通过指针 对内存进行了低级控制 然而引入了非常大的时间复杂度

  7. 编译预处理让编译更具有弹性 比如跨平台


面向过程的C语言无法满足更高层次的编程需求 C++就出现了

用引用来解决指针出现的问题
用namespace解决名字空间冲突的问题
用try-catch解决返回值编程的问题
用class来解决对象的创建、复制 销毁的问题
用重载操作符来达到操作上的泛型
用模板template和虚函数的多态以及运行时识别来达到更高层次的泛型和多态
用RALL 智能指针的方式 解决需要释放资源而出现的一些问题
用STL解决算法和数据结构当中的坑


C++的泛型

从swap函数开始

  • 编程语言中的类型问题
  • 对真实世界中业务代码的抽象、重用和拼装

类型系统用于定义将编程语言当中的数值和表达式归类为许多不同的类型 如何操作这些类型 类型如何互相作用

内建的类型

抽象的类型

  • 程序语言的安全性
  • 利于编译器的优化
  • 代码的可读性
  • 抽象化

静态语言的代表 C C++ java
动态语言 python php javascript

静态类型检查是在编译器进行语义分析时进行的
动态类型检查系统更多的则是在运行时期做动态标记和相关检查

泛型的本质是什么

类型是对内存的一种抽象 不同的类型 会有不同的内存布局和内存分配的策略
不同的类型 有不同的操作 特定的类型 会有特定的一组操作

标准化类型的内存分配、释放和访问
标准化类型的操作
标准化数据容器的操作 比如查找算法、过滤、聚合
标准化类型上特有的操作

编程语言本质上帮助程序员屏蔽底层机器代码的实现 让我们更好的关注于业务代码逻辑 是一件很难trade-off的事


函数式编程fp

编程工作是解决业务上的问题 而不是计算机的问题 因此需要更贴近业务 更为抽象的语言 如oop的C++、java

函数式编程的特点

  • stateless 不维护任何状态
  • immutale 输入数据是不能动的

优势:

  • 没有状态就没有伤害
  • 并行执行没有伤害
  • copy-paste重构代码没有伤害
  • 函数的执行没有并行上的问题

还带来了一些好处

  • 惰性求值
  • 确定性

劣势:

数据复制比较严重
完全纯函数式haskell
容易写纯函数
纯函数需要花点精力

头等函数
尾递归优化
map&reduce
pipeline管道
递归
柯里化 多个参数分解成多个函数
高阶函数

把函数当成变量来用 关注描述问题而不是怎么实现 这样可以让代码更易读
因为函数返回里面的这个函数 所以函数关注的是表达式 关注的是描述这个问题 而不是怎么实现这个事情

函数式编程LISP语言


修饰器模式(装饰器)

Java Annotation

一种纯粹的函数式编程的技巧

用一个函数来构造另一个函数

关注带参数的装饰器

类装饰器

一个 __init \call__ 调用

python的语法糖 写出的代码比较酷 但是对于没有修饰器语法糖这类语言 看看go的代码

1
2


反射机制 获取函数名

Go的修饰器模式 好像无法做到泛型 无法做到通用

最大的泛型是interface{} 还有比较简单的reflection机制

表面上看 装饰器模式就是扩展现有的一个函数的功能 干一些其他的事情 或者是附加一些别的功能
除了体验到函数式编程的代码扩展能力 还能感受到代码互相和随意拼装带来的好处
Decorator这个函数其实是可以修饰几乎所有的函数的 可以将一些非业务功能 属于控制类型的代码抽象出来 像是for-loop 或者是打印日志 函数路由 或者是求函数运行时间这种非业务功能性的代码