As for me, I have been seriously studying the roots and semantics of OO languages for two years and I feel like an alien 👽 when I hear others talk about the subject.
For starters, there's no consensus on an exact definition of OO (so take it with a grain of salt who sells exact definitions 😞). It is therefore very risky to take a stand because it will require you to have an understanding and arguments that 99.9% of developers do not have (including me at the moment).
Below are two links that are rather important to read to start getting a good idea of the fundamental principles of OO:
- The definitions of Alan Kays (the one many consider to be the founding father of OO with Smalltalk).
- A Proposal for Simplified, Modern Definitions of "Object" and "Object Oriented" (the definition I find the most serious at the moment and which I discovered through Wirfs-brock).
There are many other definitions and speculations that you can find here. For my part, I also read a good part of Theory of objects which allowed me to open my eyes to a lot of notions at a semantic level.
Second, I really recommend that you dig into the notion of Data abstraction. It's such a foundation of what makes up programming languages that I don't even understand how the majority of developers miss it.
Some resources to read / listen to:
- How Data Abstraction changed Computing forever | Barbara Liskov | TEDxMIT
- On Understanding Data Abstraction, Revisited
- Object-Oriented Programming Versus Abstract Data Types
I also recommend Programming Paradigms for Dummies which allows you to build a bridge with other notions (and not only OO because it is important to also open up to the rest).
If you have started reading it means that you have understood that I am not a fan of boat explanations in "It's a cat that extends from an animal to meow" 😏.
I've never been a big fan of these high-level articles because I always felt there was a lack of fundamental thought in the process. Abstracting the technical elements to communicate them better is an important thing, but I don't think we should stray too far from a more scientific reality either.
If you want to continue to really dig into object-oriented programming, here are various references that I have read myself (be careful, they are often difficult to access):
👀 The references above may also help you understand some Javascript roots better. I was personally really shocked to discover that many of what are criticized as features that were randomly done in 10 days are ultimately semantic notions thought over decades ago.
- Inheritance Is Not Subtyping
- A Behavioral Notion of Subtyping
- A Denotational Semantics of Inheritance
- Representing Type Information in Dynamically Typed Languages
- Concurrent Object-Oriented Programming in Act 1
- The Power of Interoperability: Why Objects Are Inevitable
- Law of demeter
- Object Design - Rebecca Wirfs-Brock and Alan McKean
From all this you will be able to find several hundred references. I have read other works but I do not think they have a place here (although I remain open to discussion if you wish to deepen this yourself with my recommendations).
⬅️ 🌇 Architecture & Paradigms: Clean Code | ➡️ 🌇 Architecture & Paradigms: Design Pattern