最近,我在C++中做了越来越多的FP,主要是以函数模板和lambda的形式,以及单个函数名的重载。对于一些定义良好的操作,我非常喜欢FP,但我也注意到,与OOP一样,如果不小心(例如循环依赖关系,这对于基于状态的代码来说,这是一个更大的问题),就很容易陷入意大利面代码的反模式。
我的问题是,当考虑添加新功能时,您如何决定是使用FP范式还是OOP范式?
我感觉到这可能与识别问题或设计中的不变量有关,但我不确定。
例如,如果没有OOP模型/真实世界的简化,那么狗或猫类是什么(它的状态是什么?)它的方法是什么?)Otoh,从一个FP POV,一个Eat()函数简单地允许一个动物把食物变成池和能量。很难想象(至少对我来说)吃东西是什么。
我正在寻找更多的C++答案,但是这个问题可以适用于任何语言中能够处理多个范例的子模块。
发布于 2012-12-24 11:50:01
我认为OOP是最好的,当你说你不能随意破坏和重新创作,或者这是一个糟糕的模型--例如,如果你考虑3D渲染,那么渲染器的状态就不会被破坏和重新创建,如果你的表现是自杀的,那么每个帧。
在C++中,您需要添加一个事实,即它没有垃圾收集,而且许多FP技术依赖于这种技术来获得远程可接受的性能。
Otoh,从一个FP POV,一个Eat()函数简单地允许一个动物把食物变成池和能量。很难想象(至少对我来说)吃东西是什么。
这完全等同于OOP变体。没有任何意义的区别
struct Animal { ... };
std::tuple<Poop, Energy> Eat(Animal*, Food);
和
class Animal {
public:
std::tuple<Poop, Energy> Eat(Food);
};
一种功能上的变异会让一只吃了东西的新动物回归。
通常,我递归地划分我的程序以获得模块/子模块/类/函数和成员函数,然后我经常尝试在可能的情况下实现这些函数或成员函数。
https://softwareengineering.stackexchange.com/questions/180522
复制相似问题