J'ai vraiment besoin de voir un débat honnête et réfléchi sur les mérites du paradigme de conception d' applications d'entreprise actuellement accepté .
Je ne suis pas convaincu que les objets entité devraient exister.
Par objets d'entité, j'entends les éléments typiques que nous avons tendance à créer pour nos applications, comme "Personne", "Compte", "Commande", etc.
Ma philosophie de conception actuelle est la suivante:
- Tout accès à la base de données doit être effectué via des procédures stockées.
- Chaque fois que vous avez besoin de données, appelez une procédure stockée et itérez sur un SqlDataReader ou les lignes d'un DataTable
(Remarque: j'ai également construit des applications d'entreprise avec Java EE, les gens de Java veuillez remplacer l'équivalent pour mes exemples .NET)
Je ne suis pas anti-OO. J'écris beaucoup de classes à des fins différentes, mais pas des entités. J'admets qu'une grande partie des classes que j'écris sont des classes d'assistance statiques.
Je ne construis pas de jouets. Je parle d'applications transactionnelles volumineuses et volumineuses déployées sur plusieurs machines. Applications Web, services Windows, services Web, interaction b2b, vous l'appelez.
J'ai utilisé des OR Mappers. J'en ai écrit quelques-uns. J'ai utilisé la pile Java EE, CSLA et quelques autres équivalents. Je les ai non seulement utilisés, mais activement développé et maintenu ces applications dans des environnements de production.
J'en suis venu à la conclusion éprouvée au combat que les objets d'entité nous gênent et que nos vies seraient tellement plus faciles sans eux.
Prenons cet exemple simple: vous recevez un appel d'assistance concernant une certaine page de votre application qui ne fonctionne pas correctement, peut-être que l'un des champs n'est pas conservé comme il se doit. Avec mon modèle, le développeur chargé de trouver le problème ouvre exactement 3 fichiers . Un ASPX, un ASPX.CS et un fichier SQL avec la procédure stockée. Le problème, qui peut être un paramètre manquant à l'appel de procédure stockée, prend quelques minutes à résoudre. Mais avec n'importe quel modèle d'entité, vous lancerez invariablement le débogueur, commencerez à parcourir le code et vous pourrez vous retrouver avec 15 à 20 fichiers ouverts dans Visual Studio. Au moment où vous descendez au bas de la pile, vous avez oublié où vous avez commencé. Nous ne pouvons garder que tant de choses dans nos têtes à la fois. Le logiciel est incroyablement complexe sans ajouter de couches inutiles.
La complexité du développement et le dépannage ne sont qu'un côté de mon problème.
Parlons maintenant d'évolutivité.
Les développeurs se rendent-ils compte que chaque fois qu'ils écrivent ou modifient un code qui interagit avec la base de données, ils doivent faire une analyse approfondie de l'impact exact sur la base de données? Et pas seulement la copie de développement, je veux dire une imitation de la production, vous pouvez donc voir que la colonne supplémentaire dont vous avez maintenant besoin pour votre objet vient d'invalider le plan de requête actuel et un rapport qui s'exécutait en 1 seconde prendra maintenant 2 minutes, juste parce que vous avez ajouté une seule colonne à la liste de sélection? Et il s'avère que l'index dont vous avez maintenant besoin est si grand que le DBA va devoir modifier la disposition physique de vos fichiers?
Si vous laissez les gens s'éloigner trop du magasin de données physique avec une abstraction, ils créeront des ravages avec une application qui doit évoluer.
Je ne suis pas un fanatique. Je peux être convaincu si je me trompe, et peut-être que je le suis, car il y a une telle poussée vers Linq vers Sql, ADO.NET EF, Hibernate, Java EE, etc. Veuillez réfléchir à vos réponses, s'il me manque quelque chose, je veux vraiment savoir ce que c'est, et pourquoi je devrais changer ma façon de penser.
[Éditer]
Il semble que cette question est soudainement à nouveau active, alors maintenant que nous avons la nouvelle fonctionnalité de commentaire, j'ai commenté directement plusieurs réponses. Merci pour les réponses, je pense que c'est une discussion saine.
J'aurais probablement dû être plus clair que je parle d'applications d'entreprise. Je ne peux vraiment pas commenter, par exemple, un jeu qui s'exécute sur le bureau de quelqu'un ou une application mobile.
Une chose que je dois mettre ici en haut en réponse à plusieurs réponses similaires: l'orthogonalité et la séparation des préoccupations sont souvent citées comme des raisons d'aller entité / ORM. Les procédures stockées sont pour moi le meilleur exemple de séparation des préoccupations auquel je puisse penser. Si vous interdisez tout autre accès à la base de données, autrement que via des procédures stockées, vous pourriez en théorie reconcevoir l'ensemble de votre modèle de données et ne casser aucun code, à condition de conserver les entrées et les sorties des procédures stockées. Ils sont un parfait exemple de programmation par contrat (à condition d'éviter de "sélectionner *" et de documenter les jeux de résultats).
Demandez à quelqu'un qui travaille dans l'industrie depuis longtemps et qui a travaillé avec des applications à longue durée de vie: combien de couches d'applications et d'interface utilisateur se sont succédées alors qu'une base de données vivait? À quel point est-il difficile d'ajuster et de refactoriser une base de données alors qu'il existe 4 ou 5 couches de persistance différentes générant du SQL pour obtenir les données? Vous ne pouvez rien changer! Les ORM ou tout code générant du SQL verrouillent votre base de données dans la pierre .