Это может быть очень запутанным несколько раз. Я ежедневно борюсь с одними и теми же вопросами, но хорошо, что вы об этом думаете. Я активно занимаюсь использованием принципов SOLID вместе с моей практикой TDD. Одна вещь, которая кажется, что вы не думаете о том, кто будет использовать ваш модем, модульные тесты и фактических пользователей объектов в коде.
В моем сознании это работает так. Модем несет ответственность за набор, вешение, отправку и получение данных, так что это функции, открытые пользователю вашего API (за исключением Receive), будь то ваши модульные тесты или ваш пользователь кода. Поэтому существовало бы следующее.
IModem.cs
interface IModem
{
public bool Connect(); // Seen in your code as dial
public void Disconnect(); // Seen in your code as hangup
public void SendData(); // Take data as parameter
// Receive will not be public, instead I would make it call out to the user saying "I have received data for you"
}
Это четко указано, что ответственность вашего модема объекта является Connect, Disconnect и передачи данных, где она должна идти. Теперь, является ли модем соединением и коммуникацией другой вопрос. Я бы сказал, что то, что у вас есть с модулями SimpleConnection и SimpleCommunication, идеально (я бы немного изменил наименование)). Соединение становится IConnectionModule и Communication становится ICommunicationModule, а также некоторыми изменениями имени функции. наберите «Подключить», «Отключить связь» и «Отключить» и отправить в SendData. Имея это в виду, я принимаю следующий подход.
Ответственность моего модема: Мой модем будет использовать модули он имеет для подключения пользователя к удаленному хосту, а также отключиться от хоста или отправить любые данные, необходимые. Затем приведенное выше определение приводит к следующему коду.
Modem.cs
class Modem : IModem
{
private IConnectionModule _connectionModule;
private ICommunicationModule _communicationModule;
public Modem(IConnectionModule connectionModule, ICommunicationModule communicationModule)
{
_connectionModule = connectionModule;
_communicationModule = communicationModule;
}
public bool Connect()
{
bool connectionSuccess = _connectionModule.Connect()
return connectionSuccess;
}
public void Disconnect()
{
_connectionModule.Disconnect();
}
public void SendData()
{
_communicationModule.SendData();
}
}
Глядя выше, вы можете раскладывать обязанности следующим образом:
Модем: Служит в качестве моста между пользователем API, что позволяет пользователя для отправки и получения информации.
Подключение модуля: Подключение модема к хосту (Пользователь никогда не будет использовать это, только пользователю использовать это будет это блок тестовый набор и модем)
Модуль связи: Передает информацию к уже подключенному хосту (пользователь никогда не будет использовать его, единственным пользователем, которым он будет пользоваться, будет его комплект модульных тестов и модем)
Причина «скрытия» модулей от пользователя заключается в том, что ни один пользователь из модем должен знать, какой модуль подключения используется. Все, что вам нужно сделать, это вызвать Connect/Disconnect и предоставить функциональность. Все остальное должно быть «невидимым». Опять же, это зависит исключительно от вашего стиля разработки, но я всегда стараюсь держать вещи красиво отделенными и следить за тем, чтобы у меня всегда было одно действие за звонок. Независимо от того, обрабатывается ли он другим объектом или выполняется внутри самого класса.
Надеюсь, это поможет, дайте мне знать, что вы думаете, я всегда за обсуждения конструкций и принципов SOLID.
Вы можете сделать то и другое. Но что лучше в ВАШЕМ мнении? Я бы предложил использовать первое решение, чтобы обернуть их внутри класса модема – MajkeloDev
@MajkeloDev Спасибо за ваш повтор, но теперь я не понимаю, как класс модема wraping Интерфейсы связи и подключения отличаются от оригинального класса модема в перспективе SPR? – vilshadov