如果“实用程序”类是邪恶的,我应将通用代码放在哪里?[关闭]


72

我通常遵循的规则是,全局变量/函数是邪恶的,并且每段代码都应该存在于它所属的类中。

这是一个非常容易遵循的规则,我相信到目前为止,我从未遇到过与此规则相关的问题。

但是,今天,我需要将一个函数添加到我的程序集中,而不是添加到特定的类。也就是说,几乎所有的类都可以用于此特定功能。

我应该在哪里放置此函数(+1重载)?

如果将其放在“实用程序”类中,我会感到很脏。如果我把它放在半相关的类上,而让其他类直接调用它,我会感到更糟。

这段特定的代码基本上IList<PointF>将a砍成一个规范化的列表。我现在觉得将其作为扩展方法添加IList<PointF>可能是最好的选择...


1
我同意,全局变量是邪恶的。他们似乎有自己的想法专门破坏代码。
拉菲·凯特勒

24
全局状态是有问题的,但是全局函数只是可以用很少的输入/输出重用的逻辑,因此不值得将其封装在类中。我没有看到将Helper或Utility方法分组为适当命名的Helper或Utility静态类的任何问题。
丹·布莱恩特

我更喜欢使用“上拉方法”代替Utility / Helper类-上拉方法
Sumeet Patil

Answers:


34

如果这是对的操作IList<PointF>,则应该是对的扩展方法IList<PointF>

一般情况下,UtilsHelper应避免类型类。通常,您会发现您可能认为的是一种实用程序方法,实际上是一个相当具体的方法,可能属于它自己的类(就像您说的那样)。但是,在特定于领域的情况下,Util类似类(将相关有用方法分组的类)是有效实体。


3
+1扩展方法非常适合此类问题
Diadistis 2010年

1
是的,但是我在这里的保留意见是,如果它是扩展名,那么它需要有一个流利的冠名...类似points.NormalizeIntoSegments(50),而不是我的首选Utilities.Segment(points, 50)
约翰·吉岑

类NormalizedIList扩展IList怎么办?
atk 2010年

5
我在这里可能是错的,但是如果没问题,那Utilities.Segment(points, 50)是什么问题points.Segment(50)
哈佛小号

3
扩展方法和静态实用程序方法实际上是同一件事。的唯一差别是在方法调用的语法,其中的第一个参数的扩展方法是在之前放置.操作者。使用扩展方法和静态实用程序方法设计软件的方式完全相同。我感到困惑的是,这个答案似乎暗示着有所不同。
Lii

12

“全局”变量和方法没有错。您一直在使用它们。该框架喜欢将它们称为“静态”类或“静态”方法。

我很少需要,但是我通常在名称空间中添加一个内部静态类Util,该名称空间是C#和VB.NET模块所需的方法/变量。

.NET Framework的样本

  • System.Collections.Specialized.CollectionsUtil
  • System.Net.WebUtility
  • 检查Microsoft的.NET Framework源代码。您会发现许多内部实用程序类。

2
请注意,来自BCL的所有示例均围绕特定职责分组。Utils任何地方都没有通用类。
Ben Voigt 2010年

什么是BCL?您是指基本类库(BCL)吗?
2010年

1
打开.NET Reflector。搜索“ util”。有256个示例使用.NET Reflector加载的默认(BCL)4.0程序集。
2010年

4

当然,您应该将其放入“ ListUtilities”或PointListUtilities类中。然后,您就不会违反单一责任原则,而这是万能的“实用程序”类的主要问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.