首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++设计:函数式编程与面向对象编程

C++设计:函数式编程与面向对象编程
EN

Software Engineering用户
提问于 2012-12-24 10:42:02
回答 1查看 3.7K关注 0票数 7

设计问题

最近,我在C++中做了越来越多的FP,主要是以函数模板和lambda的形式,以及单个函数名的重载。对于一些定义良好的操作,我非常喜欢FP,但我也注意到,与OOP一样,如果不小心(例如循环依赖关系,这对于基于状态的代码来说,这是一个更大的问题),就很容易陷入意大利面代码的反模式。

我的问题是,当考虑添加新功能时,您如何决定是使用FP范式还是OOP范式?

我感觉到这可能与识别问题或设计中的不变量有关,但我不确定。

例如,如果没有OOP模型/真实世界的简化,那么狗或猫类是什么(它的状态是什么?)它的方法是什么?)Otoh,从一个FP POV,一个Eat()函数简单地允许一个动物把食物变成池和能量。很难想象(至少对我来说)吃东西是什么。

我正在寻找更多的C++答案,但是这个问题可以适用于任何语言中能够处理多个范例的子模块。

EN

回答 1

Software Engineering用户

发布于 2012-12-24 11:50:01

我认为OOP是最好的,当你说你不能随意破坏和重新创作,或者这是一个糟糕的模型--例如,如果你考虑3D渲染,那么渲染器的状态就不会被破坏和重新创建,如果你的表现是自杀的,那么每个帧。

在C++中,您需要添加一个事实,即它没有垃圾收集,而且许多FP技术依赖于这种技术来获得远程可接受的性能。

Otoh,从一个FP POV,一个Eat()函数简单地允许一个动物把食物变成池和能量。很难想象(至少对我来说)吃东西是什么。

这完全等同于OOP变体。没有任何意义的区别

代码语言:javascript
运行
复制
struct Animal { ... };
std::tuple<Poop, Energy> Eat(Animal*, Food);

代码语言:javascript
运行
复制
class Animal {
public:
    std::tuple<Poop, Energy> Eat(Food);
};

一种功能上的变异会让一只吃了东西的新动物回归。

通常,我递归地划分我的程序以获得模块/子模块/类/函数和成员函数,然后我经常尝试在可能的情况下实现这些函数或成员函数。

票数 3
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/180522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档