Questions tagged «static-methods»

11
静态测试对于单元测试而言是否普遍“邪恶”?如果是的话,为什么瑞沙珀推荐它?[关闭]
我发现只有三种方法可以对C#.NET中静态的单元测试(模拟/存根)依赖性进行测试: 鼠 TypeMock JustMock 鉴于其中有两个不是免费的,而另一个没有发布1.0版,因此模拟静态内容并不是一件容易的事。 这是否构成静态方法和此类“邪恶”(就单元测试而言)?如果是这样,为什么harsharper希望我做任何可以静态的事情?(假设重新剃刀也不是“邪恶的”。) 澄清: 我是在谈论要对方法进行单元测试并且该方法在其他单元/类中调用静态方法的情况。根据单元测试的大多数定义,如果仅让被测方法在另一个单元/类中调用静态方法,则您不是单元测试,而是集成测试。(有用,但不是单元测试。)

7
为什么要使用私有静态方法?
我只是想解决一个问题。与具有私有可见性的普通方法相比,拥有私有静态方法有什么意义? 我本来以为拥有静态方法的一个优点是可以在没有类实例的情况下调用它,但是由于它的私有性,甚至有一点是静态的吗? 我能想到的唯一原因是,它有助于从概念上理解类级别(而不是对象级别)上的方法。

