2008-12-11 6 views
1

Je cherche un modèle de dessin spécifique.Modèle de conception pour les méthodes d'une autre classe

Par exemple, j'ai une classe d'article, clsArticle. Cette classe contient des variables membres telles que Id, title, author, article, etc. Imaginez que je veux montrer tous les articles dans une liste. Donc quelque part je dois créer une méthode getAllArticles(). Puisque clsArticle n'est pas responsable de l'obtention de tous les articles, je dois mettre cette méthode dans une autre classe, clsArticleFact (où Fact signifie Factory).

Est-ce que quelqu'un sait comment ce modèle est appelé? Est-ce que cette façon de travailler est un motif de conception?

Répondre

3

Yeap. C'est correct.

Il peut s'agir d'une AbstractFactory ou d'un DataAccessObject.

Le premier est quand vous voulez laisser la mise en œuvre retourner différents types d'articles

Par exemple, disons que vous avez une condition où les articles se comportent différents selon la plate-forme.

ArticleFactory.getAll(): Article[] 

Renvoie la liste correcte dans chaque plateforme.

Le impl peut être:

WindowsArticleFactory 

ou

OSXArticleFactory 

L'ancien peut être utilisé pour abstraire l'endroit où les articles sont récupérés à partir de:

Vous pouvez avoir

ArticleDao.getAll(): Article[] 

et les mises en œuvre:

XmlArticleDao // Return a list of articles from an XML 

ou

DatabaseArticleDao // return the list from the database. 

Le point ici est de découpler la création (getAll()) de l'utilisation (article)

Si votre application est assez simple, vous peut utiliser un factoryMethod à la place.

class Article { 
    static Article[] getAll() { 
     // do whatever is neede here... 
    } 
} 

J'espère que cela aide.

+0

Merci pour la réponse. Je ne comprends pas vraiment. Je suis en programmation en C#. Et j'ai un type d'article. – Martijn

+0

@Martijn: OT: Si vous programmez en C#, vous ne devriez vraiment pas utiliser de préfixes pour quelque chose (comme votre clsArticle) et vous ne devriez pas abréviation de quelque chose (comme votre * Fact). Jetez un coup d'oeil sur les directives de nommage dans le .NET Framework, cela profitera également à tous ceux qui répondront à vos futures questions C#. – OregonGhost

+0

Cela s'applique de la même manière pour toute langue OO. En fait, vous n'avez pas besoin de beaucoup de flexibilité. La dernière option (en utilisant une méthode de classe) serait suffisante pour vous. Cependant, si vous voulez mettre toutes ces opérations dans une classe séparée, vous pouvez toujours appeler ArticleFactory. Le concept reste le sam – OscarRyz

0

Eh bien, créez une classe statique à cette fin:

public static class clsArticles 
{ 
    public static clsArticles[] GetAllArticles() { /* actual code */ } 
} 
+0

Pourquoi exactement une classe statique? – Martijn

+0

Parce que le seul but de la classe est actuellement de fournir l'accès à la méthode statique. – Claymore

+0

Thnx. Et devrais-je également utiliser des membres statiques pour, par exemple, enregistrer un article? Ou obtenir un article par ID? – Martijn

1

Vous pouvez également utiliser l'approche adoptée par Rails classes de modèle ActiveRecord

public class clsArticle 
{ 
    public static clsArticle[] findAll() { /*... */ } 

    // the other regular code here; 
} 

// client code 
foreach(clsArticle obArticle in clsArticle.findAll()) 
{ 
    list.add(clsArticle) 
} 
+0

+1, j'aime celui-ci. Keep it simple – terjetyl

+0

Yeap, c'est la troisième option que j'ai mentionnée. Il n'y a pas besoin de flexibilité supplémentaire ici vraiment. – OscarRyz

+0

Je ne suis pas vraiment d'accord avec les remarques ci-dessus parce que la question est étiquetée avec "design patterns" et "oo design" et nous ne sommes pas (seulement) intéressés par "la manière la plus rapide qui fonctionnera". – eljenso

0

Ce que vous décrivez est pas vraiment un modèle, mais à la place, un principe de programmation appelé «Séparation des préoccupations».De votre description, je dirais fortement que vous après un modèle de conception structurelle, pas un modèle de conception de création puisque l'attribution des préoccupations de codage est discutée sur la complicité créationnelle.

Alors, ma meilleure estimation est que le modèle que vous êtes après est peut-être le motif de façade ou passerelles. Il est courant d'utiliser Entities (votre clsClass) avec Gateways. Je n'encouragerais cependant pas forcément à rendre vos méthodes statiques, mais elles ne peuvent pas être moquées pendant les tests de Business Logic. Vous voudriez vous moquer de ces types de méthodes qui renvoient des objets d'accès aux données s'ils forment la couche de données de l'application puisque vous ne voulez pas toucher la base de données lorsque la logique métier dépend de ces passerelles/façades.

public class clsClass 
{ 
    public int ID; 
    public string title; 
    public string author; 
    public string article; 
} 


public class BookGateway 
{ 
    public List<clsClass> GetAllArticles() 
    { 
     var result = new List<clsClass>(); 

     // Add items here. 
     // Can call database and populate each new clsClass 
     // and add to result object. 

     return result; 
    } 
} 
+0

Délai de réponse. Je ne comprends pas la dernière partie. La classe BookGateWay est ma logique métier. Dans mon cas, cette classe contient un objet de la classe de base de données. Donc c'est correct, n'est-ce pas? – Martijn

+0

La dernière partie de la réponse est pour les développeurs avancés. Une raison de s'abstenir de conduire des méthodes statiques dès le début. En règle générale, ne faites de statique que lorsque c'est strictement nécessaire. BookGateway est en effet la logique métier et effectue l'appel à la base de données et remplit chaque classe clsClass avec les valeurs de base de données. – Llyle

+0

La réponse aux Oscars n'est pas ce que vous recherchez. Utilisez une passerelle et ajoutez simplement toutes les nouvelles méthodes (...comme SaveArticle (objet article), GetArticleByID (int articleID), DeleteArticleById (int articleID) ...) à la passerelle que vous en avez besoin. – Llyle

0

Ne créez pas de méthodes statiques!

Votre première pensée devrait être interface.

Peut-être que vous pourriez écrire quelque chose comme (par exemple en Java)

public interface ArticleService { 
    Article[] getAllArticles() throws ServiceException(); 
} 

Toutes les autres choses que vous devez faire avec les articles vont également dans cette interface. Injectez une implémentation concrète de cette classe (DbArticleService, XmlArticleService, ...) dans chaque objet devant traiter les articles. De cette façon, comme d'autres affiches mentionnées, vous obtenez un code découplé et une bonne séparation des préoccupations.

Mais quoi que vous fassiez, ne pas rendre les choses statiques.

+0

En utilisant cette façon, alors où puis-je mettre des méthodes comme SaveArticle (objet article), GetArticleByID (int ArticleID), DeleteArticleById (int ArticleID) et ainsi de suite? – Martijn

+0

Sur l'interface ArticleService. – eljenso

Questions connexes