SOLID Considered Harmful Part 2: .O...
SOLID principles, developed by Robert Martin a.k.a. "Uncle Bob", are amongst the most cited by programmers. I believe that many of them are misunderstood, misapplied, overrated, and all too often they much less important than other software engineering principles.
In this post, let's consider the "O", the Open Closed Principle.
O: Open/Closed principle
"software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification" Wikipedia source
However, as you read more in that Wikipedia article, there's more than one variation / interpretation of this principle. Trouble.
Let's read Uncle Bob's Version Skip ahead to bullet 2 of "Description": (emphasis mine)
"The source code of such a module is inviolate. _No one is allowed to make source code changes to it._"
All modification are to be made via, in effect, subclasses (or similar). The base class is assumed to be perfect.
One place where this may be applicable is "plugin" frameworks. Discussion Below
However, for other, "normal" code, Nobody writes any real code this way! Can you imagine if Java's ArrayList was actually this?:
- java.util.ArrayListThatImplementsIterable extends java.util.ArrayList
- java.util.ArrayListThatImplementsForEach extends ...
Sorry, outside of plugin architectures, the Open-Closed principle is insane, and impractical. Those dogmatic few that strictly follow it encourage the construction of long, increasingly fragile class hierarchies. But we are supposed to prefer Composition over Inheritance, right?
There are various security and outdatedness issues:
"The cold reality is that, unless you are careful about what you install, it is almost impossible to be confident that the installed plug-ins are not ill-intentioned"
Many businesses test your plugins - I'm most familiar with snyk.
These problems are not game-stoppers. But, even assuming they do get worked out, do these projects truly follow the Open Closed Principle? How stable has the base code been? Remember, officially, it is "inviolate".
- Java is at version 9, which changes it's JAR / Module framework
- Eclipse has 171 versions
- Vim looks to be at "patch 8.0.1400"
- Metalsmith is at version 2.3.0 after 40 releases
You get the idea. Even projects that try to follow the OCP via plugins fail miserably at the "inviolate" stuff.
For non-plugin architectures, OCP is, well, insane.
I like plugin designs, they are often a great idea, and perfect for the OCP. However, don't expect the OCP to work as designed for them either. It really should be rewritten as "for plugin projects, try to put most of the modifications and extensions outside of the core".