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

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> 的扩展方法。

通常,应避免使用UtilsHelper 类型的类。很多时候,您会发现您可能认为是一个实用方法,实际上是一个相当具体的方法,可能属于它自己的一个类(就像你说的那样)。但是,在某些特定领域的情况下,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 程序集。

以上是关于如果“实用程序”类是邪恶的,我应该把我的通用代码放在哪里? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

实用程序类可以是 MVC 框架中的模型类吗?

如果 ORM(JPA、Hibernate 等)是邪恶的,Java-er 应该使用一些东西

拖放控制 - 邪恶?

我应该把我的着色器代码放在哪里?

我应该把我的静态文本文件放在哪里才能成为 OTPy?

CakePHP - 在我的应用程序结构中放置自定义实用程序类的最佳位置在哪里?