In what situations is static method a good practice?

25,167

Solution 1

Static methods aren't hard to test in and of themselves. The problem is that other code calling the static method is hard to test, because you can't replace the static methods.

I think static methods are fine either when they're private or when they're "utility" methods - e.g. to do string escaping. The problem comes when you use static methods for things that you want to be able to mock out or otherwise replace within tests. Factory methods can be useful too, although dependency injection is generally a better approach - again, it partly depends on whether you want to be able to replace the functionality in tests.

As for not being "OO" - not everything you write in a generally OO language has to be "pure" OO. Sometimes the non-OO route is simply more pragmatic and leads to simpler code. Eric Lippert has a great blog post about this, which unfortunately I can't find right now. However, there's a comment in this post which is relevant. It talks about extension methods rather than static methods, but the principle is the same.

Extension methods are often criticized as being "not OOP enough". This seems to me to be putting the cart in front of the horse. The purpose of OOP is to provide guidelines for the structuring of large software projects written by teams of people who do not need to know the internal details of each other's work in order to be productive. The purpose of C# is to be a useful programming language that enables our customers to be productive on our platforms. Clearly OOP is both useful and popular, and we've therefore tried to make it easy to program in an OOP style in C#. But the purpose of C# is not "to be an OOP language". We evaluate features based on whether they are useful to our customers, not based on whether they conform strictly to some abstract academic ideal of what makes a language object-oriented. We'll happily take ideas from oo, functional, procedural, imperative, declarative, whatever, so long as we can make a consistent, useful product that benefits our customers.

Solution 2

I'd say that static methods are definitely OK when they are functions, i.e. they don't do any IO, don't have any internal state and only use their parameters to compute their return value.

I'd also extend this to methods that change the state of their parameters, though if this is done excessively, the static method should properly be an instance method of the parameter class that it mainly operates on.

Solution 3

Think of this for a moment. In OO coding, every single function call actually looks like this:

method(object this, object arg1, object arg2) where this is the object you are calling. All it really is is syntax sugar for this. Additionally it allows you to clearly define scope of variables because you have object variables etc.

Static methods simply don't have a "this" parameter. Ie you pass variables in and possibly get a result back out. 1.) is the main reason people avoid them, you can't create an interface to a static method (yet) so you can't mock out the static method to test it.

Secondly OO are procedures functions etc. Static methods make a lot of sense in certain situations, but they can always be made into a method on an object.

Mind you, you couldn't remove this without a hack:

static void Main(string[] args)
{
}

The code that starts your application MUST be callable WITHOUT a reference to an object. So they give you flexibility, whether you choose to use them in your scenario will be predicated by your requirements.

Solution 4

Static methods are fine in most situations where the singleton pattern gives too much flexibility.

For example, take a simple utility such as raising a primitive to a power - obviously you never need to have any polymorphism in that. Primitive values are of static type and mathematical operations are well defined and don't change. It's not like you'll ever get the situation of having two different implementations an no way of switching between them without rewriting all your client code.


(irony off )

Modern JVMs are pretty good at inlining small calls if only one implementation of an interface is loaded. Unless you have profiled your code and know dispatching your utilities to an interface is an overhead, you've no excuse for not making your utility methods into an interface which can be varied if required.

Solution 5

I think a definite case for static methods is when you cannot make them dynamic, because you cannot modify the class.

This is typical for JDK objects, and also all objects coming from external libraries, and also primitive types.

Share:
25,167

Related videos on Youtube

Winston Chen
Author by

Winston Chen

5+ years of experience in software development and architecture Fast learner and keen problem solver Real entrepreneur and starter Frequent Technology Conference and Community Speaker: COSCUP, JUG@TW, Scala Taipei and GTUG@TW I love lift!!

Updated on May 10, 2020

Comments

  • Winston Chen
    Winston Chen about 4 years

    I have read the following discussions:

    Should private helper methods be static if they can be static , and
    Should all methods be static if their class has no member variables

    It seems that people in general would accept static methods, but are a little bit skeptical about it, for the following 2 reasons:

    1. They are hard to test.
    2. They violate the OO principle. (They are functions, not methods, said a person.)

    And the most acceptable static methods are private static ones. But then why do static methods exist at all, and in what situations they are the first priority to be adopted?

  • Winston Chen
    Winston Chen over 14 years
    Thanks. Great explanations. So you think utility method is a good practice, right? But then I don't understand why people would use static other then "private" or "utility" though. Basically, I use utility methods a lot.
  • Jon Skeet
    Jon Skeet over 14 years
    Well, it's any time that you write a method which is logically to do with the type rather than an instance of the type. In some areas this is common; in others it's rare.
  • Miserable Variable
    Miserable Variable over 14 years
    I don't use dependency injection nor (often) mock objects for testing but static methods implementing factory would make mocking impossible, no?
  • Emanuele Bellini
    Emanuele Bellini over 4 years
    In the first instance, I didn't understand that static methods can't be replaced. After some research I realised that in testing is difficult, if not impossible, to replace them with mocks.
  • Big_Bad_E
    Big_Bad_E over 4 years
    "you can't create an interface to a static method (yet)" 10 years later, still waiting...