Определите простой интерфейс для вашего класса 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
.
Это в двух словах; Возможно, вы захотите выполнить поиск внедрения зависимостей и сред в Интернете, но вам не нужна среда, которая будет следовать принципам внедрения зависимостей, и, на мой взгляд, они могут быть излишними для простых проектов.