Допустим есть какой-то базовый класс. И есть несколько десятков классов которые от него наследуются.
Допустим в базовом классе есть метод который отдает какие то данные на основе значения какого-то аттрибута конкретного наследника. Аттрибут обязательно присутствует у всех наследников и дефолтно в базовом классе.
У малой части наследников (5-10%) этот метод не должен быть использован.
При этом присутствует общий код который вызывается из разных мест и подтягивает любого наследника в зависимости от ситуации. В этом же коде есть обращение к этому методу и совершение действий с результатом.
Внимание вопрос, как бы вы сделали с точки зрения организации кода и почему:
1) Оставил бы метод в базовом классе. В наследниках бы реализовал переопределенные методы возвращающие False|None|Null|… . В общем коде бы проверил что метод вернул не False|None|Null|… и только тогда бы продолжал работать с данными, которые вернул метод.
2) Выпилил бы метод из базового класса. Реализовал бы его копипасту во всех в которых нужно. В общем коде бы сделал проверку что у наследника есть такой метод и только тогда бы вызвал его и продолжал работать с его даннымми.
3) Оставил бы метод в базовом классе. В наследниках бы добавил отдельный аттрибут о возможности вызова этого метода. В общем коде бы проверял значение этого аттрибута и только тогда бы вызвал этот метод и продолжал бы работать с его данными.
4) etc?
Пример петон кода
https://hastebin.com/uvijojorap.pyВариант 1
https://hastebin.com/exasilagug.pyВариант 2
https://hastebin.com/ukozoqezok.pyВариант 3
https://hastebin.com/isecayetax.pyВариант 4 ??