Я работаю над приложением, нижний уровень которого состоит из устройства связи ввода-вывода (скажем, последовательного порта).
Чтобы создать более ценный инструмент с минимальными усилиями, на соседние уровни не должны влиять изменения среды связи (например, Ethernet или USB). Это утверждает, если я не ошибаюсь, использование принципа инверсии зависимости, среди других. Я посмотрел на примеры.
class DataIOClient
{
public:
DataIOClient(void){}
~DataIOClient(void){}
virtual void WriteData(DataIOClientData* data) = 0;
virtual void ReadData(DataIOClientData* data) = 0;
};
Этот интерфейс вместе с соответствующей реализацией (которая будет зависеть от выбранной архитектуры связи) должен отделить мой верхний уровень от уровня связи.
Однако я столкнулся с проблемой инициализации. Поскольку каждая из архитектур запрашивает разные параметры инициализации (например, 9600 8N1 в COMPort или 192.168.1.2 в Ethernet или LPT1 для связи через параллельный порт), я не могу выяснить схему зависимости или основную абстракцию, чтобы сделать ее осуществимой.
Если бы DataIOClient априори «знал» входные параметры, которые запрашивает реализация, он был бы связан и больше не инвертировался, я прав? У меня нечеткое ощущение, что я неправильно понимаю правильное применение этого принципа.
Спасибо
Похоже, текстовый файл конфигурации вместе с параметрами должен работать; Вы анализируете конфигурацию и вызываете подходящую заводскую функцию:
.конфигурации:
IOClient = { type = "ethernet", config = { host = "12.34.56.78", port = "8080" } }
IOClient = { type = "usb", config = { } }
IOClient = { type = "serial", config = { device = "/dev/modem" } }
creator.cc:
item = read_tuple("IOClient");
std::unique_ptr<DataIOClient> = factory.create(item["type"], item["config"]);
Других решений пока нет …