我想知道如何将不同的数据源添加到现有代码中。例如,让我们说我有这段代码:
//DataFromFile.cpp
#include "Data.h"
class DataFromFile
{
public:
DataFromFile() { filename = ""; }
~DataFromFile() { delete data; }
void loadValue(const char *filename) { //getting data from a file }
void printData() { data->printData(); }
private:
string filename;
Data *data;
};
//Source.cpp
#include <iostream>
#include "DataFromParameter.h"
int main(int argc, char **argv)
{
DataFromFile oldData;
oldData.loadValue("example.txt");
oldData.printData();
return 0;
}
并且需要创建类DataFromDatabase或DataFromParameter,但不改变DataFromFile的工作方式(此代码在各种程序中使用,并且无法通过其代码)。创建一个界面似乎是一个很好的方法,所以我提出了这个解决方案:
//IData.h
#include "Data.h"
class IData
{
public:
IData() { data = NULL; }
virtual ~IData() = 0 { delete data; }
void printData() { if (data != NULL) data->printData(); }
protected:
Data *data;
}
//DataFromParameter.h
#include "IData.h"
class DataFromParameter : public IData
{
public:
DataFromParameter(const int value) { this->data = new Data(value); }
~DataFromParameter() {}
};
//DataFromFile.h
#include "IData.h"
class DataFromFile : public IData
{
public:
DataFromFile() { filename = ""; }
DataFromFile(const char *filename) { loadValue(filename); }
~DataFromFile() {}
void loadValue(const char *filename) { //getting data from a file }
private:
string filename;
}
正如您所看到的,IData和DataFromParameter是新类,我还向DataFromFile添加了一些方法。创建新对象并调用其方法:
//Source.cpp
#include <iostream>
#include "DataFromParameter.h"
int main(int argc, char **argv)
{
//Source: file (the old way)
DataFromFile oldData;
oldData.loadValue("example.txt");
oldData.printData();
//Source: file (the new way)
IData *newData1 = new DataFromFile("example.txt");
newData1->printData();
delete newData1;
//Source: parameter
IData *newData2 = new DataFromParameter(atoi(argv[1]));
newData2->printData();
delete newData2;
return 0;
}
它有效,但我对此并不满意;特别是DataFromFile类代码看起来很乱 - 我知道为什么它看起来那样,但我相信其他人会非常困惑那里到底发生了什么。
我的问题是:有更好的方式去这里吗?是否有必要(考虑到情况)或者我是否错过了一些明显的问题解决办法?