2009-05-19 9 views
0

J'ai 2 tables, pour l'instant comme exemple, ClientOrder et Products Table. LINQ, je suis capable d'écrire toutes les requêtes que je veux exécuter 1. Recherche par ordre client 2. Recherche par nom du client 3. Recherche par nom de produit 4. Recherche par ID produitQuel motif de conception est suggéré ici?

I vouloir créer des méthodes pour chacune des requêtes ci-dessus. Le ? est, quel modèle est approprié ici? Factory Pattern ne semble pas correspondre à la facture car je sais que chacun de mes objets utilisera le même contexte de données.

Est-il plus sage de créer simplement une classe statique avec les 4 méthodes statiques?

Note: Je suis 5 mois avec le monde de la programmation et un débutant

Répondre

2

Si vous ne savez pas quel modèle de conception, vous devez utiliser, vous feriez mieux de ne pas utiliser un! Dans ce cas très simple, je ne peux pas penser à une addition utile que pourrait fournir un modèle de dessin. Peut-être que vous voulez juste savoir comment vous pourriez mettre en œuvre des fonctions pour contrôler ces quatre requêtes et leurs résultats?

+0

Bas, je peux mettre en œuvre les méthodes statiques/classes. Je voulais que la communauté comprenne mieux le modèle à utiliser et pourquoi. Peut-être devrais-je ajouter que je suis 5 mois dans le monde de la programmation et un débutant –

+0

+1 - Aucun «modèle» est mieux que d'essayer d'implémenter un dans cette circonstance, tout simplement ol 'OO design. Créez une classe avec les méthodes que vous voulez. Refactoriser une fois qu'il devient trop grand/compliqué. –

0

Je choisirais probablement une classe simple (peut-être un singleton) avec les méthodes comme méthodes d'instance et appelez cela une couche d'accès aux données. Instancier par rapport à la base de données requise et juste LINQ ce dont j'ai besoin ensemble dans les méthodes appropriées.

1

Je suggère d'étendre les classes avec des méthodes statiques. Quelque chose comme le suivant.

IEnumerable<Client> Client.GetByName(String Name) { } 

IEnumerable<Product> Product.GetByName(String Name) { } 

Product Product.GetById(Guid Id) { } 

Je suppose que vous utilisez LINQ to SQL ou LINQ à l'entité, de sorte que vous pouvez simplement étendre les calsses partielles générées. Si vous renvoyez des collections ou une instance, et si vous choisissez IEnumerable, IQueryable, IList, List, ou tout ce qui dépend de vos besoins.

+0

Bonjour @ DanielBrückner! ne pensez-vous pas qu'il serait préférable de ne pas polluer l'implémentation d'un objet de domaine avec une logique d'interrogation? Je veux dire, pour moi, il est logique de donner à un autre objet la responsabilité de gérer les requêtes. De même, vous ne pouvez pas remplacer la méthode statique dans les sous-classes, ce qui limite l'extensibilité de votre classe. Qu'est-ce que tu penses? – nick2083

2

J'ai trouvé le Patterns of Enterprise Application Architecture de Martin Fowler utile pour apprendre comment les gens structurent l'accès aux tables de base de données. Certains de ces modèles sont répertoriés here. Pour votre tâche la plus simple, une seule classe avec quatre méthodes statiques semble parfaitement raisonnable. Mais vous devriez considérer le modèle Table Data Gateway de Fowler, où vous empaquetez tous les accès à chaque table dans sa propre classe de méthodes statiques (et utilisez une convention de dénomination standard).

2

Tout d'abord, nous allons examiner l'intention pour le modèle de la méthode usine:

Définir une interface pour la création d'un objet, mais nous allons décider des sous-classes classe à instancier. La méthode d'usine permet à une classe de reporter l'instanciation aux sous-classes.

Cela s'applique-t-il à votre problème? Vous êtes plus préoccupé par la façon dont vous allez gérer les requêtes que la création de vos objets de domaine.

À mon humble avis, j'éviterais n'importe quelle alternative d'implémentation qui implique une classe/méthode statique: vous ne pouvez pas hériter d'une classe statique de sorte que vous limitez l'extensibilité de votre modèle. Il en va de même pour les méthodes statiques dans les classes non statiques: elles ne peuvent pas être remplacées dans les sous-classes.

Je n'irais pas ajouter ces méthodes de requête à vos objets de domaine.En gardant à l'esprit que vous utilisez la POO pour modéliser le monde réel, est-il sensé de demander à un Ordre de chercher une autre commande?

Pensez-y: dans le monde réel, vous utilisez un ordre pour en extraire des informations spécifiques (sa date, le nom du client ou le produit impliqué). Quand vous voulez chercher une commande, vous allez partout où vous la stockez et la cherchez (disons, dans un classeur). Autrement dit, vous n'utilisez pas d'ordre pour rechercher d'autres commandes. Pour cela, vous devez modéliser cette situation dans votre logiciel. Vous avez déjà les objets qui modèlent la commande et le produit. Ce qui vous manque est un objet qui modélise l'endroit que vous utilisez pour stocker des commandes et les rechercher.

En général, ces types d'objets (qui enregistrent ou récupèrent d'autres objets) sont appelés des référentiels. Dans votre cas, il pourrait s'appeler ClientOrderRepository. Que ferait cet objet? Eh bien, vous l'avez déjà mentionné: effectuez les quatre requêtes différentes dont vous avez besoin. Voyons voir une définition possible pour son interface:

public interface IClientOrderRepository { 
    ClientOrder FindOrderWithIdMatching(int anOrderId); 
    ClientOrder FindOrderWithClientNameMatching(string aClientName); 
    ClientOrder FindOrderWithProductNameMatching(string aProductName); 
    ClientOrder FindOrderWithProductIdMatching(string aProductId); 
} 

Si vous devez avoir une seule instance de la classe qui mettra en œuvre cette interface, vous pouvez utiliser le modèle Singleton. Ne comptez pas sur les choix d'implémentation (comme les méthodes statiques) qui peuvent être difficiles à changer plus tard. Enfin, même si vous trouvez des motifs spécifiques qui résolvent votre problème, il est bon de réfléchir aux objets et à la façon dont ils collaborent pour accomplir une tâche. Utilisez des métaphores de la vie réelle pour vous aider à trouver des objets manquants ou des responsabilités qui doivent être remplies. En fin de compte, tout est sur l'essence du paradigme orienté objet.

Pour info plus profond sur le Pattern Repository, voici quelques ressources pour vous aider à démarrer:

+1

Vous pouvez également ajouter quelque chose comme ce qui suit pour permettre plus de flexibilité: 'IEnumerable Find (prédicat requête)'. –

+0

Bien sûr, c'est un excellent conseil! Je ne voulais pas compiler les choses car @umb a dit qu'il était nouveau dans la programmation, c'est pourquoi j'ai essayé de me concentrer davantage sur les choses conceptuelles. – nick2083

Questions connexes