Создание класса UserConfiguredCommunicationModule
(состав предпочтений перед наследованием)
public class UserConfiguredCommunicationModule : ISendOut
{
public UserConfiguredUserModule(SerialPort serial, WirelessModule wireless)
{}
public void Send(string data)
{
if (UserIdentity.Current.PrefersSerial)
serial.Send(data);
else
wireless.Send(data);
}
}
Использование этой реализации предотвратит взлом OCP (хотя сам класс нарушает OCP, но это легко исправить с помощью фабрики в нем).
Обновление
Вы знаете, что с этим не так? Я хочу дать возможность пользователю выбрать метод отправки данных в пользовательском интерфейсе. Теперь представьте, что у нас будет гораздо больше методов отправки, то есть отправки через инфракрасный порт или ... поэтому, позволяя пользователю выбирать между различными методами, я должен иметь в своем пользовательском интерфейсе утверждение if, которое будет нарушать OCP. Потому что каждый новый тип рассылки заставляет меня иметь новое условие if / else
Мой подход переносит нарушение OCP только в один класс, а не в каждое место, где используется интерфейс ISendOut
.
Я также упомянул фабрику, в которой я имею в виду фабричную модель (ни абстрактная фабрика, ни фабричный метод). Вы можете использовать его для сопоставления между строками конфигурации и конкретными классами и использовать эту фабрику внутри UserConfiguredCommunicationModule
для создания правильной реализации ISendOut
.
Вы также можете использовать шаблон локатора службы в UserConfiguredCommunicationModule
для определения правильной реализации.
Эта точка не имеет значения, что вы выбираете, вам нужен UserConfiguredCommunicationModule
аналогичный класс для инкапсуляции процесса выбора.