Необходимо принять во внимание принцип единой ответственности . По сути, каждый класс должен нести ответственность за одну «вещь» и должен полностью инкапсулировать эту одну ответственность. И вы должны наследовать только там, где ответственность расширена. Вы всегда должны быть в состоянии сказать, что класс расширения составляет 100% от родительского и более (более в определенном смысле). У вас никогда не должно быть ситуации, когда ребенок является подмножеством родителя и «меньше». Таким образом, человек, расширяющий мир, не является хорошим дизайном, поскольку есть аспекты мира, которые не имеют отношения к человеку.
Итак, если мы посмотрим на пример, вы бы поместили методы экземпляра на уровень, который определяется ролью этого конкретного класса. Итак, давайте рассмотрим пример более определенно:
class Person:
name: ""
birthDate: ""
class PoliceOfficer extends Person:
badgeNumber: ""
Очевидно, что это псевдокод, но он демонстрирует, что происходит.
Теперь, где бы вы добавили метод move()
? Мы можем добавить его к PoliceOfficer
, но тогда мы нарушим инкапсуляцию Person
, так как человек также может двигаться.
class Person:
def move(world):
Но куда бы мы добавили метод issueTicket()
? Обобщенный Person
не может выдать билет, поэтому если бы мы добавили его в класс Person
, мы бы сняли с него ответственность. Поэтому вместо этого мы добавили бы его к PoliceOfficer
, поскольку именно здесь это имеет смысл.
Что касается создания зависимости, вы должны всегда отдавать предпочтение композиции, а не наследованию . Таким образом, в этом смысле может быть столько зависимостей, сколько вы хотели бы, поскольку все они являются программными зависимостями (ну, вроде как). Поскольку move()
принимает экземпляр world
(или объект с мировым интерфейсом), зависимость выталкивается из класса в вызывающий код. Таким образом, код вашего класса остается довольно открытым и независимым, но при этом остается продуктивным.
Это обычно считается плохой практикой для жестких кодовых зависимостей. Но инъекция их (через инъекцию зависимостей или композицию) обычно считается хорошей вещью.
В итоге: Поместите методы экземпляра там, где логично их разместить.