Metoda save() ukládá objekt User, ta tam být může. Metoda sendEmail() ale posílá zprávu, s objektem User nemá společného nic, sendEmail bude odpovědnost jiné třídy, která umí poslat e-mail.
Profilová fotka patří jednoznačně uživateli, ale operace nad tou fotkou už také patří do jiné třídy, žádná věda.
Tak tohle co píšeš je typické zmatení, je to totiž tvůj subjektivní dojem a neuvědomuješ si to. Řekněme, že děláš inf. systém typu sociální tíť. Místo sendEmail() tam dáme raději sendPM(), to víc pasuje. User z hlediska OOP v tomto systému představuje prostě Usera, který se přihlašuje do ystému, odhlašuje, na něco kliká, atd. Proč by tam nemohl mít metodu sendPM(msg), ale save() ano? To je totiž tvoje vlastní subjektivní asociace, že si třídu User bereše jako něco strikně vztahujícího se k databázi. User v OOP nemá mít save() o nic víc, než sendPM(msg).
Jediné zmatení je, zda se bavíme o tom, jestli ten objekt vůbec smí mít metodu save(), zda to samo o sobě porušuje nějaký princip, nebo zda má tu příslušnou operaci také sám provést.
Pokud přistoupím na tvojí argumentaci, že ty různé metody, které píšeš, mají úplně stejný smysl tam (ne)být, pak tou metodou, která tam ve skutečnosti patří (pro nejobecnější případ), je metoda
User::accept(visitor), s imlementací
visitor.visit(this). Přičemž budu mít různé implementace dle libosti, např.
FileSerializer::visit(User),
DbSerializer::visit(User), apod. Framework tohle ale obvykle dělá za mě, vytvoří proxy, do databáze ukládá třeba pouze změny, atd..
A ta metoda send() ve třídě
User má jednu podstatnou vadu, že není jasný příjemce, kdo je odesílatel, a co se posílá...