我有一个简单的FTP类,负责通过cURL库下载和上传:
class FTPClient
{
public:
explicit FTPClient(const std::string& strIPAddress);
virtual ~FTPClient();
bool DownloadFile(const std::string& strRemoteFile, const std::string& strLocalFile);
bool UploadFile(const std::string& strLocalFile, const std::string& strRemoteFile);
private:
static size_t WriteToFileCallBack(void *ptr, size_t size, size_t nmemb, FILE *stream);
static size_t ReadFromFileCallback(void* ptr, size_t size, size_t nmemb, FILE *stream);
std::string m_strUser;
std::string m_strPass;
std::string m_strIPAddress;
std::string m_strPort;
mutable CURL* m_objCurlSession;
};
由于它是项目的基础和核心,并且已在许多部分使用,因此我就如何更好地实施和更好地组织结构提出了一些建议。 有人告诉我使用cURLWrapper类包装所有cURL调用(curl_easy_setopt(..)),但随后有人告诉我为FTP类创建一个接口,这是一个cURLWrapper,它仅调用FTP方法并然后是一个具体的类..但对我来说仍然太抽象了,不了解实现它的最佳方法以及遵循的路径。
您将如何处理这种小结构?
答案 0 :(得分:0)
为您的FTP类定义一个简单的界面:
class IFTPClient
{
public:
virtual ~IFTPClient();
virtual bool DownloadFile(const std::string& strRemoteFile, const std::string& strLocalFile) = 0;
virtual bool UploadFile(const std::string& strLocalFile, const std::string& strRemoteFile) = 0;
};
我假设您的静态回调方法正在回调某些类实例,而不是单例?那很好从界面派生您的课程:
class FTPClient:IFTPClient
{
...
我注意到您已经将IP地址传递给了构造函数,并在其他地方定义了其他参数(用户名,密码,端口等)。这似乎还不太一致。您需要对其进行重构,以便可以通过接口方法设置这些参数或将其添加到上载/下载方法中。
先构造FTPClient
对象,然后再将其传递到其他地方,然后仅将接口传递(“注入”)到要使用FTPClient
的对象中。对于不使用实际FTPClient
的单元测试,请构造一个从相同接口派生的模拟对象,并将其注入其他对象中。
其他对象仅利用接口中公开的功能,而无需了解或担心其内部实现;如果您决定使用curl
或其他内容,则完全取决于FTPClient
。
简而言之;您可能想在Internet上搜索依赖项注入和框架,但是不需要遵循依赖项注入原则的框架,我认为,对于简单的项目来说,它们可能会显得过时。