C++ C++;分离数据与逻辑
我之所以希望以这种方式分离,是因为数据是从无到有的,方法可以有数百个依赖项。所有依赖于数据的人都不应该依赖于方法依赖性 我想做一些类似的事情:C++ C++;分离数据与逻辑,c++,design-patterns,architecture,dependencies,dependency-management,C++,Design Patterns,Architecture,Dependencies,Dependency Management,我之所以希望以这种方式分离,是因为数据是从无到有的,方法可以有数百个依赖项。所有依赖于数据的人都不应该依赖于方法依赖性 我想做一些类似的事情: //s_class_name.h struct structName { data m_data } static_cast(&structNameObject)->方法(arg1、arg2、arg3、…、argN); 我发现有两个问题: 1) 打开对数据的所有访问。我想向所有使用struct而不是class操作的人开放数据 2) 静态下
//s_class_name.h
struct structName
{
data m_data
}
static_cast(&structNameObject)->方法(arg1、arg2、arg3、…、argN);
我发现有两个问题:
1) 打开对数据的所有访问。我想向所有使用struct而不是class操作的人开放数据
2) 静态下传未定义
你能给我解释一下,如何更好地实现模式数据和逻辑分离吗
UPD:我有另一个想法,但我无法解释为什么它不好:
1) 在s_class_name.h中,我可以声明模板方法2) 在class_name.h中,我可以实例化模板参数。设计的可能实现: 避免未经授权访问数据表单的一种方法是保护数据:只有从数据结构继承的类才能访问它:
class structName
{
protected: // only classes inheriting from this structure can access the data
data m_data;
};
然后,从数据结构继承的类可以根据需要使用数据:
class className : public structName
{
public:
void method(int arg1) { //using m_data
for (int i = 0; i < arg1; i++)
cout << i << ":" << m_data << endl;
}
};
以下是一些可能的用途:
structName d;
className cn(&d); // creating an object
cn.method(10); // using methods on the data
className(&d).method(3); // throw away temporary object destroyed when expression is evaluated.
// so no need for down-casting anymore.
通过这种设计,可以消除弱点1、4和6。这种方法非常理想,例如,如果您的结构数据是按需从数据库上传的 迪特·吕克,对不起。修正了“我想向所有使用struct操作的类开放数据,但不向类开放数据”的问题。你是说你想向所有使用该数据的类开放数据,并且希望这些数据对类的用户隐藏?我的观点是:逻辑或行为不能用对象(理智地)表达。我的意思是,我想向所有使用该结构操作的人打开该结构的文件。但我想对所有使用该类操作的人隐藏它。“我的意思是,我想向所有使用该结构操作的人打开该结构的文件。但我想对所有使用该类操作的人隐藏它。”我不能对此感到沮丧,因为从形式上讲,如果你想对所有使用该类操作的人隐藏它,你应该去私人继承处。但是再也没有悲观情绪了。另一种方法是使用组合而不是继承(根据
className
不是真正的structName
,但实际上已经-astructName
)的原则,@pvl I添加了一个部分,建议使用组合改进设计。Thx!但我完全不明白-类对象是数据,所以structNameObject
和classNameObject
是相同类型的对象。为什么没有琐碎的转换(为什么在“数据类”和“函数类”之间没有等价关系(不是内在性)?
class className : public structName
{
public:
void method(int arg1) { //using m_data
for (int i = 0; i < arg1; i++)
cout << i << ":" << m_data << endl;
}
};
className c; // if your object was a class before
structName*d=&c;
static_cast<className *>(d)->method(10); // you can downcast
// if your object wasn't a class before, it's UB, but it could probably work if your class has not virtuals and no own data.
struct structName { data m_data; };
class className {
private:
structName *data; // access to your data object
public:
className(structName *d) : data(d) {} // constructor
void method(int arg1) { //using m_data
cout << data->m_data << endl;
}
};
structName d;
className cn(&d); // creating an object
cn.method(10); // using methods on the data
className(&d).method(3); // throw away temporary object destroyed when expression is evaluated.
// so no need for down-casting anymore.