It seems like the Religious War Du Jour is the discovery that Object-Oriented Programming Sucks, and anyone who wants to write code that works should use a Functional paradigm.
The blogs and websites are full of semi-contrived examples where OOP has gone horribly wrong. And indeed, the problem they are trying to solve is not a good one for OOP, and the result is hacky spaghetti code. Then they show the same problem solved in a functional language in 10 lines.
The lesson here isn’t that OOP sucks and FPL is a panacea. The lesson here is:
Use the right tool for the job.
If I hired a contractor to do work on my house, and she insisted that everything can be done with a pair of pliers, I’d be skeptical. Yes, you can grab a screw head and turn it with pliers, but a screwdriver will be a lot easier and safer. If I were paying her by the hour, I’d only be paying for one hour.
In the many years I’ve been coding professionally, I’ve found that both good and bad architectures are self-sustaining. A bad architecture will force you to pass data all over to get it where you need to, copy-paste nearly identical code in multiple places, and implement hacks to get what you need done. The learning curve will take forever, and you’ll feel dirty. Your self-esteem will fall since you’re writing buggy code you’re not proud of, and you don’t feel confident it will work for all edge cases.
A good architecture will have clear interfaces, separation of concerns, comments and unit tests. When you make a mistake it’s almost immediately underlined in red by your IDE because the static checker can catch the common problems. When you enter ‘git push origin master’, you do it confidently because the result feels right.
Is a circle a subclass of ellipse or vice versa? Depends on what you’re doing with them, but if you have a renderAsPDF() method in either of them, you’re probably doing it wrong.