包装器类设计和依赖项注入

时间:2019-04-04 07:09:50

标签: c++ oop wrapper

我有一个简单的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方法并然后是一个具体的类..但对我来说仍然太抽象了,不了解实现它的最佳方法以及遵循的路径。

您将如何处理这种小结构?

1 个答案:

答案 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上搜索依赖项注入和框架,但是不需要遵循依赖项注入原则的框架,我认为,对于简单的项目来说,它们可能会显得过时。