42 votes

Qu'est-ce que «l'ignorance persistante»?

L'ignorance de la persistance est généralement définie comme la capacité à persister & récupération standard .NET les objets (ou POCOs si vraiment vous insistez sur le fait de donner un nom). Et apparemment bien acceptée définition d'une norme .NET de l'objet est:

"...les classes ordinaires où vous vous concentrez sur le problème de l'entreprise à portée de main sans ajouter des trucs pour les infrastructures liées à des raisons..."

Cependant, je vois des gens décrivant NHibernate comme un cadre qui permet à l'ignorance de la persistance, et pourtant, c'est un cadre qui ne peuvent pas travailler sur tout standard .NET objet, une seule norme .NET les objets qui respectent notamment les exigences de conception, par exemple (source):

  • Toutes les classes doivent avoir un constructeur par défaut
  • Certaines fonctionnalités ne fonctionnent pas à moins que les classes sont scellés et tous les membres sont virtuels
  • L'identité de l'objet ne fonctionne pas correctement si l'abus est Égal à/GetHashCode

(Aparté: Avant que quelqu'un s'énerve, je ne veux pas prendre sur NHibernate ici, c'est juste l'un des plus fréquemment citée en exemple d'un cadre qui est censé être permis de l'ignorance de la persistance. Je suis sûr que des arguments similaires peuvent être appliquées à d'autres Orm qui prétendent la même chose.)

Maintenant, bien que la classe en elle-même n'a pas de persistance-cadre spécifique des attributs ou des classes de base, etc., pour moi, il n'est pas vraiment "la persistance des ignorants", car il doit suivre un ensemble de lignes directrices de conception pour faciliter l'utilisation, par l'infrastructure de persistance. Vous devez concevoir et de mettre en œuvre la classe avec les exigences de la persistance de cadre à l'esprit; si vous êtes ignorants de la classe ne peut pas travailler avec elle.

Où je vais avoir des problèmes avec la définition de "l'ignorance de la persistance"/"POCO", c'est que je ne vois pas comment, sur le plan conceptuel, c'est vraiment différent de l'ajout d'attributs tels que l' [Serializable] ou [DataContract] ou [XmlType] ou de toute autre persistance-cadre-des annotations spécifiques qui facilitent la persistance et la récupération de l'entité à l'aide de ce cadre.

Alors, quelle est exactement la "persistance de l'ignorance"?

Clairement la définition de celui-ci comme étant capables de persister "les classes ordinaires" est une erreur car le NHibernate n'ordinaire dans la mesure où pas référence à un cadre spécifique des classes, alors qu'ils sont extraordinaires dans la mesure où ils nécessitent une conception inhabituelle de choix tels que les constructeurs par défaut et tous les membres virtuels et est Égal à/GetHashCode implémentations sur mutable types.

Est-il donc raisonnable de dire que "l'ignorance de la persistance" est vraie lorsque les objets de faciliter l'utilisation d'une infrastructure de persistance (que ce soit dans la conception et la structure ou par utilisation d'un cadre spécifique des annotations), mais ne pas effectuer toute persistance de la logique d'eux-mêmes?

10voto

Mikeb Points 3306

Je dirais que, comme la plupart des choses, de ses une échelle mobile. Il y a des choses que nous faisons qui ont la propriété de persistance. Sur une extrémité de l'échelle est cette chose ayant toutes les tripes, les dépendances, et le code qui est construit sur mesure persistent juste une chose dans sa manière particulière. À l'autre extrémité de l'échelle est quelque chose qui arrive comme par magie, le tout sans nous faire beaucoup plus que de l'ajout d'un jeton ou la définition d'une propriété quelque part que les causes qui chose de "juste persist'. Afin d'obtenir à la magie de l'échelle, il y a des cadres, des lignes directrices de conception, conventions, etc qui aident à la magie qui se passe. Je pense que l'on pourrait dire que l'outil pourrait être produite, qui avait moins de conditions et de restrictions que NHibernate mais poursuit le même objectif; que hypothétique outil serait plus loin le long de notre échelle.

Je ne sais pas ce que j'aime le terme "l'ignorance de la persistance' tellement; c'est vraiment à propos d'un objet d'être ignorants de la mise en œuvre, le magasin de sauvegarde, le cache, ce genre de chose - un objet est généralement conscient de si oui ou non il est persistant, cependant. Mais c'est juste de la sémantique.

7voto

Vijay Patel Points 5696

Je ne crois pas que votre compréhension (ou définition) de "Persistance Ingorance" soit fausse.

Le vrai problème est celui des abstractions qui fuient . Tout simplement, la technologie existante rend très difficile la mise en œuvre d'un véritable PI.

4voto

Tom Bushell Points 3510

Je suis d'accord avec Mikeb - "persistance de l'ignorance" est une échelle mobile, pas vrai/faux de la propriété d'un ORM.

Ma définition de la véritable 100% PI serait que vous ayez pu persister TOUTE possible POCO classe, peu importe à quel point et lié à d'autres classes, sans altérer la classe en aucune façon.

L'ajout de champs ID, la décoration avec des attributs, héritant de l'ORM classes, ayant pour la conception de vos classes, de sorte qu'ils correspondent bien aux tables sous-jacentes dans un RDB - réduire le "PI score" en dessous de 100%.

Ceci dit, j'ai choisi d'utiliser Couramment NHibernate mappant automatiquement parce qu'il semble avoir le plus de PI score de toute l'ORM options que j'ai regardé.

2voto

Frederik Gheysels Points 36354

Une classe ignorante persistante est une classe qui n'est pas liée à un cadre de persistance.

Autrement dit, la classe n'a absolument aucune connaissance de la présence d'un cadre de persistance, elle n'hérite pas d'une classe définie par ce cadre ni n'implémente une interface requise pour ce cadre de persistance afin de fonctionner.

1voto

djna Points 34761

Je serai d'accord avec votre définition:

Est-il donc raisonnable de dire que l' "l'ignorance de la persistance" est vrai quand les objets de faciliter l'utilisation d'un la persistance du cadre, mais ne pas effectuer toute persistance de la logique eux-mêmes?

Le code (par opposition aux attributs) dans vos classes n'a pas de caractéristiques intrinsèques à la persistance. Constructeurs par défaut peut être nécessaire pour la persistance, mais n'ont pas de code qui ne fait de la persistance. La couche de persistance pourrait être modifié assez sensiblement différentes bases de données pourraient être utilisées et la logique d'entreprise resterait inchangé.

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