返回

unicloud云开发进阶49-项目33 封装公共函数简化代码

后端

unicloud云开发进阶49-项目33 封装公共函数简化代码。在这一系列中,我们讨论过云函数的很多特性,包括执行超时的控制,长轮询、设置内存大小和异步处理、错误监控、环境变量的使用,甚至引入日志管理。在这一篇中,我们来讲解一下如何封装云函数的公共函数,让同一个函数中不同的地方能使用同样的代码。特别是在计算代码中,这是经常会被用到的技巧。

我们先看看前面文章中的一个例子,这个例子中,当我们计算一个子数组的和,我们需要确定从哪个位置开始计算到哪个位置结束,在代码中,我们可能会这样写:

// 长度为n的数组nums
// 起始和结束位置分别为L和R
int sum(int L, int R){
    int total=0;
    for(int i=L; i<=R; ++i){
        total+=nums[i];
    }
    return total;
}

如果我们的子数组会经常变化,我们可能会写一个这样的主函数:

int main(){
    int L=1, R=4;
    int ans=sum(L, R);
    L=0, R=2;
    ans+=sum(L, R);
    return ans;
}

我们发现对于sum这个函数来说,其实L和R是可变的,但是对于sum函数来说,它本身是没有这些变化的,在任何情况下,它只要实现一个功能就是计算给定子数组的和。

我们想想,对于很多类似的功能来说,有时候仅需要改变函数的某些参数,但是对于函数本身来说,它并不需要进行修改。这种情况下,其实我们只需要定义一个公共函数,将这个功能提取出来就行了。

前面那个例子中,我们其实只需要定义一个这样的公共函数:

int sum(int nums[], int n, int L, int R){
    int total=0;
    for(int i=L; i<=R; ++i){
        total+=nums[i];
    }
    return total;
}

然后主函数就不需要改动,只要把sum函数改成sum(nums, n, L, R)就可以了。

这就是函数封装的好处,方便了代码的修改。

代码优化

我们还可以对这个代码做一些小的优化,让它的效率有所提高,首先是让LR从0开始,那么,就可以减少一部分判断语句,直接从数组中取数,不过,这就要求数组必须有至少一个元素,否则会越界。但是,实际上,在前面的文章中,我们已经见过,云函数必须传一个event对象进来。

event对象中有很多东西,不过,对于我们来说,最需要的是query对象,因为query对象中就包含了所有的查询参数,所以,对于一个给定子数组来说,我们只需要这样写:

string query=event["query"];
vector<int> qs=split(query, ',');
int L=qs[0], R=qs[1];

就可以获取到L和R的值了,然后我们只要修改一下sum函数就可以:

int sum(int nums[], int n, int L, int R){
    int total=0;
    for(int i=L; i<=R; ++i){
        total+=nums[i];
    }
    return total;
}

这样,整个函数看起来就会简洁很多。

int main(){
    string query=event["query"];
    vector<int> qs=split(query, ',');
    int L=qs[0], R=qs[1];
    int ans=sum(nums, n, L, R);
    return ans;
}

封装的好处

封装的一个最主要好处是让代码看起来更加整洁,另外,在开发过程中,如果使用得当的话,可以大大减少代码量的,像我们前面这个例子,我们如果想要使用sum函数的话,只需要调用sum(nums, n, L, R)就可以,整个函数看起来就会更加清晰,另外,因为我们不需要重复书写sum函数,节省了代码量,整体来说,降低了代码的复杂度。

另外,由于每个函数都只承担特定的任务,所以在修改代码的时候,也会更加容易定位到修改的地方,这也是封装的好处之一。

最后,封装也是函数复用的基础。

本文同步发表于我的博客,点击这里可查看。