ООД и ответственность - PullRequest
1 голос
/ 12 ноября 2011

Я хотел бы думать, что я был в этой области довольно долгое время, но иногда простые вещи заставляют вас задаться вопросом ... решить, какую ответственность несет класс SRP , и чтотип вещи.

Итак, в контексте системы обмена сообщениями это:

Message m = new Message();
// Some properties set
m.Send();

или

Message m = new Message();
// Some Message properties set...
MessagingSystem ms = new MessagingSystem();
ms.SendMessage(m);

Используете ли вы тип контроллера / диспетчераучебный класс?Если нет, то как сообщение может знать, как его отправить?

Ответы [ 5 ]

1 голос
/ 12 ноября 2011

Просто посмотрите на саму платформу .NET, чтобы увидеть, как это делается, каждый объект должен иметь только одну ответственность:

        SmtpClient client = new SmtpClient();
        MailAddress from = new MailAddress("jane@contoso.com", "Jane Clayton");
        MailAddress to = new MailAddress("ben@contoso.com");
        MailMessage message = new MailMessage(from, to);
        message.Body = "This is a test e-mail message sent by an application.";
        message.Subject = "Test message";
        client.Send(message);
0 голосов
/ 12 ноября 2011

Оба дизайна в порядке, в зависимости от ваших требований.Это вопрос простоты использования и разделения

Просто взгляните на разницу между Active Record и Data Mapper шаблонами.Это почти тот же случай, что и ваш пример.

0 голосов
/ 12 ноября 2011

Мать-природа имеет решение.Если мы посмотрим на реальный мир, сообщение (электронная почта, письмо, смс ...) не отправляет само себя, но для его отправки требуется устройство, контроллер, менеджер или утилита.Поэтому я думаю, что я бы хотел иметь класс контроллера / менеджера / утилиты, который знает, как отправить сообщение.

0 голосов
/ 12 ноября 2011

Вероятно, существует не только черно-белое изображение, поэтому любой смешанный подход, который может быть неоптимальным и лучшим для каждого тела, в одних случаях может сработать, а в других - потерпеть неудачу.

Мое начальное соображение заключается в том, что если сообщение содержит только некоторые данные и может быть отправлено различными способами (асинхронно, синхронно ...) или по разным каналам (электронная почта, пейджер, wcf, tcp, факс, речь ...) тогда ответственность класса сообщений заключается только в том, чтобы хранить данные, и будут такие менеджеры, как MessagingManager или другие классы, которые будут знать, что делать и как обрабатывать сообщение, как его отправлять и как его получать.

Как я уже сказал, вероятно, нет идеального или лучшего решения для каждого конкретного случая.

0 голосов
/ 12 ноября 2011

Я бы сказал, что второй пример лучше.Какое сообщение имеет отношение к отправке? Отправить куда?Как? Это поднимает слишком много вопросов, и это должно быть первым, что настораживает, потому что дело не в том, как все должно работать.

С другой стороны, например.MessagingSystem.SendToCustomerInbox(Message message) прекрасно описывает, что делает.Отправляет сообщение в почтовый ящик клиента.Все вопросы, которые мы задали бы себе в первом случае, совершенно ясны.

Само сообщение - это скорее представление данных, и это была бы его единственная ответственность.То же самое со службой отправки сообщений - ее обязанность - просто отправлять сообщения, не более и не менее.

...