OOD和责任

时间:2011-11-11 20:30:57

标签: c# oop single-responsibility-principle

我想我已经在这个领域工作了很长一段时间,但有时简单的事情让你自己质疑......决定一个班级有什么责任,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);

您是否使用Controller / Manager类型的类?如果没有,消息如何知道如何发送自己?

5 个答案:

答案 0 :(得分:1)

只需查看.NET框架本身,看看它是如何完成的,每个对象应该只有一个reponsiblity:

        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);

答案 1 :(得分:0)

我会说第二个例子更好。什么消息与发送有关? 发送到哪里?如何?这引发了太多的问题,这应该是首先令人担忧的事情,这不是事情应该如何运作的方式。

另一方面,例如。 MessagingSystem.SendToCustomerInbox(Message message)完全表明了它的作用。将消息发送到客户收件箱。我们在第一种情况下会问自己的所有问题都非常清楚。

消息本身更像是一种数据表示形式,这将是它的唯一责任。与消息发送服务相同 - 它的职责是发送消息,仅此而已。

答案 2 :(得分:0)

可能不仅有黑色和白色,所以任何混合的方法可能不是最佳的,对每个身体都是最好的,在某些情况下可以起作用而在其他情况下不起作用。

我的开始考虑是,如果消息只包含一些数据,并且可以以不同的方式(异步,同步......)或通过不同的渠道(电子邮件,寻呼机,wcf,tcp,传真,语音...)发送然后消息类责任只是保存数据,并且会有像MessagingManager这样的管理器或其他类,它们将知道如何处理消息,如何发送消息以及如何接收消息。

正如我所说,对于每个案例解决方案,可能都没有完美或最佳。

答案 3 :(得分:0)

大自然有解决方案。如果我们关注现实世界,消息(电子邮件,信件,短信......)不会自行发送,但需要设备,控制器,管理员或实用程序将其发送出去。所以我想我会找一个知道如何发送消息的控制器/经理/实用程序类。

答案 4 :(得分:0)

根据您的要求,两种设计都很好。这是一个简单易用与解耦的问题

只需看看Active RecordData Mapper模式之间的区别。它与你的例子大致相同。