C'est la raison même de tous les principes de conception objet dont on parle régulièrement (OCP, SRP, LSP, etc.)
Écrire un design parfait qui répond à tous les besoins, présent et futur, même quand les besoins changent (ce qui est toujours le cas), qui est optimisé dans tous les sens, n'est pas possible. La solution est donc très simple : écrire un design qui est conçu pour être évolutif (ie accepter facilement les changements), robuste (ie tolérant au changement)
Mon conseil : prend les principes un par un (voir Valider et corriger une architecture objet,
première et
seconde partie) et vérifie que chaque ligne de code, chaque fonction, chaque classe, respectent ces principes