10
我不能只使用所有静态方法吗?
下面的两个UpdateSubject方法有什么区别?我觉得如果只想对实体进行操作,使用静态方法会更好。在什么情况下应该使用非静态方法? public class Subject { public int Id {get; set;} public string Name { get; set; } public static bool UpdateSubject(Subject subject) { //Do something and return result return true; } public bool UpdateSubject() { //Do something on 'this' and return result return true; } } 我知道,对于这个非常烦人的问题,我会从社区中得到很多帮助,但我无法阻止自己提出这个问题。 在处理继承时,这变得不切实际吗? 更新: 它正在我们的工作场所中发生。我们正在与5位开发人员一起开发6个月的asp.net …

7
在设计可测试性时如何处理静态实用程序类
我们正在尝试将我们的系统设计为可测试的,并在大多数零件中使用TDD进行开发。当前,我们正在尝试解决以下问题: 在各个地方,我们有必要使用静态辅助方法,例如ImageIO和URLEncoder(均为标准Java API)以及各种其他主要由静态方法组成的库(例如Apache Commons库)。但是,测试使用此类静态帮助程序类的方法极其困难。 我有一些解决此问题的想法: 使用可以模拟静态类的模拟框架(例如PowerMock)。这可能是最简单的解决方案,但感觉有点像放弃。 围绕所有这些静态实用程序创建实例化包装器类,以便可以将它们注入使用它们的类中。这听起来像是一个相对干净的解决方案,但是我担心我们最终将创建大量这些包装器类。 将对这些静态帮助器类的每个调用提取到一个可以重写的函数中,并测试我实际要测试的类的子类。 但是我一直认为这只是许多人在进行TDD时必须面对的问题-因此必须已经有解决此问题的方法。 使使用这些静态帮助器的类可测试的最佳策略是什么?


15
何时使用“静态功能”?
好的,我已经了解了静态函数是什么,但是我仍然看不到为什么它们比私有成员函数更有用。这在这里可能是一个新奇的问题,但是为什么不只用静态函数代替所有私有成员函数呢?

2
依赖注入与静态方法
今天,我与另一位开发人员进行了有趣的讨论,内容涉及如何使用接受字符串并输出字符串的方法处理类。 想象一下以下内容,它完全是出于示例目的而组成的 public string GetStringPart(string input) { //Some input validation which is removed for clarity if(input.Length > 5) return input.Substring(0,1); if(input.Substring(0,1) == "B") return input.Substring(0,3); return string.empty; } 一个基于字符串输入而具有某种逻辑的函数将使用DI添加到项目中,并且具有一个DI容器。您是否会使用接口添加此新类并在需要时将其注入,还是将其设为静态类?各自的优缺点是什么?您为什么要(或不希望)使它与构造函数注入一起使用,而不是在需要时随处访问。


5
为什么静态方法不能被重写?
在回答这个问题时,普遍的共识是静态方法不应被覆盖(因此C#中的静态函数不能是虚拟的或抽象的)。但是,不仅在C#中是这种情况。Java也禁止这样做,C ++也似乎不喜欢它。但是,我可以想到许多我想在子类中覆盖的静态函数示例(例如,工厂方法)。从理论上讲,有多种方法可以解决这些问题,但都不是干净或简单的方法。 为什么静态函数不应该被覆盖?

1
我们在滥用静态方法吗?
几个月前,我开始从事一个新项目,在遍历代码时,它使我震惊了所使用的静态方法。它们不仅保留了实用程序方法collectionToCsvString(Collection<E> elements),而且还保留了大量业务逻辑。 当我问负责背后原因的那个人时,他说这是逃避斯普林暴政的一种方式。它围绕着这个思考过程进行了一些操作:要实现客户收据创建方法,我们可以提供服务 @Service public class CustomerReceiptCreationService { public CustomerReceipt createReceipt(Object... args) { CustomerReceipt receipt = new CustomerReceipt(); // creation logic return receipt; } } 现在,那个家伙说他不喜欢让Spring不必要地管理类,主要是因为它强加了限制,即客户类必须是Spring bean本身。我们最终将一切都由Spring管理,这几乎迫使我们以过程方式使用无状态对象。或多或少在这里说了什么https://www.javacodegeeks.com/2011/02/domain-driven-design-spring-aspectj.html 因此,除了上面的代码,他有 public class CustomerReceiptCreator { public static CustomerReceipt createReceipt(Object... args) { CustomerReceipt receipt = new CustomerReceipt(); // creation logic return receipt; } } …

3
“静态”作为关于无状态的语义线索?
我最近在Java中进行了一个中型项目的重构,以返回并添加单元测试。当我意识到模拟单例和静态模型是多么痛苦时,我终于“明白了”我一直以来一直在阅读的内容。(我是需要从经验中学习的人之一。哦。) 因此,既然我正在使用Spring创建对象并将它们连接在一起,那么我就不用去左右static关键字了。(如果我有可能要模拟它,那么它在与Math.abs()相同的意义上并不是真正的静态,对吧?)问题是,我已经习惯于使用static来表示方法不依赖在任何对象状态下。例如: //Before import com.thirdparty.ThirdPartyLibrary.Thingy; public class ThirdPartyLibraryWrapper { public static Thingy newThingy(InputType input) { new Thingy.Builder().withInput(input).alwaysFrobnicate().build(); } } //called as... ThirdPartyLibraryWrapper.newThingy(input); //After public class ThirdPartyFactory { public Thingy newThingy(InputType input) { new Thingy.Builder().withInput(input).alwaysFrobnicate().build(); } } //called as... thirdPartyFactoryInstance.newThingy(input); 因此,这就是敏感的地方。我喜欢旧方法,因为大写字母告诉我,就像Math.sin(x)一样,ThirdPartyLibraryWrapper.newThingy(x)每次都以相同的方式执行相同的操作。没有对象状态可以更改对象执行我要执行的操作的方式。这是我正在考虑的一些可能的答案。 没有其他人有这种感觉,所以我有问题。也许我只是还没有真正内部化OO的做事方式!也许我在用Java编写,但在FORTRAN或类似语言中思考。(由于我从未写过FORTRAN,这会给人留下深刻的印象。) 也许出于论证代码的目的,我正在使用静态作为不变性的一种代理。话虽这么说,有什么线索 要我在我的人一起,以保持它的到来代码知道什么是有状态的,什么不是? 如果我选择好的对象隐喻,也许应该只是免费提供?例如thingyWrapper,听起来好像它的包装状态是独立的,而包装状态Thingy本身可能是可变的。同样,thingyFactory听起来应该是不变的,但在创建时可能会选择不同的策略。

6
将大多数类划分为仅数据字段类和仅方法类(如果可能的话)是好的还是反模式的?
例如,一个类通常具有类成员和方法,例如: public class Cat{ private String name; private int weight; private Image image; public void printInfo(){ System.out.println("Name:"+this.name+",weight:"+this.weight); } public void draw(){ //some draw code which uses this.image } } 但是在阅读了有关“单一职责原则”和“开放封闭原则”之后,我更喜欢仅使用静态方法将类分为DTO和辅助类,例如: public class CatData{ public String name; public int weight; public Image image; } public class CatMethods{ public static void printInfo(Cat …

3
C#中的私有静态方法会伤害任何东西吗?
我为某个验证创建了私有验证方法,该验证方法在我的课程中多次发生(出于各种原因,我无法存储经过验证的数据)。现在,ReSharper建议将该功能设为静态。由于静态方法的已知问题,我有点不愿意这样做。这将是一个私有的静态方法。我的问题是,私有静态方法是否会引起类似公共静态方法的耦合和测试问题?这是不好的做法吗?我猜不会,但是我不确定这里是否有陷阱。

4
为什么通过静态方法传递对象会有好处?
为什么使用静态方法并将引用作为参数传递给对象而不是在对象上调用该方法会有好处? 为了阐明我的意思,请考虑以下课程: public class SomeClass { private double someValue; public SomeClass() { // Some constructor in which someValue is set } public void incrementValue() { someValue++; } } 与使用静态方法的此替代实现相比: public class SomeClass { private double someValue; public SomeClass() { // Some constructor in which someValue is set } public static …
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.