如果“实用程序”类是邪恶的,我应该把我的通用代码放在哪里? [关闭]
Posted
技术标签:
【中文标题】如果“实用程序”类是邪恶的,我应该把我的通用代码放在哪里? [关闭]【英文标题】:If a "Utilities" class is evil, where do I put my generic code? [closed] 【发布时间】:2011-03-21 09:00:46 【问题描述】:我通常遵循全局变量/函数是邪恶的规则,并且每段代码都应该存在于它所属的类中。
这是一条非常容易遵循的规则,我相信直到现在我都没有遇到过这条规则的问题。
然而,今天我需要将一个函数添加到我的程序集,而不是添加到特定的类。也就是说,几乎我所有的类都可以使用这个特定的功能。
我应该把这个函数放在哪里(+1 重载)?
如果我把它放在“实用程序”类中,我会觉得很脏。如果我把它附加到一个半相关的类上,让其他类直接调用它,我感觉更糟。
这段特殊的代码基本上将IList<PointF>
切入规范化列表。我现在觉得在IList<PointF>
上添加它作为扩展方法可能是最好的选择......
【问题讨论】:
我同意,全局变量是邪恶的。他们似乎有自己的想法致力于破坏您的代码。 全局状态是有问题的,但全局函数只是可重用的逻辑,输入/输出太少,不值得封装在一个类中。我完全没有看到将 Helper 或 Utility 方法分组到适当命名的 Helper 或 Utility 静态类中的任何问题。 我更喜欢使用“Pull Up Method”而不是 Utility/Helper 类 - Pull Up Method 【参考方案1】:当然,您应该将其放入“ListUtilities”或PointListUtilities
类中。那么你就没有违反单一职责原则,这是一个包罗万象的“实用程序”类的主要问题。
【讨论】:
【参考方案2】:如果这是对IList<PointF>
的操作,那么它应该是IList<PointF>
的扩展方法。
通常,应避免使用Utils
和Helper
类型的类。很多时候,您会发现您可能认为是一个实用方法,实际上是一个相当具体的方法,可能属于它自己的一个类(就像你说的那样)。但是,在某些特定领域的情况下,Util
-like 类(将相关有用方法分组的类)是有效实体。
【讨论】:
+1 扩展方法非常适合此类问题 是的,但我在这里的保留是,如果它是一个扩展,那么它需要有一个流利的名字......像points.NormalizeIntoSegments(50)
,而不是我喜欢的Utilities.Segment(points, 50)
。跨度>
NormalizedIList 类扩展 IList 怎么样?
我这里可能错了,但如果Utilities.Segment(points, 50)
没问题,points.Segment(50)
有什么问题?
扩展方法和静态实用方法实际上是一回事。 唯一的区别在于方法调用语法,其中扩展方法的第一个参数放在.
运算符之前。您使用扩展方法和静态实用程序方法来设计软件的方式完全相同。我发现这个答案似乎暗示存在差异,这让我感到困惑。【参考方案3】:
“全局”变量和方法没有错。你一直在使用它们。框架喜欢称它们为“静态”类或“静态”方法。
我很少需要,但我通常在命名空间中添加一个内部静态类 Util,C# 需要该方法/变量,VB.NET 需要一个模块。
来自 .NET Framework 的示例
System.Collections.Specialized.CollectionsUtil
System.Net.WebUtility
检查 Microsoft 的 .NET Framework 源代码。您会发现许多内部实用程序类。
【讨论】:
请注意,BCL 中的所有示例都围绕特定职责进行分组。任何地方都没有通用的Utils
类。
什么是 BCL?您是指基类库 (BCL) 吗?
打开 .NET Reflector。搜索“实用程序”。有 256 个示例使用由 .NET Reflector 加载的默认 (BCL) 4.0 程序集。以上是关于如果“实用程序”类是邪恶的,我应该把我的通用代码放在哪里? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章