2010-10-10 4 views
0

J'aimerais obtenir des commentaires sur ce que les gens pensent des techniques de construction de classe suivantes. Si je suis dans une situation où j'ai le choix d'utiliser soit des éléments suivants:Techniques de construction de classe

  1. Initialiser un objet complètement dans le constructeur,
  2. Initialiser un objet par le biais de ses propriétés publiques après l'instance a été créé.

[blogspam supprimées]

+2

Kim, il est inapproprié de rediriger la conversation vers votre blog comme ceci. Si vous voulez poser une question, demandez-la ici, s'il vous plaît. –

Répondre

1

Lorsque cela est possible (et approprié), créer des instances d'objet dans un état utilisable. (donc n ° 1)

+0

Oh, d'accord Michael. Désolé pour ça. Merci Mitch. –

0

Je suis d'accord avec Mitch, mais parfois il y a plus.

A L'approche de l'usine peut rendre votre code plus propre, plus facile à utiliser et à entretenir. À certains égards, ils ne sont pas beaucoup plus que des constructeurs glorifiés, mais ils vous donnent une flexibilité supplémentaire.

  • Les méthodes d'usine peuvent recevoir des noms correspondant à leur utilisation.
  • Les appelants doivent uniquement fournir les paramètres requis. Certes, vous pouvez aussi le faire pour les constructeurs 'normaux' mais il est plus clair pour l'appelant pourquoi il devrait utiliser un constructeur donné s'il a aussi un nom approprié.
  • Le déplacement de tout le code complexe hors des constructeurs facilite la maintenance de votre code.
  • L'utilisation d'une Usine complète (une qui renvoie une classe/interface abstraite) vous donne une certaine abstraction de la classe concrète elle-même.

Exemples:

// Typlical constructor 
public Page(pageId, title, url, keywords, content, tags, lastModified, lastModifiedBy) 
{ 
    // All values are set via the constructor. 
    //... 
} 

Méthodes d'usine:

public static Page PageByID(pageId) 
{ 
    // All properties are set internally here 
    //(directly or delegated as appropriate). 
    //... 
} 


public static Page NewPage(title, url) 
{ 
    // All properties not passed in are given 
    // appropriate default values. 
    //... 
} 

public static Page Page404() 
{ 
    // All properties are given 
    // appropriate default values. 
    //... 
} 
0

Comme Mitch dit que vous auriez normalement créer un objet à travers un constructeur qui aurait au moins le mettre dans un état stable. Vous pouvez utiliser les propriétés publiques ultérieurement pour définir les propriétés non critiques de l'objet.

Cependant, parfois vous n'avez pas vraiment le choix. Un framework peut nécessiter un constructeur par défaut (sans paramètres). Dans ce cas, vous devrez placer l'objet dans un état stable d'une autre manière. L'utilisation de propriétés publiques est possible, mais il serait facile d'oublier quelque chose. Dans ce cas, je vous conseille de créer une méthode Initialize (ou similaire) que vous appelez directement après la création de l'objet. Cette méthode peut alors vous obliger à remplir tous les paramètres nécessaires pour un état stable afin que vous ne puissiez rien oublier. La différence est que vous ne pouvez pas vraiment forcer l'appel de cette méthode à moins que vous gardiez l'état interne 'isInitialized' que vous vérifiez dans chaque membre public.

Edit: ah vient de voir le post sur l'usine. Oui, bien sûr, dans le cas d'un framework nécessitant des constructeurs par défaut, vous pouvez également récupérer une usine et appeler les méthodes à cet effet.

Questions connexes