DEV Community

Discussion on: Be cautious when implementing the Open Closed Principle

 
bourzayq_khalid profile image
Khalid BOURZAYQ • Edited

I completely agree with you on YAGNI.

Also i know that applying the Open-Closed Principle EVERYWHERE is wasteful, unnecessary, and can lead to complex, hard to understand code and fully agree with it.

But seriously I’m not a fun of duplicated code and the is a lot of solutions to avoid that !

The idea behind my article was to explain how we can implement the OCP principle inside a software in different ways. This is an article to simplify things to software developers in my point of view.

And in the conclusion a noticed that :

we shouldn't be afraid to do so, it's completely normal, but we should at least make these changes as discrete as possible.

I can’t see what was wrong ?

To conclude :
I think, we both agree that SOLID are principles and not rules!!

Thank you for these comments which have raised this thread and i hope that it will be conclusive debate.

Thread Thread
 
peerreynders profile image
peerreynders

I'm not a fan of duplicated code

DRY isn't about removing repetition or duplication: "every piece of knowledge must have a single, unambiguous, authoritative representation within a system". Sometimes code can look similar but is unrelated.

(POV: Development by Slogan with DRY: Part 2, The Tower of Coupling)

I can’t see what was wrong ?

The setup.

If the article would have started by stating that it was known up front that both ByType and BySubscription filtering would be needed and that other, yet to be determined kinds of filtering may still need to be added in the future, that would have laid out the background of a clear and necessary dimension of extensibility that OCP could apply to.

As it is, it was presented as if OCP somehow should make it obvious which dimension of extensibility is needed when only ByType filtering is required. Initially there are no actual dimensions of variability indicated. That only happened once the BySubscription requirement surfaced later.

This sets up the unrealistic expectation that IFilter<T> should be introduced at the very beginning (which is revisionist) when in fact the value of that abstraction only becomes clear much later.

In a realistic scenario you would start with FilterByType and end up at Apply - which means that the code isn't "closed to modification" as you are "opening it for extension".

Thread Thread
 
bourzayq_khalid profile image
Khalid BOURZAYQ • Edited

In my example i apply OCP just in time and this what should we do and i Refactor to Open-Closed.

Yagni only applies to capabilities built into the software to support a presumptive feature, it does not apply to effort to make the software easier to modify.

YAGNI

At first reading the open closed principle may seem to be nonsensical. Our languages and our designs do not usually allow new features to be written, compiled, and deployed separately from the rest of the system. We seldom find ourselves in a place where the current system is closed for modification, and yet can be extended with new features.

The Open Closed Principle - The Clean Code Blog by Robert C. Martin (Uncle Bob)

In OCP, the term module includes all discrete software elements, including methods, classes, subsystems, applications, and so forth. Also, the phrase “closed with respect to X” means that clients are not affected if X changes.

Protected Variation:The Importance of Being Closed

Indeed, most commonly we add new features by making a vast number of changes throughout the body of the existing code. We’ve known this was bad long before Martin Fowler wrote the book[2] that labeled it Shotgun Surgery but we still do it.

[2]Hall, 1988. [2] Refactoring, Martin Fowler, Addison Wesley, 1999

The Open Closed Principle - The Clean Code Blog by Robert C. Martin (Uncle Bob)