Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有状态对象的方法中的out参数是否添加了职责?_C#_Design Patterns_Solid Principles - Fatal编程技术网

C# 有状态对象的方法中的out参数是否添加了职责?

C# 有状态对象的方法中的out参数是否添加了职责?,c#,design-patterns,solid-principles,C#,Design Patterns,Solid Principles,我有一个负责发送电子邮件的对象,所以我创建了一个EmailSender,然后告诉它SendEmail,传入一些EmailDetails: string diagnostics; EmailSender sender = new EmailSender(); try { sender.SendEmail(details); //sender.SendEmail(details, out diagnostics); } catch(Exception e) { lo

我有一个负责发送电子邮件的对象,所以我创建了一个
EmailSender
,然后告诉它
SendEmail
,传入一些
EmailDetails

string diagnostics;    

EmailSender sender = new EmailSender();
try
{
    sender.SendEmail(details);
    //sender.SendEmail(details, out diagnostics);
}
catch(Exception e)
{
    logger.log(sender.CurrentError);
}

diagnostics = sender.Diagnostics;
如果我将out参数添加到
sendmail
,这是否增加了可靠设计原则方面的业务责任,因为我现在说:“您必须尝试发送电子邮件,并且您还负责初始化和填充诊断数据”


也许责任不是一个正确的词,但一种模式比另一种好吗?

你没有违反任何坚实的原则,你违反了所谓的:

每个操作要么完成契约并返回有效结果,要么抛出异常


如果您想提供一些关于故障的附加诊断信息,请改为添加自定义异常。如果您与客户之间的合同中包含某些内容,则可以通过输出参数返回此信息。

您没有违反任何可靠原则,您违反了所谓的:

每个操作要么完成契约并返回有效结果,要么抛出异常


如果您想提供一些关于故障的附加诊断信息,请改为添加自定义异常。如果您与客户之间的合同中包含某些内容,则可以通过输出参数返回此信息。

查看您的代码示例,我想知道AOP设计是否合适。您可以使用策略注入来包装对EmailSender(和其他组件)的呼叫

使用策略注入注入到调用中的包装器可以负责捕获和记录抛出的异常,这样调用
sendmail
的代码就不必这样做

包装器还可以负责监视计时、写入跟踪信息等。我只是猜测一下,但这类信息可能与您使用
诊断
属性的目的一致

这样,调用方就不必负责处理/记录异常,也不必负责处理诊断信息。此外,EmailSender不必负责监控自己的性能,也不必通过
Diagnostics
属性公开这些信息


而且,
CurrentError
属性似乎很奇怪。您已经捕获到一个异常,因此似乎更适合捕获包含
CurrentError
属性具有的任何信息的特定类型的异常。

查看您的代码示例,我想知道AOP设计是否合适。您可以使用策略注入来包装对EmailSender(和其他组件)的呼叫

使用策略注入注入到调用中的包装器可以负责捕获和记录抛出的异常,这样调用
sendmail
的代码就不必这样做

包装器还可以负责监视计时、写入跟踪信息等。我只是猜测一下,但这类信息可能与您使用
诊断
属性的目的一致

这样,调用方就不必负责处理/记录异常,也不必负责处理诊断信息。此外,EmailSender不必负责监控自己的性能,也不必通过
Diagnostics
属性公开这些信息


而且,
CurrentError
属性似乎很奇怪。您已经捕获到一个异常,因此捕获包含
CurrentError
属性具有的任何信息的特定类型的异常似乎更合适。

您没有违反单一责任原则-SRP并不意味着对象不应该知道如何与其合作者对话。这是合同的一部分,是自然的责任。如果
EmailSender
不负责报告有关邮件传递的诊断信息,谁会负责


您需要确保的唯一一件事是,
Diagnostics
保持与
EmailSender
相关的粒度级别
EmailSender
不依赖于其消费者,消费者依赖于
EmailSender
,因此,
EmailSender
不应采用消费者形式主义,而应将其自身的语义强加给消费者。

您没有违反单一责任原则-SRP并不意味着对象不知道如何与其合作者对话。这是合同的一部分,是自然的责任。如果
EmailSender
不负责报告有关邮件传递的诊断信息,谁会负责


您需要确保的唯一一件事是,
Diagnostics
保持与
EmailSender
相关的粒度级别
EmailSender
不依赖于它的消费者,消费者依赖于
EmailSender
,所以
EmailSender
不应该采用消费者的形式主义,而应该将它自己的语义强加给他们。

out
参数肯定是负责任的,至少按C#规范。但你的问题是什么?我不认为一种方法比另一种好。还有第三种方法,
diagnostics=sender.sendmail(详细信息)在我看来,它比
out
变体更优雅,但这只是品味的问题。没有明确的答案。@sll我想问的是,它是否在坚实的设计原则方面增加了业务责任。我认为SendEmail方法违反了SRP。根据它的名字,它的意思是发送电子邮件,而不是诊断任何问题。让异常冒泡到应该捕获/处理它们的位置可能的viol