139 votes

Pourquoi avons-nous besoin des objets entité ?

Ok, je sais que je pourrais être downvoted dans l'oubli pour cette question, en particulier compte tenu de ma position sur la question, mais j'ai vraiment besoin de voir certains honnête, attentionné débat sur les mérites de la actuellement accepté d'applications d'entreprise paradigme de conception.

Je ne suis pas convaincu que les objets de l'entité doit exister.

Par les objets de l'entité, je veux dire les choses typiques que nous avons tendance à construire pour nos applications, comme "Personne", "Compte", "Ordre", etc.

Ma conception de la philosophie est la suivante:

  • Tous les accès de base de données doit être accomplie à l'aide de procédures stockées.
  • Chaque fois que vous avez besoin de données, appeler une procédure stockée et itérer sur un SqlDataReader ou les lignes dans un DataTable

(Note: j'ai aussi construit des applications d'entreprise avec Java EE, java gens veuillez remplacer les equvalent pour mon .NET des exemples)

Je ne suis pas anti-OO. J'écris beaucoup de classes à des fins différentes, pas seulement des entités. J'admets que une grande partie des classes que j'écris sont statiques des classes d'assistance.

Je ne suis pas des jouets de construction. Je parle de grand volume transactionnel des applications déployées sur plusieurs machines. Les applications Web, les services de windows, web services, b2b interaction, you name it.

J'ai utilisé OU Cartographes. J'ai écrit un peu. J'ai utilisé le Java EE de la pile, l'AAPC, et quelques autres équivalents. Je n'ai pas utilisé, mais activement développé et maintenu ces applications dans les environnements de production.

Je suis venu à la bataille testés conclusion que les objets de l'entité sont arriver dans notre direction et notre vie serait tellement plus facile sans eux.

Considérons ce simple exemple: vous recevez un appel de soutien sur une certaine page dans votre application qui ne fonctionne pas correctement, peut-être l'un des champs n'est pas persisté comme il le devrait. Avec mon modèle, le réalisateur attribué à trouver le problème s'ouvre exactement 3 fichiers. Un ASPX, un ASPX.CS et un fichier SQL avec la procédure stockée. Le problème, qui pourrait être un paramètre manquant à l'appel de procédure stockée, prend quelques minutes pour le résoudre. Mais avec n'importe quel modèle d'entité, vous aurez immanquablement de lancer le débogueur, commencer parcourant le code, et vous pouvez vous retrouver avec 15 à 20 fichiers ouvert dans Visual Studio. Par le temps que vous descendez au bas de la pile, vous avez oublié où vous avez commencé. Nous ne pouvons garder beaucoup de choses dans nos têtes à la fois. Le logiciel est incroyablement complexe, sans ajout de couches inutiles.

La complexité de développement et de dépannage sont juste à côté de mon seul reproche.

Maintenant, nous allons parler de l'évolutivité.

Les développeurs de réaliser que chaque fois qu'ils écrivent ou de modifier tout le code qui interagit avec la base de données, ils ont besoin de faire une analyse approfondie de l'impact exact sur la base de données? Et pas seulement le développement de la copie, je veux dire un synoptique de la production, de sorte que vous pouvez voir que la colonne supplémentaire vous maintenant besoin de votre objet juste la nullité de l'actuel plan de requête et d'un rapport qui a été exécuté en 1 seconde va maintenant prendre plus de 2 minutes, juste parce que vous avez ajouté une seule colonne à la liste de sélection? Et il s'avère que l'index vous maintenant besoin est si grand que l'administrateur va avoir à modifier l'agencement de vos fichiers?

Si vous laisser les gens s'éloignent trop de la physique de la banque de données avec une abstraction, ils vont faire des ravages avec une application qui a besoin à l'échelle.

Je ne suis pas un zélote. Je peux être convaincu si j'ai tort, et peut-être que je suis, étant donné qu'il existe une forte tendance à l'Linq to Sql, ADO.NET EF, Hibernate, Java EE, etc. Merci de penser à vos réponses, si je suis absent quelque chose que je veux vraiment savoir ce que c'est, et pourquoi je devrais changer ma façon de penser.

[Modifier]

Il ressemble à cette question est tout à coup de nouveau actif, alors, maintenant que nous avons la nouvelle fonctionnalité de commentaire j'ai commenté directement sur plusieurs réponses. Merci pour les réponses, je pense que c'est une bonne discussion.

J'ai probablement dû être plus clair que je suis en train de parler des applications d'entreprise. Je ne peux pas vraiment commenter, dire, un jeu qui tourne sur un bureau ou une application mobile.

Une chose que j'ai à mettre en place ici, en haut, en réponse à plusieurs des réponses similaires: orthogonalité et la séparation des préoccupations reçois souvent cités comme raisons d'aller de l'entité/ORM. Procédures stockées, pour moi, sont le meilleur exemple de la séparation des préoccupations que je peux penser. Si vous désactivez tous les autres accès à la base de données, autres que via des procédures stockées, vous pourriez en théorie refonte de l'ensemble de votre modèle de données et pour ne pas casser tout le code, tant que vous avez maintenu les entrées et les sorties des procédures stockées. Ils sont un parfait exemple de la programmation par contrat (si tant est que vous éviter un "select *" et de documenter le résultat des ensembles).

