Searching for a concrete method implementation? Go back and forth, up and down.
TL;DR: Don't ab(use) hierarchies.
Problems
Deep Hierarchies
Subclassification for Code Reuse
Readability
Low Cohesion
High Coupling
Solutions
Favor composition over inheritance.
Refactor deep hierarchies.
Sample Code
Wrong
<?
abstract class Controller {
}
class BaseController extends Controller {
}
class SimpleController extends BaseController {
}
class ControllerBase extends SimpleController {
}
class LoggedController extends ControllerBase {
}
class RealController extends LoggedController {
}
Right
<?
interface ControllerInterface {
}
abstract class Controller implements ControllerInterface {
}
final class LoggedControllerDecorator implements ControllerInterface {
}
final class RealController implements ControllerInterface {
}
Detection
Any linter can check for suspects against a max depth threshold.
Tags
- Hierarchy
Conclusion
Many novice programmers reuse code through hierarchies. This brings high coupled and low cohesive hierarchies.
Johnson and Foote established in their paper this was actually a good design recipe back in 1988. We have learned a lot from there.
We must refactor and flatten those classes.
Relations
Code Smell 11 - Subclassification for Code Reuse
Maxi Contieri ・ Oct 30 '20
More info
%[https://en.wikipedia.org/wiki/Yo-yo_problem]
Coupling: The one and only software design problem
Maxi Contieri ・ Feb 6 '21
Hierarchies should be deep by Johnson and Foote
An error arises from treating object variables (instance variables) as if they were data attributes and then creating your hierarchy based on shared attributes. Always create hierarchies based on shared behaviors, side.
David West
Software Engineering Great Quotes
Maxi Contieri ・ Dec 28 '20
This article is part of the CodeSmell Series.