新的代码组织形式

Posted mrzhu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了新的代码组织形式相关的知识,希望对你有一定的参考价值。

  在介绍新的代码组织形式之前,我想先介绍一下 现存的被广泛认可的编程模式。

 

  面向对象编程:

    面向对象开发的提出是为了解决过程式开发项目难以维护的问题,因为过程式开发中没有对象的概念,导致 所有的业务逻辑都是一坨一坨的代码,面向对象开发的解决方式是引入了对象的概念,把一个业务逻辑抽象为不同对象之间的交互过程,因为面向对象,我们首次发现 代码本身是有角色划分的,每一段代码都有其存在的意义,于是,我们按照面向对象的思想去开发项目,遵循面向对象的开发原则,采用面向对象的模式 去处理对象之间的关系。之前过程式开发过程中难以维护的问题暂时的解决了大部分。

  函数式编程:

    函数式地提出是为了解决命令式代码难以维护的问题,因为面向对象只是解决了宏观部分的问题,具体到每一个函数,每一个功能,我们还是会按照命令式的思维去编写代码,在遇到多层回调,多重判断的一个大的业务逻辑的写出来的是一大坨代码,函数式开发是指以函数的思维去考虑问题,把一大段业务逻辑抽象为一个数据经过多个函数的处理后转化为业务逻辑希望的数据,这样一大坨代码就变为多个函数的组合,当新的需求出现的时候,我们可以直接替换里面的部分函数或者重新组合函数即可。同时函数式编程还提出了纯函数的概念,无副作用 都对提高程序的稳定性有很大的帮助。

  响应式编程:

    响应式开发是为了解决异步问题,同步代码看起来很舒服,因为它符合人的正常习惯,但是异步问题的处理就比较棘手,我们不得不加上回调函数以等待异步完成,这在一个项目中存在大量的异步问题的时候会是一个问题,而响应式编程的解决方案是去掉异步的概念,增加了事件流的概念,在响应式编程中只有事件,程序唯一要做的事情就是注册事件监听程序,然后在事件监听程序中处理该事件。网络请求的返回值是一个事件,鼠标点击是一个事件,文件读取的返回值是一个事件,所有的所有都是事件,在每一个事件中,当事件触发的时候,会把数据传送给所有的注册程序,数据从事件流向多个注册该事件的程序 形成一个数据流,最终数据走完所有的注册程序,而程序也完成了数据处理。

 

  上面的三个编程思想都得到大量的认可,他们之间谁也不会替代谁,因为每一个编程思想的提出不是为了解决所有问题,而是问了解决特定问题,所以糅合了上面三种思想的一种新的编程思想是不是会比 上面三种思想更优秀呢?我们先简单将每个思想的优缺点给抽出来,然后进行互补。

  

    面向对象编程只能定义对象是什么,但是无法定义对象的交互:

      面向对象思想的基石是建筑学,整个面向对象思想基本上是建筑学在编程界再一次运用,但是我们应该思考一下,我们可以用建筑学创造出自然吗?答案是不能的,建筑学创造出来的 东西大部分是死板的 ,他之所以存在是因为首先在我们心中存在了,然后我们按照我们心中的模样把这个建筑给创造出来。正是因为他出现前就已经被定义好了,所以导致其部件之间关联太严重,虽然面向对象提出了低耦合概念,但是当我们用面向对象思想去设计系统的时候,对象之间复杂的交互无形中增加了系统的复杂度,我意思是虽然在物理层面我们的代码实现了低耦合,但是在数据层面(数据依然毫无规则的流窜于不同的对象)依然是混乱的。面向对象解决的是代码物理层面的组织问题,却没有解决数据层面的混乱问题。

    函数式开发重在微观:

      函数式开发在微观层面分解了一段业务逻辑,换句话说,函数式开发将一段陈述句分解为 主谓宾动词 的组合,这样的组合 易于维护,但是它只适合微观层面。

    响应式开发重在解决混乱的数据流:

      响应式开发重新定义了编程世界里面的角色,在这里,只有事件和事件的注册程序,数据从事件出来,然后到达处理程序,所以的一切直观,易懂,并且没有烦人的异步,但是响应式编程 也只是解决这一个问题,代码的组织问题 它并没有涉及。

 

  所以综合起来,新的编程模式会不会是这样:

    通过面下对象解决宏观层面代码的组织问题,使用函数式开发解决微观层面代码的组织问题,使用响应式开发解决数据流混乱的问题,下面是具体的实施步骤:

    

    1:去掉面向对象中关于对象交互的部分,面向对象只解决对象的定义问题,我们可以通过组合 继承实现更加复杂的对象,但是所有的交互(包括兄弟对象交互,父子对象交互) 暂时放下。

    2:使用中介者模式解决对象的交互问题。

    我可以用现实世界的许多例子来描述上述的关系,比如说 原子世界:原子世界分为原子核和电子,所以原子由原子核和电子两个对象组成,电子围绕原子核旋转,如果以面向对象的思维来开发,电子必然引用了原子核,表示该电子围绕该原子核旋转,但是我们看到这里,原子核和电子都是原子的子元素,但是电子却引用了原子核,这是因为 这种相互引用的问题,使得数据流变得混乱(把原子世界放大100倍,可以想象对象之间错综复杂的关系),如果以响应式编程的思维来描述交互:因为一切都是事件,所以电子不必引用原子核以描述这段旋转关系,假设原子核发出一个事件,原子核能量变强(这是一个事件),然后原子核在原子世界广播了这个事件,而原子之前已经注册了 该事件,所以电子会做出反应,他的反应就是旋转加快。注意:原子核能量变强,电子旋转速度加快,这是一段业务逻辑,我们实现了这段业务逻辑,但是却不存在对象互相引用的关系,把原子核的世界比喻为我们的世界,然后运用刚才的那中流程,我们实现定义了无数个对象,然后每一个对象都可以广播事件,同时可以注册事件,这样每个对象之间除了有父子之间的包含关系,没有了因为业务逻辑而短暂存在的依存关系,这使得维护变得简单,当我们希望增加一段需求的时候,我们不必 先理清楚每个对象之间的关系,我们只需要发出事件,然后让其他的对象注册事件处理程序即可。

    3:而函数式开发依然是很好的补充,因为函数式开发使得在微观层面的代码的可置换性大大提高,同时因为纯函数的引入,使得我们可以判断出一段代码的纯度(一段代码有多个经过测试的纯函数组成,那这段代码本身也是纯的,如果其中有部分副作用代码,说明这段代码的纯度较高,一段代码中 经过测试的纯函数的比例 就是这段代码的纯度)。

  

  面向对象-响应式-函数式编程:通过面向对象的技术构造出对象,然后使用响应式编程的思想描述对象之间的交互,通过函数式开发提高代码的纯度和可置换性。

    

以上是关于新的代码组织形式的主要内容,如果未能解决你的问题,请参考以下文章

闲扯Maven项目代码组织形式

深入浅出Blazor webassembly之razor组件的C#代码组织形式

项目管理的形式

数据的组织形式谁更理想

为啥内存是以堆的形式组织的?

以数组形式组织的 PHP Zip 存档