写点什么

「编程模型」C++ 组合逻辑

用户头像
顿晓
关注
发布于: 2021 年 04 月 07 日
「编程模型」C++组合逻辑

引子

C++中可以用来表达逻辑的有下面几种方法:


  • 函数,这里专指自由函数「free function」,也称非成员函数,可以自由调用

  • 方法,这里专指成员函数,通过对象来调用

  • Lambda,指「Lambda」表达式,也称匿名函数,或「in-place functions」,一般配合闭包,可以自由调用

场景

业务的逻辑就是由上面的几种方法实现单个拼图,然后再组合起来,最终实现完整的功能。


当然,业务逻辑怎么拆分成单个拼图,也是个大问题,而且不仅仅是技术问题,这里我们尝试通过「技术上有哪些组合逻辑的方式」来为逻辑拆分提供帮助。

解决方案

封装单个拼图

  • 从复杂度来说,小规模逻辑(3 行以内代码)先用 Lambda 实现,大规模逻辑定义成函数或方法;

  • 从复用度来说,只有一处调用的代码先用 Lambda 实现,需要多处调用复用时再提取出函数或方法;

  • 从稳定度来说,易变化的代码先用 Lambda 实现,功能发布后趋于稳定的代码可以提取成函数或方法;

  • 从表达力来说,如果 Lambda 的实现不够直观表达逻辑的意图,最好定义一个函数或方法来表达其意图。

独立逻辑的组合

最简单的情况就是顺序调用多个逻辑,组合到新的函数、方法或 Lambda 中。

逻辑关系的组合

这种情况下,每段逻辑的返回值是逻辑值「true」和「false」,然后通过逻辑运算符组合完成需要的逻辑。


常用的组合方式有:any、all、none。

管道式组合

每段逻辑的输入输出具有依赖关系,前一段逻辑的输出做为后一段逻辑的输入。

组合逻辑应用于迭代处理

迭代处理的逻辑特点就是:输入输出是

将逻辑应用于数据

C++11 有个神器std::function,可以用来保存任何Callable目标,上面提到的逻辑表达方式只是其中比较常用的几种。


#include <iostream>#include <vector>
using namespace std;
bool isMultipleOf2(int n){ return (n % 2) == 0;}
bool isMultipleOf3(int n){ return (n % 3) == 0;}
std::ostream& operator<<(std::ostream& os, const std::vector<int> &input){ for (auto const& i: input) { os << i << " "; } return os;}
int main(){ auto const numbers = std::vector<int>{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; auto results = std::vector<int>{};
cout << "orig: " << numbers << endl; std::copy_if( begin(numbers), end(numbers), back_inserter(results), [](int number){ return isMultipleOf2(number) || isMultipleOf3(number); }); cout << "MultipleOf: " << results << endl;}
orig: 1 2 3 4 5 6 7 8 9 10 MultipleOf: 2 3 4 6 8 9 10
复制代码


发布于: 2021 年 04 月 07 日阅读数: 19
用户头像

顿晓

关注

因观黑白愕然悟,顿晓三百六十路。 2017.10.17 加入

视频号「编程日课」 知识星球「俺的死党顶」

评论

发布
暂无评论
「编程模型」C++组合逻辑