2010-10-08 6 views
2

J'écris du code pour faire des choses et je suis sûr qu'il n'est pas bien conçu pour le moment mais je ne peux pas penser à comment je devrais le refactoriser pour le rendre plus agréable ...Design Pattern pour créer un ensemble d'objets de données

Le résumé simple est que j'ai du code qui traverse certains fichiers dans une structure de répertoires et différents répertoires contiennent des types de contenu différents. J'ai un nombre limité de ces types de contenu et actuellement j'ai un objet de type de contenu que je suis juste en train de créer beaucoup d'ajouter à une liste d'une manière telle comme suit:

 contentTypes.Add(new ContentType { ContentName = "2010 Call Report", FolderName = "2010 Reports", RenameFile = false }); 
     contentTypes.Add(new ContentType { ContentName = "2010 Email Report", FolderName = "2010 Reports", RenameFile = false }); 
     contentTypes.Add(new ContentType { ContentName = "Above Average Call Recording", FolderName = "Call Recordings", RenameFile = true, HasMultiple = true }); 
     contentTypes.Add(new ContentType { ContentName = "Below Average Call Recording", FolderName = "Call Recordings", RenameFile = true, HasMultiple = true }); 

Cela ne me sens vraiment pas à droite (11 lignes de code pratiquement identique au total) mais je ne vois pas ce que je devrais faire d'autre. La classe ContentType contient quelques propriétés visibles ci-dessus et une seule méthode publique appelée GetNewFilename. Actuellement, la méthode GetNewFilename est très simple et partagée par tous les types de contenu. Cependant, je veux maintenant avoir quelques-uns des objets ContentType d'avoir leurs propres versions de cette méthode ...

Ce que j'ai considéré sont:

1) Sous ContentType pour créer une classe pour chaque type de contenu Cela ne m'a pas semblé juste parce que j'aurais 11 classes, qui n'ont jamais leurs informations modifiées et dont il ne sert à rien d'en avoir plus d'une. Cela n'a pas été le même droit pour une classe (je connais les singletons mais j'ai entendu dire que si vous les utilisez, vous pourriez bien vous tromper).

2) Func propriété sur le ContentType

je me suis dit que je pouvais mettre un délégué sur la ContentType pour faire face à la fonction GetNewFilename étant différente, mais il se sent encore alors désordre les générer de la manière décrite ci-dessus.

3) Cours d'usine

Je n'ai jamais eu à utiliser des classes usine avant (pour autant que je sache), mais je sais qu'ils sont utilisés pour générer des classes. Ma lecture sur eux a suggéré que ce modèle a été utilisé pour générer différents sous-types plutôt que seulement un ensemble d'instances d'une classe.

4) Fichier de configuration

Les données que je l'ai ci-dessus pourraient tous être mis dans un fichier de configuration ou base de données ou quelque chose, puis chargé et bouclé pour générer plus bien (cela ne vient survenue me) mais cela ne résoudrait toujours pas le problème de la méthode getNewFilename. Je ne suis pas sûr de pouvoir facilement mettre un délégué dans un fichier de configuration. :)

5) Avoir toutes les différentes méthodes de getNewFileName sur une classe

je pouvais avoir la classe de contenu ont toutes les différentes méthodes que je pourrais vouloir et utiliser une sorte de sélection pour ensuite choisir le bon. Cela semble juste manquer le point un peu trop.

Alors quelqu'un peut-il suggérer un bon moyen de le faire?

Voici la signature actuelle pour ma classe ContentType (avec logique découpée - demandez si vous pensez que c'est pertinent).

public class ContentType 
{ 
    public string ContentName { get; set; } 
    public string FolderName { get; set; } 
    public bool RenameFile { get; set; } 
    public bool HasMultiple { get; set; } 

    public string GetNewFilename(string originalFilename, int fileIndex) 
    {...} // This method needs to do diffent things for different contenttypes 
} 

Si vous voulez plus de détails sur la façon dont cette classe est utilisée, demande et je peux le coller dans mais je ne voulais pas inonder la classe dans le code que je ne pensais était que pertinent. Ceci est seulement pour un bit de code à usage unique (pour déplacer les fichiers vers les répertoires appropriés pour mettre un nouveau site web et s'assurer qu'ils sont nommés correctement) donc le meilleur code possible n'est pas vital mais ça va me déranger si Je ne sais pas au moins ce que je devrais faire. Si la manière correcte semble prendre trop de temps (par exemple, réécrire le code à partir de rien), je ne m'en soucierai pas, mais au moins je le saurai pour la prochaine fois. :)

P.S. Je réalise maintenant aussi qu'un constructeur ou deux pour définir ces valeurs initiales et les rendre en lecture seule serait un changement approprié à faire pour le rogner mais ne résout toujours pas tous mes problèmes.

Répondre

2

Demandez à votre classe ContentType être une classe de base et de faire la méthode GetNewFilename virtuelle. Dériver de ContentType classes pour chaque type de fichier qui peut nécessiter une gestion spéciale dans la méthode GetNewFilename et remplacer l'implémentation virtuelle. Ensuite, créez simplement des instances de ces classes héritées si nécessaire lorsque les types de fichiers qui nécessitent un traitement spécial sont trouvés dans votre recherche d'annuaire, sinon créez simplement une instance de classe ContentType.

public class ContentType 
{ 
    public virtual string GetNewFilename(string originalFilename, int fileIndex) 
    { 
     // get file name here 
    } 
} 

public sealed class SpecialContentType : ContentType 
{ 
    // Inherrits all the properties of ContentType 

    public override string GetNewFilename(string originalFilename, int fileIndex) 
    { 
     // get special file name here 
    } 
} 
+1

C'est ce que j'ai fini par aller avec à la fin. Merci pour les suggestions. :) – Chris

1

Un autre modèle à prendre en compte peut être une interface ou une classe abstraite. Oui, vous auriez 11 cours, mais ce n'est pas nécessairement une mauvaise chose. Cela garderait vos préoccupations séparées, tout en offrant un cadre commun. Si fonctionne de la même manière dans plusieurs cas, vous pouvez implémenter une classe abstraite avec une méthode virtuelle .Cela limiterait la quantité de nouveau code, vous devez écrire, remplaçant seulement si nécessaire:

public abstract class ContentType 
    { 
     public string ContentName { get; set; } 
     public string FolderName { get; set; } 
     public bool RenameFile { get; set; } 
     public bool HasMultiple { get; set; } 

     public virtual string GetFileName() 
     { 
      //Base GetFileName implementation 
      return "filename"; 
     } 
    } 
1

Pour le numéro 4, vous pouvez utiliser un conteneur IoC comme Unity ou StructureBuilder. Puis fournissez une classe pour la 2ème partie:

public interface INewFilenameService { 
    string FileName {get;set;} 
} 

public class ContentType { 
    private INewFilenameService newFilenameService; 

    public ContentType(INewFilenameService service) { 
     this.newFilenameService = service; 
    } 

    public string ContentName { get; set; } 
    public string FolderName { get; set; } 
    public bool RenameFile { get; set; } 
    public bool HasMultiple { get; set; } 

    public string GetNewFilename() { 
     return service.Filename; 
    } 
} 

puis vous pouvez instancier votre liste de type de contenu soit dans config ou à l'exécution.

Questions connexes