J'ai utilisé des rails pendant plus de 4 ans, donc évidemment j'aime les rails et j'aime faire des choses les rails et parfois je tombe sans le savoir sur le côté obscur. P>
J'ai récemment pris le code de nettoyage par oncle Bob. Je suis au chapitre 6 et un peu confus si nous étant comme des rails développeurs brisent la règle très fondamentale de OO Design, c'est-à-dire la loi de déméger ou d'encapsulation? La loi de Demeter stipule qu'un objet ne devrait pas connaître les entraches d'un autre objet et il ne faut pas appeler des méthodes sur des objets renvoyés par une méthode, car lorsque vous le faites, il suggère qu'un objet sait trop sur l'autre objet. p>
Mais très souvent, nous appelons des méthodes sur un autre objet d'un modèle. Par exemple, lorsque nous avons une relation comme «une commande appartient à un utilisateur». Ensuite, très souvent, nous finissons par faire commande.user.name ou pour l'empêcher de ressembler à une épave de train, nous configurons un délégué à faire de la commande. Nom. Nom. Nom. p>
n'est-ce pas toujours comme enfreindre la loi de Demeter ou d'encapsulation? P> LI>
L'autre question est la suivante: Activeiverecord est-elle juste une structure de données ou un objet de transfert de données qui interface avec la base de données? p> li>
Si oui, alors nous ne créons pas de structure hybride, c'est-à-dire une moitié de la structure d'objet et demi de données en mettant nos règles d'entreprise dans les modèles d'Activerecord? P> LI> ol>
4 Réponses :
IMHO Si vous suivez trop l'approche puriste, vous vous retrouvez dans un gâchis comme Java où il utilise tous les modèles de conception appropriés, mais personne ne peut se souvenir des huit lignes de code dont vous avez besoin pour ouvrir un fichier et lire son Contenu. P>
Rails 'ActiveRecord Framework est une mise en œuvre de Martin Fowler's Modèle de conception d'enregistrement actif . Les enregistrements actifs dans les rails ne sont certainement pas que des structures de données muettes ou des DTO, car ils ont un comportement: ils peuvent la validation, ils peuvent vous dire si leurs attributs ont changé, etc. Et vous êtes libre et en effet encouragé , d'ajouter votre propre logique d'entreprise là-bas. P>
rails en général encourage la bonne pratique par ex. Vinaigre mvc et syntaxique pour faire de mauvaises choses difficiles et / ou moche. P>
Les rails encouragent définitivement les bonnes pratiques et, comme vous avez mentionné l'un des locaux de base étant MVC, contrôleur skinny et modèle de graisse, etc. Cependant, à propos de votre première partie de la réponse, je ne suis pas sûr que quelqu'un puisse vraiment se retrouver dans un gâchis en suivant De bonnes motifs dans une langue particulière Bien que l'on puisse certainement créer un désordre dans n'importe quelle langue, y compris Ruby, en appliquant aveuglément un modèle de conception qui ne convient pas à un problème donné.
Dans le cas de Java, c'est un gâchis parce qu'il entrave la productivité. Il est extrêmement facile de faire les choses avec des rails.
Vrai et je suis tout à fait d'accord! Mais si vous avez une application de petites rails et si vous ne suivez pas de bons principes de conception, cela peut avoir beaucoup d'importance. Bien que lorsque l'application se développe au-dessus d'un certain niveau et que vous continuez à ajouter du code sans trop penser, il peut devenir aussi désordonné que tout autre code écrit dans une autre langue. Surtout quand vous voyez des épaves de train (order.user.name.split ('')) et des objets de modèle accessibles directement à partir de vues. Il devient un cauchemar à maintenir et ajoutez de nouvelles fonctionnalités au code existant.
C'est vrai pour n'importe quelle langue cependant, n'est-ce pas? Vous pouvez créer une grande boule poilue de boue à l'aide de PHP et de ce que j'ai entendu dire cela vous conduit probablement sur ce chemin. D'autre part, si vous êtes un bon programmeur discipliné, il est parfaitement possible de créer une base de code maintenable en utilisant n'importe quelle langue.
rails est des rails. Qu'y at-il à dire. Oui, certains des idiomes des rails violent de bons principes de conception. Mais nous tolérons cela parce que c'est la voie des rails. p>
Cela dit, il y a beaucoup trop d'usage de modèle dans la plupart des applications de rails. Bien trop souvent, je vois le code d'affichage d'accès directement à des modèles. Je vois les règles d'entreprise pliées dans l'objet d'enregistrement actif. Une meilleure approche serait d'isoler les règles de l'entreprise des enregistrements actifs et d'isoler les vues des modèles. Cela ne violerait aucun idiomes de rails et ferait des applications de rails beaucoup plus flexibles et maintenables. p>
Serait-il vraiment la peine d'introduire encore plus d'objets dans un système de 2000 lignes? Je suis d'accord pour un système de 10k +, mais des petites échelles?
Si cela rend le nettoyeur de conception et plus facile à étendre, je pense que cela devrait être pris en compte parce que j'ai vu des applications de rails avec plus de 200 modèles et que certains modèles sont supérieurs de 1000 lignes. Maintenant on peut dire que c'est parce que c'est mauvais design. Il pourrait y avoir de nombreuses raisons pour cela, mais l'un de ceux-ci ne pouvait pas suivre ou violer les principes de base. C'est juste une pensée.
IMHO Quel oncle Bob a déclaré ci-dessus "une meilleure approche consisterait à isoler les règles de l'entreprise des enregistrements actifs et à isoler les vues des modèles". logique. La question est de savoir comment cela peut-il être fait proprement s'il existe un objet ou un objet ActiveRecord, et il doit y avoir une série de règles d'entreprise pour ceux-ci?
Vous n'êtes pas obligé d'écrire Dao ou une bouquet de mappages de colonnes ou de gâcher votre modèle avec getter / setters comme Java, Activerecord a déjà fait ces tâches sales pour vous. Les daos ou l'objet mappé sont séparés si facilement que vous n'avez pas à vous soucier d'eux. Vos modèles sont libres de faire des règles commerciales, elles sont déjà propres et vides! View Logic est suggéré d'être dans les assistants, pas dans les modèles. Certains auteurs des anciens livres n'utilisaient pas de rails et ont estimé que leurs lignes directrices sont universelles, c'est mauvais.
Oncle Bob, j'ai souvent pensé cela aussi, que ActiveRecord n'est vraiment pas un "modèle", tant qu'il s'agit d'une couche de données qui devrait être abstraite à l'écart des règles commerciales manipulées par des "modèles" réels dans le sens classique du MVC. Est-ce une erreur injuriste dans les rails idiom ou était-ce une utilisation valide du concept pour appeler Aciverecords "modèles"? À votre avis, cela mène à une certaine confusion quant aux rôles Activerecords devrait vraiment jouer dans une application Rails?
concernant la "loi de démétrer" une chose que je n'ai pas vue mentionnée est le concept de distance. Par cela, je veux dire: "Quelle est la relation étroitement liée à l'objet?" C'est mon avis que cela ferait une certaine différence si je me soucie de suivre la "loi de Demeter" ou non. P>
Dans le cas d'ActiveRecord, les objets impliqués dans la plupart des violations du LOD sont inséparablement liés ensemble dans une relation étroite. Changer la structure de données interne de ces objets nécessite une modification de la base de données pour refléter cette nouvelle structure. Les tables d'une base de données sont généralement "liées" ensemble dans une seule base de données, qui reflète même ces "associations" à travers des contraintes de clé étrangère (ou au moins contiennent des clés primaires et étrangères). P>
Donc, je ne me préoccupe généralement pas de suivre le LOD entre mes objets AR. Je sais qu'ils sont étroitement liés les uns aux autres en raison de leur nature même. P>
D'autre part, je serais plus préoccupé par la LOD entre des objets plus distants, en particulier ceux qui traversent les limites MVC ou tout autre dispositif de conception de ce type. P>
Oui, ActiveRecord brise délibérément l'encapsulation. Ce n'est pas tellement une limitation des rails car c'est une limitation du motif qu'il est basé sur. Martin Fowler, dont la définition de Activerecord était à peu près les rails de modèle utilisés, a déclaré autant dans le chapitre Activerecord PoaA : P>
Un autre argument contre actif Record em> est le fait qu'il coule la conception de l'objet à la base de données conception. Cela rend plus difficile refacteur de la conception comme projet avance. p> blockQuote>
Ceci est un critique commune de rails d'autres cadres. Fowler lui-même dit qu'aciverecord est principalement utilisé p>
... pour la logique de domaine qui n'est pas aussi complexe ... si votre logique d'entreprise est complexe, vous voudrez bientôt utiliser votre relations directes de l'objet, collections, héritage et ainsi de suite. Ceux-ci ne correspondent pas facilement à l'enregistrement actif. P> blockQuote>
Fowler continue à dire que pour des applications plus graves avec logique de domaine complexe, le Modèle de mappeur de données A >, qui fait un meilleur travail de séparation des couches, est préférable. C'est l'une des raisons des rails Menuisier À MerB a été généralement considéré comme un mouvement positif pour les rails, car FRBB utilise le modèle Datamapper en plus de ActiveRecord. p>
Je ne suis pas sûr que Demeter est la principale préoccupation avec Aciverecord. Au lieu de cela, je pense que casser l'encapsulation entre les données et les couches de domaine brise l'oncle Bob's Principe de responsabilité unique . Demeter, je pense que c'est plus un exemple spécifique de la manière de suivre le principe ouvert / fermé. Mais je pense que l'idée plus large derrière tout cela est la même chose: les classes devraient faire une chose et être robustes contre les changements futurs, ce qui n'est pas dans une certaine mesure ActiveRecord. p>
Ne prenez jamais de livres trop au sérieux. Sauf "code complet" bien sûr.
De telles "règles et" la loi "sont simplement des suggestions pour rendre le code propre. Quand il est plus propre de les violer, faites-le simplement.
Je peux certainement violer une règle intentionnellement si je sais que cette violation n'allait pas causer de problème de conception à long terme et surtout s'il existe un moyen de réaliser un code plus propre sans violer aucune règle, ce sera le chemin préférable :)