OOP is not that bad
Scope of the Debate
- Most comments distinguish “OOP the paradigm” from “OOP as practiced” in class‑hierarchy-heavy languages (Java, C++, etc.).
- The original article’s logger example is seen as highlighting trade‑offs between OOP and functional effects handling, not proving one paradigm superior.
Inheritance, Tight Coupling, and Composition
- Widespread agreement that inheritance—especially deep or implementation inheritance—is a major source of tight coupling and “fragile base class” problems.
- Many argue that inheritance works only in small, single‑author codebases; in teams it creates brittle hierarchies and painful refactors.
- “Prefer composition over inheritance” is repeated often: use interfaces/traits and object composition instead of taxonomic class trees.
- Some go further: coupling methods to mutable state is framed as the core modularity problem in OOP; FP’s separation of data and functions is presented as inherently more modular.
Functional Programming vs Imperative/OOP
- FP advocates claim functions and immutable data behave like “Lego bricks”: easy to recombine without refactoring primitives.
- Critics respond that FP often requires broader structural changes when requirements change (e.g., adding new state or behavior), while imperative code can be locally patched.
- There is back‑and‑forth about whether FP really forces “rewrite-only” development or simply demands better decomposition.
- Performance concerns arise around multiple passes (map/filter chains, multi-loop code), with counterpoints about laziness, fusion, and compilers optimizing away overhead.
Logging Example and Effects
- Several commenters show alternative Haskell/FP designs (functions, records, effect systems) that match or exceed the OOP logger flexibility, arguing the article’s FP side is unidiomatic or overly constrained.
- Others say the pain is about effect systems vs direct side effects, not FP vs OOP; once you adopt structured effects, you pay a complexity cost in any paradigm.
Pedagogy, Patterns, and Culture
- Many blame how OOP is taught: early focus on class taxonomies, design patterns, and inheritance rather than modularity, interfaces, and composition.
- GoF patterns and “pure OOP” curricula are criticized as having encouraged over‑engineered, brittle designs.
- Several propose a “middle road”: functional core with an imperative/OOP shell, or multi‑paradigm languages (e.g., Rust, Kotlin, Scala, C#) used pragmatically rather than dogmatically.