I recently came upon a short rant named What’s The Problem With Static Methods? by Jason Gorman.
Jason argues there that
.. methods should be instance methods by default
because static methods cannot be composed/used with IoC and might make your TDD a really horrible experience.
A strongly disagree with both the conclusion and the reason for it – indeed I love to use static methods and will happily use ReSharper to convert them for me.
I would even encourage you all to write as much of them as possible!
Why I disagree
disclaimer
I am talking about the .net stack (say C#) here.
I don’t know enough about the state of things in Java/JVM but I doubt that it will differ much from what we can do in .net/mono.
Why do I think that static methods should not be avoided?
Because you can compose them in a functional way without having to new-up a instance first. And of course sometimes creating a object just because everything needs to be an object is just stupid.
Why should I have to instanciate a ChecksumCreator
before I can calculate a checksum? Why is there even something like the singleton-pattern?
Nope – I rather not have objects everywhere and of course modern hybrid-languages like F# encourages you to write more static methods (for example all let
bindings in a module
).
For me this is working far better than the usual pure OOP paradigm.
Also I don’t buy into the dependency-injection story.
If you think you cannot use DI with static methods (let’s just call them functions) you might want to read a bit about what higher order functions are.
We have delegate
s for quite a while now and a delegate
is more or less just a one-method interface, that works fine with static methods. That’s your DI right there!
Remember: long before there was a IComparable
interface we already had generic sorting in C.
The example Jason gave is a static method using some database. I agree with him here: the database(-connection) is a dependencies that is best kept in instance-fields. But for many other examples (like the sorting algorithm) going full OOP with interfaces, classes, .. is just insane.