Skip to content

复杂函数设计与治理-分治法 #41

@stack-wuh

Description

@stack-wuh

复杂函数设计与治理-分治法

在项目中,经常会遇到的一种情况,就是大段大段的逻辑代码,各种各样的逻辑全局集中到了主函数的内部,在上一次的【盘活运力】的review中,我给大家描述了一下,我是怎么处理大段逻辑代码的,这里是记录性质的博客。

对于可复用性要求较高的公共函数、公共文件的封装或者是逻辑的处理。可以对比去看一下重构之前的代码,大段的逻辑代码集中在一个函数内部,导致一个函数的逻辑杂糅,一个方法甚至有几百行,这都是需要优化的地方。

从我个人的经验来看,对于公共方法,有以下几个关键点:
高灵活性
高区块性
高责任性

高灵活性
其实,灵活性就是可扩展性。

我们在写公共的函数的时候,无论是mixin文件还是utils工具文件,都要做到的一点就是,一定要操作空间,一旦这个函数内部的逻辑不满足了,还可以通过外部传入的逻辑,来实现我的最终目的,而不用改动公共函数的内部代码。

怎么留足操作空间呢?就是在关键的逻辑位置提供一个函数,可以满足外部传入的需求。

高区块性
区块性,就是说将一大段函数逻辑,拆分为若干个逻辑片段。

既然是逻辑杂糅了,那就必然可以将一段杂糅的逻辑切片成多段逻辑,然后按照执行的顺序依次执行,到了最后的结果就是将多段函数的执行结果就是大函数的执行结果,这种方法就叫分治。

高责任性
指函数职责的单一性要强,对于公共函数一定要做到,一个方法一个功能。

对于单一职责我们一直放在嘴边,但是完成的力度一直不够,我们可以回想一下现在的代码,很多情景下,对于多个地方用到了相同的公共函数的位置,经常会来新声明一个函数。而这个新函数的作用就是将多个公共函数放在一起,然后在页面上就调用这个新函数。

对于这个新函数,你能说它职责单一了吗?

一旦遇到了特殊场景,大部分开发人员就会在新函数内部,使用各种if/else的逻辑判断来执行对应的函数,随着迭代次数越来越多,逻辑越来越复杂,新函数就成了另一个杂糅函数,换一句话说,它不纯了。

分治法
分治法,是一种经典的数学算法,取分而治之之意。目的是将一个复杂的问题划分为多个相同或者是相似的小问题,分开解决。

对于具体实现可以看下图代码,文件地址

image
image (1)

这一段是我们经常遇到的处理表格的请求逻辑,它是一个非常典型的、可复用性要求较高的、可分治的案例。

它是一个mixin混入文件,给9个表格业务组件提供了全部的逻辑支持,基本没有出现什么问题。分治点已经标出,大家可以点击文件链接进去自由查看细节。

大家可以仔细看一下,上面说的三点在这个案例中已经全部体现出来了。

对于一个区块内部的逻辑,可以将它分成两块,一部分由函数体内部提供一个默认函数,同时支持外部传入函数,留足了操作空间,灵活性极佳。

每一个区块内部的函数,只管理它负责部分的功能,可以清晰的看到我标出的5个分治点,就是其区块性最好的体现。

现在项目中有大量的业务代码,可以提供给大家练手的机会,可以尽情地去使用分治法。

Metadata

Metadata

Assignees

Labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions