Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.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# 设计视角:静态方法与类_C#_Asp.net_Static Methods - Fatal编程技术网

C# 设计视角:静态方法与类

C# 设计视角:静态方法与类,c#,asp.net,static-methods,C#,Asp.net,Static Methods,虽然这是一个相当常见的问题,但我正在努力寻找最佳的解决方法(如果在这种情况下需要解决的话) 我继承了一个网站(ASP.NET,C#),其中一部分包含一个充满静态方法的类(老实说,这是一个非常大的类)。一种特别的方法是发送电子邮件。它有我能想到的每一个可能的参数,并且工作得很好。然而,由于所有的东西都被塞进了内部,特别是在大多数参数都没有使用的情况下,这个特定方法的内部结构很难管理和理解。此外,由于此方法的所有参数,处理错误也有点困难 当您想要发送电子邮件时,实际拥有一个实例化的电子邮件类是否更有

虽然这是一个相当常见的问题,但我正在努力寻找最佳的解决方法(如果在这种情况下需要解决的话)

我继承了一个网站(ASP.NET,C#),其中一部分包含一个充满静态方法的类(老实说,这是一个非常大的类)。一种特别的方法是发送电子邮件。它有我能想到的每一个可能的参数,并且工作得很好。然而,由于所有的东西都被塞进了内部,特别是在大多数参数都没有使用的情况下,这个特定方法的内部结构很难管理和理解。此外,由于此方法的所有参数,处理错误也有点困难

当您想要发送电子邮件时,实际拥有一个实例化的电子邮件类是否更有意义?这对我来说只是“感觉”更正确,尽管我不能完全解释原因。在这种特殊情况下,你对未来的发展有何想法?一般情况如何

谢谢。

哦,天哪,是的

这听起来像是一个古老的经典ASP应用程序

这违反了法律。如果你能重构这个类。对该函数使用重载。

哦,天哪,是的

这听起来像是一个古老的经典ASP应用程序

这违反了法律。如果你能重构这个类。对该函数使用重载。

以下是常用的方法

我个人想补充几点:

  • 必须使用静态类型来编写扩展方法
  • 静态类型会使单元测试变得困难,因为它们很难/不可能模拟
  • 静态类型强制执行不变性和引用透明函数,这可能是一个很好的设计。因此,将它们用于设计为不可变且没有外部依赖性的事物。例如
  • 有些人认为()单例模式是个坏主意。在任何情况下,将静态类型视为单例都是错误的;它们比那要广泛得多
这种特殊情况有副作用(发送电子邮件),似乎不需要扩展方法。因此,它不适合我认为对静态类型有用的情况。另一方面,使用对象将允许模拟电子邮件,这将有助于单元测试。因此,我认为你说静态类型在这里是不合适的是正确的。

一般来说,这里是

我个人想补充几点:

  • 必须使用静态类型来编写扩展方法
  • 静态类型会使单元测试变得困难,因为它们很难/不可能模拟
  • 静态类型强制执行不变性和引用透明函数,这可能是一个很好的设计。因此,将它们用于设计为不可变且没有外部依赖性的事物。例如
  • 有些人认为()单例模式是个坏主意。在任何情况下,将静态类型视为单例都是错误的;它们比那要广泛得多
这种特殊情况有副作用(发送电子邮件),似乎不需要扩展方法。因此,它不适合我认为对静态类型有用的情况。另一方面,使用对象将允许模拟电子邮件,这将有助于单元测试。所以我认为你说静态类型在这里是不合适的是正确的。

这就是一个例子

根据这些方法的责任将它们分开总是一个好主意。创建电子邮件类绝对是个好主意™. 它将为您提供一个更好的使用界面,并允许您在测试中模拟电子邮件。

这是一个示例


根据这些方法的责任将它们分开总是一个好主意。创建电子邮件类绝对是个好主意™. 它将为您提供一个更好的使用界面,并允许您在测试中模拟电子邮件。

您所描述的内容听起来像一句格言:“您可以用任何语言编写FORTRAN。”

一个充满静态方法的庞大类通常(并非总是)是一种迹象,表明有人没有“获得”OOP,陷入了过程编程的思维模式,试图扭曲语言来实现他想要的

经验法则:如果任何方法(静态或实例)接受的参数超过5个,这通常表明该方法试图一次做太多的事情,是重构为一个或多个类的很好候选方法

此外,如果静态方法不是真正相关的,那么它们至少应该被划分为实现相关功能的类

实际上,我想知道,既然
System.Net.mail
名称空间可以处理几乎所有情况,并且可以通过app.config/web.config文件进行配置,那么为什么您会有一个“发送电子邮件”方法,所以您不需要向其传递服务器名或端口。这可能是一种“通知”方法吗?单个页面应该调用这种方法,以便根据填充了各种值的模板发送一条“标准”消息,并自动添加某些页眉/页脚?如果是这样的话,这种类型的交互有许多设计,它们比您似乎继承的设计更容易处理。(即)

更新:现在看到您的评论,这将用于异常处理,我认为最合适的解决方案是实际的异常处理程序。这方面有大量的资源。对于ASP.NETWebForms,我实际上采用了Jeff Atwood多年前编写的一个,将其移植到C#并做了一些更改(比如忽略404错误)。中有许多好的链接

我现在的偏好是将异常处理(以及随后的异常报告电子邮件)视为日志记录的一个子集。有一个功能非常强大的,您可以将其配置为仅用于“致命”错误(即。