当前位置: 首页 > 面试题库 >

在什么情况下,静态方法是一种好的做法?

党星鹏
2023-03-14
问题内容

我已阅读以下讨论:

如果私有帮助器方法可以是静态的,则它们应该是静态的;如果它们的类没有成员变量,则所有方法应该是静态的。

似乎人们通常会接受静态方法,但由于以下两个原因,对此有些怀疑:

  1. 他们很难测试。
  2. 他们违反了OO原则。(一个人说,它们是函数,而不是方法。)

最可接受的静态方法是 私有静态 方法。但是,为什么为什么根本不存在静态方法呢?在什么情况下,它们是最优先采用的方法?


问题答案:

静态方法本身并不难测试。问题在于, 调用 静态方法的其他代码很难测试,因为您不能替换静态方法。

我认为静态的方法都很好既可以当它们是私有的 当他们是“实用”的方法-
例如,做串逃跑。当您对要在测试中模拟或替换的事物使用静态方法时,就会出现问题。尽管通常情况下依赖注入是一种更好的方法,但工厂方法 可能很有用-
再次,它部分取决于您是否希望能够替换测试中的功能。

至于不是“ OO”-并不是用普通的OO语言编写的所有内容都必须是“纯” OO。有时,非OO路由更实用,并且导致代码更简单。埃里克·利珀特(Eric
Lippert)撰写了一篇很棒的博客文章,很遗憾,我现在找不到。但是,这篇文章中有一条相关的评论。它讨论的是扩展方法而不是静态方法,但是原理是相同的。

扩展方法经常被批评为“不够面向对象”。在我看来,这似乎是在把马车放在马的前面。OOP的目的是为由大型团队编写的大型软件项目的结构提供指导,这些团队不需要了解彼此工作的内部细节即可提高工作效率。C#的目的是成为一种有用的编程语言,使我们的客户能够在我们的平台上高效工作。显然,OOP既有用又受欢迎,因此,我们试图简化以C#编写OOP样式的程序。但是C#的目的不是“成为一种OOP语言”。我们会根据功能是否对客户有用来评估功能,不是基于它们是否严格符合使语言成为面向对象的某种抽象学术理想。只要我们能够制造出使客户受益的一致,有用的产品,我们就会愉快地从oo,功能,过程,命令性,声明性等方面获取想法。



 类似资料:
  • 我有一个粒子模拟项目,我已经工作了很多个小时,我将发布两个类。一个是粒子类,一个是main和Canvas类。我创建一个画布,然后得到它的BufferStrategy和一个Graphics在上面绘制。我使用更新循环来更新每一帧的粒子,并使用渲染循环来渲染每一帧的粒子。更新和渲染都是通过调用粒子数组列表中每个粒子的自渲染和自更新方法来完成的。现在这是我的问题。我有一个MouseListener,它在中

  • 问题内容: 我需要创建一个使用12个参数的存储过程,并使用此参数的不同组合来过滤查询。所有12个参数都不是强制性的,好像我传递3或5或12个参数取决于用户输入的搜索输入。 我可以使用动态SQL查询或“ Case where”语句创建2种方法。这些查询的示例如下: 动态查询 DECLARE @condition VARCHAR(MAX)=’‘ Declare @var1 varchar(10) De

  • 问题内容: 刚刚收到评论,我静态导入该方法不是一个好主意。静态导入是DA类中的一种方法,该类主要具有静态方法。因此,在业务逻辑的中间,我有一个da活动,显然似乎属于当前类: 审阅者并不希望我更改代码,也没有,但是我确实同意他的观点。不能静态导入的原因之一是方法的定义位置令人困惑,它不在当前类中,也不在任何超类中,因此花了太多时间来确定其定义(基于Web的审阅系统没有可点击的像IDE这样的链接:-)

  • 问题内容: 我已经多次听到在HTML 中使用JavaScript事件(例如)是不正确的做法,因为它不利于语义。我想知道不利之处以及如何解决以下代码? 问题答案: 您可能正在谈论简洁的Javascript,看起来像这样: 中央javascript文件中的逻辑如下所示: 优点是 行为(JavaScript)与表示(HTML)分开 没有语言的混合 您正在使用像jQuery这样的javascript框架,

  • 问题内容: 我想计算一个可迭代对象满足给定条件的数量。我想以一种清晰,简单,最好是合理的方式进行操作。 我目前最好的想法是: 和 第一个是基于迭代器的,对于大列表来说可能更快。它与您用于测试任何和所有测试的表单相同。但是,这取决于int(True)== 1,这有点难看。 第二个对我来说似乎更容易阅读,但是它与任何和所有形式都不同。 有没有人有更好的建议?我缺少某处的库函数吗? 问题答案: 基于迭代

  • 输入是:1。硬币中一定数量货币的总重量,2。旧货币硬币的价值和相应重量。 目标是找到给定金额货币的最低可能货币价值。 我的方法是按货币的价值/重量比升序对硬币进行排序,然后贪婪地将第一枚硬币的重量尽可能多地匹配到总和中(跟踪它匹配的次数),然后匹配将第二枚硬币的重量尽可能多次地放入余数中,等等,对于所有硬币或直到余数为零(如果不是,情况是不可能的)。 法官说我的答案是错误的。你能给我一个关于算法错