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:
- They are hard to test.
- 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?
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.