我想创建一个函数对象类,它可以按需在数字上集成一些函数。它的公共接口将包含一个void T::step(double dt)计算积分步骤的方法(并用新值更新函数对象的内部状态)和当前计算值的获取器。
虽然我确信这可以通过纯独立函数来完成,但我将要集成的函数有许多共同的中间计算步骤,并且依赖于许多内部参数,这些参数必须在每个步骤中更新(并且在很大程度上与用户),所以我想到使用函数对象来封装这个机制。
class myIntegrals
{
public:
void step(double dt);
double get_f1_integral() { return f1_integral; };
double get_f2_integral() { return f2_integral; };
private:
// funcs to be integrated (n.b. they share parameter/return types)
double f1(double t); // depends on the state of member attributes;
double f2(double t); // idem, and also on the results of f1
double t;
double f1_integral;
double f2_integral;
// and many internal parameters, updated on every step
}
void myIntegrals::step(double dt)
{
// …Run Code Online (Sandbox Code Playgroud) c++ templates pointer-to-member higher-order-functions c++11
我一直在编写代码来解析和提取机器人发送的消息中的信息。只有几种不同类型的消息,但每一种都包含我感兴趣的截然不同的信息,并且我正在努力寻找将它们作为代码中的对象进行处理的最佳方法。
如果我使用 Haskell,我只需创建一个类型Message并为每种消息定义一个定制的构造函数
data Message = Greeting Foo Bar | Warning Yadda Yadda Yadda | ...
Run Code Online (Sandbox Code Playgroud)
这是一种非常好的、干净的方式,可以将它们全部放在同一个目录下type,并且能够轻松区分消息类型。
如何以 OOP 友好(或者更好,Pythonic)的方式设计对象类来实现这一效果?我想到了两种方法,即:
定义基类Message并为每种消息对其进行子类化。优点:概念上干净。缺点:有很多样板代码,并且它并没有真正使代码变得非常可读或不同消息类之间的关系清晰。
定义一个通用类Message,它代表每种消息类型。它将有一个属性.type来区分消息类型,并且其__init__功能将相应地实例化适合于消息类型的属性。优点:编码简单,实用。缺点:让类的属性如此不可预测似乎是一种不好的做法,而且通常感觉是错误的。
但我对两者都不完全满意。虽然我意识到这只是一个小程序,但我想我将其用作了解更多有关抽象和软件架构的使用的机会。有人能给我指路吗?