- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
这个问题在这里已经有了答案:
Class with single method — best approach?
(15 个回答)
6年前关闭。
这是什么 MSDN has to say under When to Use Static Classes :
static class CompanyInfo
{
public static string GetCompanyName() { return "CompanyName"; }
public static string GetCompanyAddress() { return "CompanyAddress"; }
//...
}Use a static class as a unit of organization for methods not associated with particular objects. Also, a static class can make your implementation simpler and faster because you do not have to create an object in order to call its methods. It is useful to organize the methods inside the class in a meaningful way, such as the methods of the Math class in the System namespace.
最佳答案
我在较早的 Stack Overflow 回答中写下了我对静态类的想法:
Class with single method -- best approach?
我曾经喜欢充满静态方法的实用程序类。他们对辅助方法进行了很好的整合,否则会导致冗余和维护 hell 。它们非常易于使用,无需实例化,无需处理,只需触发'n'forget。我想这是我第一次在不知情的情况下尝试创建面向服务的架构——许多无状态服务只是完成了他们的工作,没有别的。然而,随着系统的发展,龙即将到来。
多态性
假设我们有方法 UtilityClass.SomeMethod ,它很高兴地嗡嗡作响。突然间,我们需要稍微改变一下功能。大多数功能是相同的,但我们必须更改几个部分。如果它不是静态方法,我们可以创建一个派生类并根据需要更改方法内容。由于它是静态方法,我们不能。当然,如果我们只需要在旧方法之前或之后添加功能,我们可以创建一个新类并在其中调用旧的类 - 但这太糟糕了。
接口(interface)问题
出于逻辑原因,不能通过接口(interface)定义静态方法。因为我们不能覆盖静态方法,所以当我们需要通过它们的接口(interface)传递静态类时,静态类是无用的。这使我们无法将静态类用作策略模式的一部分。我们可能会通过 passing delegates instead of interfaces 修补一些问题.
测试
这基本上与上面提到的界面问题密切相关。由于我们交换实现的能力非常有限,我们也很难用测试代码替换生产代码。同样,我们可以将它们包装起来,但这需要我们更改大部分代码,以便能够接受包装器而不是实际对象。
培养 Blob
由于静态方法通常用作实用方法,而实用方法通常具有不同的用途,我们很快就会得到一个充满非连贯功能的大类——理想情况下,每个类在系统中都应该有一个单一的用途。只要它们的目的明确,我宁愿有五倍的类(class)。
参数蠕变
首先,这个可爱而天真的静态方法可能只需要一个参数。随着功能的增长,添加了几个新参数。很快就会添加更多可选参数,因此我们创建方法的重载(或仅添加默认值,使用支持它们的语言)。不久,我们就有了一个接受 10 个参数的方法。只有前三个是真正需要的,参数 4-7 是可选的。但是如果指定了参数6,7-9也需要填写...如果我们创建一个类的目的是做这个静态方法所做的事情,我们可以通过在构造函数,并允许用户通过属性设置可选值,或同时设置多个相互依赖的值的方法。此外,如果一个方法已经发展到这种程度的复杂性,它很可能无论如何都需要在它自己的类中。
要求消费者无故创建类的实例
最常见的论点之一是:为什么要求我们的类的使用者创建一个实例来调用这个单一方法,而之后却不再使用该实例?在大多数语言中,创建一个类的实例是一个非常便宜的操作,所以速度不是问题。向消费者添加额外的一行代码是一种低成本,可以为 future 更易于维护的解决方案奠定基础。最后,如果您想避免创建实例,只需为您的类创建一个单例包装器,以便轻松重用——尽管这确实要求您的类是无状态的。如果它不是无状态的,您仍然可以创建处理所有内容的静态包装器方法,同时从长远来看仍然为您提供所有好处。最后,您还可以创建一个类来隐藏实例化,就好像它是一个单例一样:MyWrapper.Instance 是一个只返回 new MyClass();
的属性。
只有西斯交易绝对值
当然,我不喜欢静态方法也有异常(exception)。不会造成任何膨胀风险的真正实用程序类是静态方法的极好案例 - 以 System.Convert 为例。如果你的项目是一次性的,不需要 future 的维护,那么整体架构真的不是很重要——静态或非静态,并不重要——然而,开发速度很重要。
标准,标准,标准!
使用实例方法不会阻止您也使用静态方法,反之亦然。只要差异化背后有推理,并且是标准化的。没有什么比查看具有不同实现方法的业务层更糟糕的了。
关于c# - 何时在 C# 中使用静态类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/241339/
我在网上搜索但没有找到任何合适的文章解释如何使用 javascript 使用 WCF 服务,尤其是 WebScriptEndpoint。 任何人都可以对此给出任何指导吗? 谢谢 最佳答案 这是一篇关于
我正在编写一个将运行 Linux 命令的 C 程序,例如: cat/etc/passwd | grep 列表 |剪切-c 1-5 我没有任何结果 *这里 parent 等待第一个 child (chi
所以我正在尝试处理文件上传,然后将该文件作为二进制文件存储到数据库中。在我存储它之后,我尝试在给定的 URL 上提供文件。我似乎找不到适合这里的方法。我需要使用数据库,因为我使用 Google 应用引
我正在尝试制作一个宏,将下面的公式添加到单元格中,然后将其拖到整个列中并在 H 列中复制相同的公式 我想在 F 和 H 列中输入公式的数据 Range("F1").formula = "=IF(ISE
问题类似于this one ,但我想使用 OperatorPrecedenceParser 解析带有函数应用程序的表达式在 FParsec . 这是我的 AST: type Expression =
我想通过使用 sequelize 和 node.js 将这个查询更改为代码取决于在哪里 select COUNT(gender) as genderCount from customers where
我正在使用GNU bash,版本5.0.3(1)-发行版(x86_64-pc-linux-gnu),我想知道为什么简单的赋值语句会出现语法错误: #/bin/bash var1=/tmp
这里,为什么我的代码在 IE 中不起作用。我的代码适用于所有浏览器。没有问题。但是当我在 IE 上运行我的项目时,它发现错误。 而且我的 jquery 类和 insertadjacentHTMl 也不
我正在尝试更改标签的innerHTML。我无权访问该表单,因此无法编辑 HTML。标签具有的唯一标识符是“for”属性。 这是输入和标签的结构:
我有一个页面,我可以在其中返回用户帖子,可以使用一些 jquery 代码对这些帖子进行即时评论,在发布新评论后,我在帖子下插入新评论以及删除 按钮。问题是 Delete 按钮在新插入的元素上不起作用,
我有一个大约有 20 列的“管道分隔”文件。我只想使用 sha1sum 散列第一列,它是一个数字,如帐号,并按原样返回其余列。 使用 awk 或 sed 执行此操作的最佳方法是什么? Accounti
我需要将以下内容插入到我的表中...我的用户表有五列 id、用户名、密码、名称、条目。 (我还没有提交任何东西到条目中,我稍后会使用 php 来做)但由于某种原因我不断收到这个错误:#1054 - U
所以我试图有一个输入字段,我可以在其中输入任何字符,但然后将输入的值小写,删除任何非字母数字字符,留下“。”而不是空格。 例如,如果我输入: 地球的 70% 是水,-!*#$^^ & 30% 土地 输
我正在尝试做一些我认为非常简单的事情,但出于某种原因我没有得到想要的结果?我是 javascript 的新手,但对 java 有经验,所以我相信我没有使用某种正确的规则。 这是一个获取输入值、检查选择
我想使用 angularjs 从 mysql 数据库加载数据。 这就是应用程序的工作原理;用户登录,他们的用户名存储在 cookie 中。该用户名显示在主页上 我想获取这个值并通过 angularjs
我正在使用 autoLayout,我想在 UITableViewCell 上放置一个 UIlabel,它应该始终位于单元格的右侧和右侧的中心。 这就是我想要实现的目标 所以在这里你可以看到我正在谈论的
我需要与 MySql 等效的 elasticsearch 查询。我的 sql 查询: SELECT DISTINCT t.product_id AS id FROM tbl_sup_price t
我正在实现代码以使用 JSON。 func setup() { if let flickrURL = NSURL(string: "https://api.flickr.com/
我尝试使用for循环声明变量,然后测试cols和rols是否相同。如果是,它将运行递归函数。但是,我在 javascript 中执行 do 时遇到问题。有人可以帮忙吗? 现在,在比较 col.1 和
我举了一个我正在处理的问题的简短示例。 HTML代码: 1 2 3 CSS 代码: .BB a:hover{ color: #000; } .BB > li:after {
我是一名优秀的程序员,十分优秀!