И перестаньте чинить патчи.

Модули высокого уровня не должны зависеть от модулей низкого уровня. Оба должны зависеть от абстракций. Кроме того, абстракция не должна зависеть от деталей. Детали должны зависеть от абстракций. Эти абстрактные интерфейсы становятся соглашением о том, как два модуля будут взаимодействовать. Каждый модуль может изменяться внутри, но до тех пор, пока реализуется абстрактный интерфейс, они по-прежнему работают вместе.

Ни один класс не должен быть производным от конкретного класса. Если вы наследуете конкретный класс, вы становитесь более зависимым от конкретных реализаций.

Ни один метод не должен переопределять реализованный метод. Это верный способ найти сюрпризы в будущем. Люди ожидают одного поведения, а потом вы меняете поведение. Ошибки последуют.

Для создания экземпляра переменной следует использовать фабрики или инфраструктуру внедрения зависимостей.

Сокращение зависимостей и опора на абстракции приводит к тому, что код легче тестировать, легче изменять и проще поддерживать.