Programmation .NET et classes POCO

9

J'étais en train de réfléchir ce soir en réfléchissant à une application que je devais changer et cela m'a fait réfléchir. Les entités Entity Framework sont POCO (Plain old CLR Objects) et les modèles utilisés dans ASP.NET MVC sont généralement également POCO. Cela signifie simplement des propriétés, pas de méthodes.

Maintenant, la programmation OO permet normalement à un objet d'encapsuler ses fonctionnalités, qui incluent ses propriétés ainsi que ses méthodes, cela permet au polymorphisme de se produire. Avec l'essor des classes POCO utilisées, les modèles de conception tels que les référentiels génériques sont devenus plus populaires. Alors que dans le passé mes objets auraient eu leurs propres opérations CRUD, je les ai maintenant sur un référentiel.

Est-ce juste une évolution dans OO où les opérations CRUD sont supprimées des objets pour leur permettre d'être découplées ou peut-être que les opérations CRUD n'auraient pas dû être au niveau de l'objet dans le passé et que j'avais tort? diable, peut-être que les deux sont parfaitement légitimes et l'ont toujours été. C'est juste une observation qui m'a fait réfléchir, alors j'ai pensé que je chercherais d'autres opinions.

James
la source

Réponses:

9

Comme l'a dit Wyatt, POCO et POJO n'impliquent aucunement aucune méthode. Je pense que cela vient de ne pas savoir ce que sont les non-POCO et non-POJO.

Les premières versions des technologies ORM n'étaient pas POCO et POJO simplement parce qu'elles nécessitaient que les entités héritent d'une classe de base du framework lui-même. Dans le cas de Java, Entity Beans. Dans le cas d'Entity Framework, POCO n'était pas possible dans la toute première version et chaque entité devait hériter Entityde la classe de base.

Cette exigence a créé une dépendance de votre modèle de données vis-à-vis de la technologie de persistance, ce qui rend beaucoup de choses difficiles ou impossibles. Des choses comme les tests unitaires du modèle nécessitent de se moquer du framework bean / entity qui s'est avéré pratiquement impossible. Vous ne pouvez pas non plus utiliser le modèle avec une technologie de persistance différente ou vous ne pouvez pas utiliser le modèle dans un contexte différent, comme dans un environnement mobile.

Donc, votre supposition que POCO concerne la non-existence de méthodes est fausse. POCO consiste à pouvoir utiliser le modèle indépendamment de sa technologie de persistance.

Ce dont vous parlez est probablement proche du modèle de domaine anémique par rapport au modèle de domaine approprié.

Euphorique
la source
Vous avez raison, cela ressemble plus au modèle de domaine anémique ayant lu cet article.
James
4

POCO n'implique en aucune manière qu'il n'y a pas de méthodes - bien que la plupart des exemples que l'on voit utilisent une grande partie des fonctionnalités de liaison automatique MVC qui traitent principalement des propriétés et ignorent les méthodes.

L'intégration de la persistance dans les objets de votre modèle viole la séparation des préoccupations et rend très difficile de faire des choses comme le test unitaire des objets sans créer une base de données. Ce n'est pas une fonction de l'objet modèle mais une fonction s'il s'agit d'une classe différente telle qu'un référentiel.

Wyatt Barnett
la source
Eh? poco n'implique totalement aucune méthode dans mon expérience - sinon c'est une entité ou un modèle ou un modèle de vue selon l'utilisation.
Telastyn
2
La dernière fois que j'ai vérifié, un vieil objet C-Sharp ordinaire pouvait avoir des méthodes. Le terme est né dans le mauvais temps où vous aviez des trucs comme des jeux de données typés ou sinon vous deviez avoir vos objets de modèle héritant de classes spécifiques et n'étant pas des POCO.
Wyatt Barnett
La séparation des préoccupations pourrait être obtenue tout en conservant la méthode sur l'objet, en faisant accepter une interface à la méthode. Cette interface spécifierait un type qui peut gérer les opérations CRUD pour l'objet.
James
0

J'ai utilisé des méthodes d'extension pour des trucs comme ça récemment.

Le POCO contient une logique qui n'a de sens que pour l'objet lui-même. La logique métier ou la logique d'objet coordonnée va dans une extension BL. L'accès aux données peut aller soit dans une couche d'accès aux données, soit dans une extension d'accès aux données.

namespace MyApp
{
    public class MyClass
    {
        public string id;
        public string name;
        public int quantity;
        public decimal price;
    }   
}

namespace MyAppBL
{
    public static class MyClassBL
    {
        public static decimal PriceInCart(this MyClass myObject)
        {
            return myObject.quantity > 10 ? myObject.price * 0.9m : myObject.price;
        }
    }
}

namespace MyAppDA
{
    public static class MyClassDA
    {
        public static void Create()
        {
            …
        }

        public static void Read(string myObject)
        {
            …
        }

        public static void Update(this MyClass myObject)
        {
            …
        }

        public static void Delete(this MyClass myObject)
        {
            …
        }
    }
}

Cela vous donne une très belle myObject.PriceInCart()et myObject.Save()tout en gardant votre classe concentrée sur les données. Bien sûr, pour les méthodes statiques, vous devez avoir MyAppDA.Create()au lieu de MyApp.Create().

Jeffery Thomas
la source