0%

理解control、logic、data、泛型、函数式编程

2020年4月12日 下午2:42

还是从需求的角度进行分析,理解control、logic、data、泛型、函数式编程

  1. 老一辈的有经验的程序员认识到:我们需要将代码中的control,logic,data进行分离,这样不管我们看别人的代码,还是自己写代码都会更加的有逻辑,更容易看懂并写出,而不仅仅是完成功能就可以了
  2. 那我们如何实现所谓的control,logic,data的分离呢?
    1. 首先我们需要将data进行分离,因为data与control和logic的区别更大
    2. 这个操作我们把它叫做泛型,当然在泛型的过程中并不是使用一个T就可以了,我们需要将泛型和迭代一起完成,详见 模板编程:分步骤STL如何实现泛型
  3. 实现泛型之后,我们如何将control和logic进行分离呢?
    1. 首先,我们需要明白什么是contorl什么是logic,control我把它理解成是调度好像更好理解一些;而logic其实就是我们业务功能。当我们需要更换业务功能时,是可以使用同一个套control进行调度的。可以把control和logic之间的关系可以称作为“范llogic”,这个名字去自与泛型。一个control的例子:map_reduce_filter 就是control,他们只负责遍历。
    2. 这时候,我们将control和logic进行分离之后进行的编程方法叫做函数式编程。当然,上面说的从control和logic进行分离角度来认识函数式编程,其实函数式编程的起源是来自于数学上的函数,函数有有两个特性:stateless,immutable,而函数式编程也必须满足这两个条件,最终能够做到并行执行和copy-paste。两个角度不同而已。
  4. 此时,我们有了实现control,logic,data的分离的方法,也引出了泛型编程和函数编程,那么泛型编程和函数编程具体在语言中该如何进行实现呢?
    1. 函数式编程的实现:
      1. 函数式编程其实还是程序员逻辑角度的不同,并不需要语言、编译器对其进行支持(当然有些语言在设计语法的时候就考虑到了函数式编程,甚至只能进行函数式编程,那么就可以在我们使用函数式编程的时候提供语法层面的便利)
      2. 函数式编程其实就是逻辑的抽象,比过程式这样扁平的设计更加立体,有更多的上下级函数之间的调用封装。
      3. 明白了函数式的思想,那么我们看看代码中具体如何实现函数式呢:
        1. 利用函数编程的三驾马车:filter_map_reduce,把for循环进行函数的封装,隐藏起来。
        2. 递归代替for循环。
        3. 其实,如果将所有的函数式编程的调用过程展开,最终其实还是会变回for循环,只不过由于上下级的调用封装,我们将for循环进行了隐藏,你看不见,并不代表没有,这部分内容其实可以通过map_reduce的实现来看出,map_reduce其实就是通过for循环来实现的。
      4. 为什么拿掉for是实现函数式编程的关键?拿掉之后对有什么效果?
        1. 一般来说,for循环中for本身是control部分,而是其中执行的操作是logic部分,因此与我们要分离control和logic的初衷所违背,成为重灾区
        2. 处理方法是,将for循环按这两部分进拆分:循环部分让map/reduce这些控制来实现,而logic部分作为control部分的参数进行传入。通过这样就实现了control和logic的分离
    2. 而实现泛型,不仅需要我们程序员逻辑代码上的改变,也需要语言本身、编译器对齐进行支持才可以实现。