C++ 松散类耦合与数据访问
我试图实现一个复杂的类,它的构造需要一个条件的规范,这个条件允许构造函数确定对象何时被构造。例如,考虑:C++ 松散类耦合与数据访问,c++,oop,loose-coupling,C++,Oop,Loose Coupling,我试图实现一个复杂的类,它的构造需要一个条件的规范,这个条件允许构造函数确定对象何时被构造。例如,考虑: class RigidBody { private: std::vector<double> trajectory_; // Other stuff... public: RigidBody(std::unique_ptr<TerminateCondition>, std::vector<doubl
class RigidBody
{
private:
std::vector<double> trajectory_;
// Other stuff...
public:
RigidBody(std::unique_ptr<TerminateCondition>, std::vector<double> const &);
// Other stuff...
};
类刚体
{
私人:
向量轨迹;
//其他东西。。。
公众:
刚体(std::unique_ptr,std::vector const&);
//其他东西。。。
};
以下是构造函数的外观:
RigidBody::RigidBody(std::unique_ptr<TerminateCondition> condition, std::vector<double> const &p)
{
int n = 0;
while(!condition->Done( /* Signature */))
{ n++;
/* Do other stuff... */
// such as, trajectory_.push_back(sin(n * dt));
}
}
RigidBody::RigidBody(std::unique_ptr条件,std::vector const&p)
{
int n=0;
而(!条件->完成(/*签名*/))
{n++;
/*做其他事情…*/
//例如,轨迹推后(sin(n*dt));
}
}
我把TerminateCondition
想象成一个抽象类
需求1:访问刚体
成员
我希望类TerminateConditionatTest:public TerminateCondition
能够使用轨迹
,这样我就可以在诸如std::abs(traction.back()-轨迹0])Done(…)
将向量常量&
作为输入参数并将轨迹
传递给它
Demand 2:灵活性,签名为Done(…)
我可能希望class TerminateConditionNumSteps:public TerminateCondition
在n>1000时标记Done
,或者类似的东西。基本上,我可以使用一些灵活性,其中的/*签名*/
如何实现这样的设置,其中TerminateCondition->Done
可以使用刚体
构造函数范围内可用的各种变量集,例如轨迹
之类的私有成员或n
之类的局部变量
我只是在寻找建模循环终止条件的终极灵活性。抽象类似乎不允许灵活地使用输入参数签名。另一方面,抽象类似乎是唯一允许我在运行时指定条件的东西
谢谢。这只是我的想法。也许你想用这样的东西
class TrajectoryCreator
{
public:
virtual vector<float> create(const vector<float>& path) = 0;
}
class TrajectoryCreator
{
公众:
虚拟向量创建(常量向量和路径)=0;
}
然后,您可以创建所需的特定轨迹:
RigidBody( TrajectoryCreator& t, const vector<float> &p)
: trajectory_(t.create(p))
{}
刚体(轨迹生成器&t、常量向量&p)
:轨迹(t.create(p))
{}
此解决方案的主要思想是在单独的类中创建轨迹的移动逻辑,涉及1:您也可以传递一个工厂对象,该工厂对象将从此
创建刚体
中的正确条件,即具有完全刚体
访问权限(即公共
)关于2:使用一个抽象的基本条件基本上说:“我们是否完成,将根据下面的签名来确定”。如果你不想这样,也许你需要一个轨迹工厂,它会自动决定是否完成。最后,一般来说:似乎你有一个界面(刚体
),它的结构你不想分离/模块化。为什么不这样做呢?精确地说:添加类RigidBodyConstructionInfo
,根据该类可以构造RigidBody
。反过来,RigidBodyConstructionInfo
可以从一些工厂接口构建,这些工厂接口的实现可能依赖于运行时的内容。