J'essaie de créer un modèle d'objet pour un utilisateur et une salle de discussion. Je suis coincé sur où placer certaines fonctionnalités lorsque les objets collaborent.
Pour le moment, toute la fonctionnalité de l'utilisateur est à l'intérieur de la classe d'utilisateurs, un extrait de ses méthodes est:
User.JoinChatRoom()
User.WriteChatRoomMessage()
User.Authenticate()
User.JoinGroup()
Je reconnais que c'est un "objet de Dieu"/"blob" "et nous pourrions plutôt modéliser cela comme des objets séparés de chat, d'utilisateur et de groupe avec les méthodes:
User.Authenticate()
ChatRoom.AddPlayer(User u)
ChatRoom.WriteMessage(String msg)
Group.AddPlayer(User u)
Mais je suis confus à propos de ce refacteur depuis que je crois comprendre que les méthodes d'objet sont qu'ils effectuent une opération sur l'objet. Par conséquent, vous pouvez commander l'utilisateur à écrire dans une salle de discussion, commandez l'utilisateur à rejoindre un groupe, etc.
Mais avec le deuxième modèle "Nettoyant", cela ne semble pas aller, il n'y a pas de méthode explicite JoinChatRoom()
.
Comment puis-je concevoir et penser à quelles méthodes doivent être jointes à un objet?
Parfois, vous voudrez peut-être envisager des forces contradictoires: par exemple, dans un programme de discussion, l'interface utilisateur peut vouloir parler à l'objet User
uniquement, car il ne devrait pas être préoccupé par la mise en œuvre interne, tandis que le User
objet peut déléguer la fonction à l'objet ChatRoom
, qui serait le bon objet de faire le travail réel.
Ceci est quelque peu similaire au fonctionnement des bureaux de front et des bureaux de retour d'une organisation: en tant que client, vous parlez à la personne du bureau de la frontière susceptible de déléguer des tâches à différents bureaux, mais vous ne voulez pas ou ne devez pas vous inquiéter de cette structure interne.
Lorsque vous avez du mal à trouver où le code va, déterminez s'il risque d'abstraction abstraction (s), qui serait une autre entité ou objet ou acteur.
Considérez le code client consommant, dont le modèle d'utilisation doit être aussi simple que possible, ce qui concerne peu d'objets, plutôt que de traiter inutilement avec des paires d'objets, un autre signe d'abstraction manquante (et ayant également des opérations simples plutôt que des opérations multilignes ou multi-appels pour obtenir tort).
L'identification des abstractions manquantes peut aider à rendre les choses plus naturelles pour le code client consommant et peut également aider avec les choix de mise en œuvre.