Есть класс User отвечающий за действия с пользователем и класс Payment отвечающий за финансовые операции. И вот юзер пополнил уже себе баланс, деньги у него на счету и он жмёт кнопку Upgrade что бы улучшить свой аккаунт до платного. Изменения произойдут и в таблице users и в таблице payments т.к. будет зафиксировано когда и на что были потрачены деньги, которые лежат на чету.
Какой класс должен осуществить это действие Upgrade: User или Payment и почему?
Согласно шаблону Information Expert нужно назначит эту обязанность тому классу, который обладает достаточной информацией для ее выполнения. Если такого класса не существует, то можно воспользоваться шаблоном Pure Fabrication и создать новый класс для этой обязанности, как посоветовал другой автор ответа.
Можно плодить классы, как советуют другие, и они так то правы. Это Тру вей.
НО. это как с нормализацией БД и синдромом Миддла, когда везде все видят паттерны.
Если система не большая и не предполагает постоянных доработок и изменений и т.п.
ТО в класс User. Апдейт относительно юзера - значит в юзера. Все :)
Кто делает - что делает.
Код просто должен быть логичным и как можно менее запутанным.
Увеличение гибкости - увеличение запутанности.