Demandez à quelqu'un qui a été dans l'industrie pendant un long moment et a travaillé avec les applications de longue durée: comment beaucoup d'application et de l'INTERFACE utilisateur couches sont venus et repartis, tandis qu'une base de données a vécu? Comment est-il difficile à régler et refactoriser une base de données lorsqu'il y a 4 ou 5 couches de persistance de la génération de SQL pour obtenir les données? Vous ne pouvez pas changer quoi que ce soit! Orm ou tout autre code qui génère le SQL de verrouillage de votre base de données dans la pierre.

59voto

Kristopher Johnson Points 34554

Je pense qu'il revient à la complexité de la "logique" de la demande est, et où vous l'avez mise en place. Si toute votre logique est dans des procédures stockées, et tous de votre demande ne fait qu'appeler ces procédures et d'afficher les résultats, puis de développer les objets de l'entité est en effet une perte de temps. Mais pour une application où les objets sont riches en interactions les uns avec les autres, et la base de données est un mécanisme de persistance, il peut y avoir de valeur à la réalisation de ces objets.

Donc, je dirais qu'il n'y a pas de one-size-fits-all réponse. Les développeurs n'ont besoin d'être conscient que, parfois, à vouloir trop OO peuvent causer plus de problèmes qu'elle n'en résout.

27voto

nachojammers Points 1163

La théorie dit que très cohésif, faiblement couplé implémentations sont la voie à suivre.

Donc je suppose que vous vous interrogez sur cette approche, à savoir la séparation des préoccupations.

Mon aspx.cs fichier en interaction avec la base de données, l'appel d'une procédure stockée, et la compréhension IDataReader?

Dans un environnement d'équipe, en particulier lorsque vous avez moins de technique personnes s'occupant de la aspx partie de l'application, je n'ai pas besoin de ces gens de pouvoir "toucher" ce genre de choses.

La séparation de mon domaine à partir de ma base de données protège-moi de changements structurels dans la base de données, certes, une bonne chose? Assurez-vous de la base de données d'efficacité est absolument important, afin de laisser à quelqu'un qui est plus excellent à ce genre de choses face à ce genre de choses, en un seul endroit, avec aussi peu d'impact sur le reste du système possible.

Sauf si je suis malentendu votre approche, un changement structurel dans la base de données pourrait avoir une grande zone d'impact avec la surface de votre application. Je vois que cette séparation des préoccupations, permet à moi et mon équipe pour le minimiser. Aussi tout nouveau membre de l'équipe doit comprendre cette approche mieux.

Aussi, votre approche semble plaider la logique métier de votre application de résider dans votre base de données? Cela sent mauvais pour moi, le SQL est vraiment bon à l'interrogation des données, et non pas, à mon humble avis, exprimant une logique d'entreprise.

Une idée intéressante mais, bien qu'il se sent un peu loin de SQL dans le aspx, qui, de mon bon vieux non structurées asp jours, me remplit d'effroi.

25voto

Dan Points 12178

L'une des raisons de séparation de domaine de votre modèle de votre modèle de base de données.

Ce que je faire est d'utiliser le Test Driven Development donc j'écris mon INTERFACE et le Modèle calques et la couche de Données est moqué, pour que l'INTERFACE utilisateur et le modèle est construit autour d'domaine des objets spécifiques, puis plus tard, j'ai la carte de ces objets que jamais la technologie, je suis à l'aide de la Couche de Données. Ses une mauvaise idée de laisser la structure de base de données déterminent la conception de votre application. Si possible, écrire la première application et de laisser cette influence de la structure de votre base de données, et non pas l'inverse.

21voto

Webjedi Points 2554

Pour moi ça se résume à je ne veux pas que ma demande à être préoccupé par la façon dont les données sont stockées. Je vais probablement avoir giflé de dire ça...mais votre demande n'est pas vos données, de données est un artefact de l'application. Je veux que ma demande à être pensée en termes de Clients, des Commandes et des Articles, et non pas une technologie comme les ensembles de données, les tables de données et des datarow...car qui sait combien de temps ceux-ci seront autour de.

Je suis d'accord qu'il y a toujours une certaine quantité de couplage, mais je préfère que le couplage de regarder vers le haut plutôt que vers le bas. Je peux modifier les branches et les feuilles d'un arbre plus facile que je peux modifier, c'est le tronc.

J'ai tendance à réserver sprocs pour les rapports que les requêtes ont tendance à être un peu plus méchant que les applications d'accès aux données.

J'ai aussi tendance à penser avec la bonne unité de test dès le début que le scénario est comme cette colonne n'étant pas persisté est susceptible de ne pas être un problème.

16voto

Chris Lively Points 59564

Eric, tu es mort. Pour toute application vraiment évolutive / facilement maintenue / robuste, la seule vraie réponse est de se passer de toutes les ordures et de s'en tenir aux bases.

J'ai suivi une trajectoire similaire avec ma carrière et suis arrivé aux mêmes conclusions. Bien sûr, nous sommes considérés comme des hérétiques et regardé drôle. Mais mes affaires fonctionnent et fonctionnent bien.

Chaque ligne de code devrait être regardée avec suspicion.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X