2009-06-09 8 views
0

J'ai une classe qui représente une ligne dans une table. Je veux ajouter une fonction qui manipule les données dans la rangée. Où devrais-je ajouter la fonction?Où devrait aller ma méthode?

1) à l'intérieur de la classe parce qu'elle est liée à la classe 2) à l'extérieur de la classe dans une classe auxiliaire distincte? Dans le passé, j'aurais toujours choisi le numéro 1. Je commence à penser que le numéro 2 est une meilleure réponse, car il sépare la logique dans sa propre classe encapsulée et réduit la complexité de la classe de données. Je pense que la classe de données devrait être aussi nue que possible et ne contenir que des membres de données sans aucune logique.

Quelle est la manière la plus agile/la meilleure de faire ceci?

Répondre

2

La responsabilité unique principe a été déclaré comme « Il ne devrait y avoir une raison pour un objet à changer. » Avec votre option 1, l'objet peut changer pour deux raisons: vous pouvez modifier les données stockées dans l'objet ou vous pouvez changer de système de base de données (par exemple, mySQL to PostgrSQL).

Bien sûr, comme tout, il est un compromis. Il y a un certain avantage à avoir tout le code au même endroit. S'il est peu probable que vous passiez à un autre SGBDR à l'avenir, alors tout combiner en une seule classe pourrait être un bon choix.

Mais si vous ne prévoyez de passer à une autre base de données à l'avenir - ou même soutenir backends de plusieurs bases de données - alors vous serez probablement mieux mettre la persistance dans une catégorie distincte.

+1

sauf si vous développez une infrastructure réutilisable, ne vous inquiétez pas du changement de système de base de données.la plupart des applications ne finiront jamais par changer de système de base de données, c'est donc un travail généralement inutile. Bien sûr, si vous * travaillez * sur un framework réutilisable que d'autres utiliseront dans des environnements imprévus, alors oui, il est logique de passer du temps à l'implémenter. –

+0

Et parfois vous * devrez * changer de système de base de données quand vous ne vous attendiez pas à (nous est arrivé). Mais c'est quelque chose que vous ne devriez aborder que lorsque vous en avez besoin - cela ne vaut pas la peine de transporter la complexité si vous n'en avez pas encore besoin. –

3

cela dépend si vous préférez plus d'un "enregistrement actif", ou un "référentiel". Je ne suis pas sûr qu'il y ait vraiment une bonne réponse, juste ce qui a du sens dans votre code. Je considérerais également la conception du reste du code dans la façon dont vous concevez ceci, car la cohérence est tout aussi importante qu'un bon design.

2

Dans un sens MVC pur, le numéro 2 est votre meilleur pari. Créez un modèle de données et laissez-le libre de toute logique d'implémentation. Cela vous permettra potentiellement de réutiliser le modèle dans toutes les applications. Le contrôleur peut alors héberger la logique d'implémentation spécifique à l'application qui manipule les données.

0

Cela dépend de la fonction. Le but d'une classe est d'encapsuler des fonctions et des données, en général.

Si la fonction est spécifique au type de données contenues dans la classe rangée, et la classe de ligne est générale, vous pouvez alors sous-classe de la ligne et de s'y tenir la fonction là. Une classe auxiliaire est utile pour décomposer la complexité d'une classe, mais vous devez vous assurer que le rôle de l'assistant par rapport à la classe est clairement défini de sorte que la maintenance future ne trouble pas ce contrat.

1

La bonne réponse est "ça dépend"; "manipuler [les données] dans la rangée" peut justifier l'une ou l'autre réponse.

En ce qui concerne la séparation des préoccupations, vous avez besoin d'identifier ce que l'abstraction de cette fonction manipule. Est-ce l'abstraction d'une rangée dans la base de données? Mettez-le dans cette classe. Est-ce que l'objet de votre modèle de données est implémenté en termes de ligne dans la base de données? Mettez-le dans cette classe.

De façon plus générale, vous devez mettre les fonctions au niveau d'abstraction auquel ils se rapportent, ce qui est très dépendant de votre conception globale.

Questions connexes