C++11 中 声明式的编程风格
// Set a target Pose auto const target_pose = []{ geometry_msgs::msg::Pose msg; msg.orientation.w = 1.0; msg.position.x = 0.28; msg.position.y = -0.2; msg.position.z = 0.5; return msg; }(); move_group_interface.setPoseTarget(target_pose); // Create a plan to that target pose auto const [success, plan] = [&move_group_interface]{ moveit::planning_interface::MoveGroupInterface::Plan msg; auto const ok = static_cast<bool>(move_group_interface.plan(msg)); return std::make_pair(ok, msg); }(); 这种声明式的风格有什么好处
这种声明式的编程风格,特别是在C++中,具有以下几个好处:
1. 提高代码可读性
通过使用lambda表达式和立即执行的函数对象,代码结构更加清晰,意图更加明确。例如,目标姿态和规划步骤的初始化和设置在一个块内完成,这样读者可以更容易地理解每个部分的用途。
2. 局部变量作用域
在lambda表达式中定义的变量只在lambda表达式的作用域内有效,这有助于避免变量在更大范围内的作用域污染,减少了意外修改的可能性,提高了代码的可维护性。
3. 减少临时变量
声明式风格中直接返回的方式减少了对临时变量的需求,从而减少了代码的复杂度和潜在的错误。通过将初始化和返回值的过程结合在一起,代码变得更加紧凑。
4. 增强代码模块化
每个lambda表达式都可以看作是一个独立的模块,执行特定的任务。这使得代码更易于测试和调试,因为每个模块的行为都是自包含的,可以单独验证。
5. 延迟执行
在某些情况下,声明式风格可以用于延迟执行某些操作,直到实际需要时才执行,这可以优化性能。例如,只有在需要计算规划时才进行规划,而不是在对象创建时立即进行。
6. 捕获上下文
lambda表达式可以捕获所在上下文的变量,使得代码更加灵活。通过捕获move_group_interface
,lambda表达式可以访问并操作该对象,而不需要在更大的作用域内声明和使用它。
具体代码分析
-
设置目标姿态:
- 使用lambda表达式定义并返回一个目标姿态。
- 这种方式使得目标姿态的定义和返回紧密结合,避免了不必要的变量暴露。
-
创建规划:
- 使用lambda表达式进行规划,并返回规划的结果和状态。
- 这种方式确保了规划的逻辑集中在一起,易于理解和维护。
总结
这种声明式的编程风格通过使用lambda表达式和立即执行的函数对象,可以提高代码的可读性、减少变量作用域污染、减少临时变量、增强模块化、支持延迟执行,并灵活地捕获上下文。这些特性使得代码更加简洁、易于维护和理解。