Pour ajouter à la réponse perspicace de casablanca - si plusieurs classes doivent faire les mêmes choses de base avec un certain type d'entité (ajouter des utilisateurs à une collection, gérer les messages, etc.), ces processus doivent également être séparés.
Il existe plusieurs façons de le faire - par héritage ou par composition. Pour l'héritage, vous pouvez utiliser des classes de base abstraites avec des méthodes concrètes qui fournissent les champs et les fonctionnalités pour gérer les utilisateurs ou les messages par exemple, et avoir des entités comme chatroom
et user
(ou toute autre) étendre ces classes.
Pour diverses raisons , c'est une bonne règle générale d'utiliser la composition plutôt que l'héritage. Vous pouvez utiliser la composition pour le faire de différentes manières. Étant donné que la gestion des utilisateurs ou des messages est une fonction centrale de la responsabilité des classes, on peut soutenir que l'injection de constructeur est la plus appropriée. De cette façon, la dépendance est transparente et un objet ne peut pas être créé sans avoir la fonctionnalité requise. Si la façon dont les utilisateurs ou les messages sont traités est susceptible de changer ou d'être étendue, vous devriez envisager d'utiliser quelque chose comme le modèle de stratégie .
Dans les deux cas, assurez-vous de coder vers des interfaces, pas des classes concrètes pour plus de flexibilité.
Cela étant dit, tenez toujours compte du coût de la complexité supplémentaire lors de l'utilisation de tels modèles - si vous n'en avez pas besoin, ne le codez pas. Si vous savez que vous n'allez probablement pas changer la façon dont la gestion des utilisateurs / messages est effectuée, vous n'avez pas besoin de la complexité structurelle d'un modèle de stratégie - mais pour séparer les préoccupations et éviter la répétition, vous devez toujours divorcer des fonctionnalités communes à partir des instances concrètes qui l'utilisent - et, s'il n'existe aucune raison impérieuse du contraire, composez les utilisateurs de ces fonctionnalités de gestion (chatrooms, utilisateurs) avec un objet qui effectue la gestion.
Pour résumer:
- Comme l'a écrit casablanca: Séparez et encapsulez les salons de discussion, les utilisateurs, etc.
- Fonctionnalité commune séparée
- Envisagez de séparer les fonctionnalités individuelles pour séparer la représentation des données (ainsi que l'accès et la mutation) des fonctionnalités plus complexes sur des instances individuelles de données ou des agrégats de celles-ci (par exemple, quelque chose comme
searchUsers
pourrait aller dans une classe de collection, ou un référentiel / carte d'identité )