2010-02-18 5 views
4

Pour mon application, j'ai besoin de stocker des données dans un tableau avec les propriétés (string main, string[] status, i nt curParCount, etc.).Classes imbriquées et logique métier dans un référentiel?

Je ne stocke actuellement dans cette classe:

class Repository 
{ 
    public static Rep[] rep = new Rep[6]; 
    public struct Rep 
    { 
     public string main; 
     public string clean; 
     public int curParCount; 
     public int totalCount; 
     public int parStart; 
     public int partialStart; 
     public double scrollPos; 
     public int selectionStart; 
     public int selectionEnd; 
     public string[] status; 
    }  
    public static string repName() 
    { 
     string name; 
     if (MainWindow.repnum == 0) 
     { name = "Main Text"; } 
     else { name = "Repository " + MainWindow.repnum; } 
     return name; 
    } 
    public static string getStatus(int repNum, int statNum) 
    { 
     return rep[repNum].status[statNum]; 
    }                 
} 

Est-ce la bonne façon pour moi de faire cela? C'est sûr que ça ne se sent pas comme ça.

+0

Pourquoi ne vous sentez-vous pas bien? Il semble simple et il semble que cela correspond à vos besoins. Quel est le problème? – FrustratedWithFormsDesigner

+0

Transformez-le en entity bean, créez tous les attributs privés et créez chaque méthode getter/setter pour tous vos attributs. Votre code n'est pas mauvais du tout, je lance juste ma valeur de 2 cents. –

+1

@Elite Gentleman: Vous pensez à Java. – SLaks

Répondre

6

L'idée de base est bonne. La mise en œuvre pourrait être améliorée. En particulier, je crains que vous ayez une structure mutable; soit le rendre immuable ou le transformer en classe. Je vous recommande également de modifier les champs publics en propriétés publiques avec des champs de sauvegarde automatique (puis en majuscules les noms).

modifier

Voilà ma version:

class Repository 
{ 
    public class Rep 
    { 
     public string Main {get; set;} 
     public string Clean {get; set;} 
     public int CurParCount {get; set;} 
     public int TotalCount {get; set;} 
     public int ParStart {get; set;} 
     public int PartialStart {get; set;} 
     public double ScrollPos {get; set;} 
     public int SelectionStart {get; set;} 
     public int SelectionEnd {get; set;} 
     public string[] Statuses {get; set;} 
    }          


    public const int StatusCount = 6; 
    public static List<Rep> Reps = new List<Rep>(); 

    public static string Name 
    { 
     get 
     { 
      if (MainWindow.repnum == 0) 
       return "Main Text"; 

      return "Repository " + MainWindow.repnum; 
     } 
    } 

    public static string GetStatus(int repIndex, int statIndex) 
    { return Reps[repIndex].Status[statIndex]; } 
} 
+0

hé, j'ai juste supposé qu'il avait une raison pour utiliser une structure sur une classe. – FrustratedWithFormsDesigner

+0

Il pourrait bien croire que ce serait plus efficace. Ou, s'il a un arrière-plan C++, il pourrait ne pas reconnaître à quel point les structures sont fondamentalement différentes des classes. –

+2

Quelqu'un peut-il publier un lien pour expliquer pourquoi une structure mutable est une mauvaise chose ESPECIALLY dans une structure non-publique (utilisée en interne uniquement)? Pourquoi inclure des propriétés dans les détails d'implémentation si vous ne créez pas de code "Fantaisie" derrière la propriété? Cette bizarrerie de C# n'a jamais eu de sens. La raison pour laquelle les propriétés existent est correcte, mais pourquoi faire un wrapper fin n'a aucun sens dans les interfaces non publiques. –

0

Il y a quelques choses que je voudrais changer afin de suivre les meilleures pratiques.

D'abord, je voudrais répondre à ce que le problème separation of concerns vous avez. Le struct Rep n'a pas besoin d'être une classe imbriquée, à mon avis, je le supprimer, comme si (et appeler aussi quelque chose d'autre):

class Repository 
{ 
    public static Rep[] rep = new Rep[6]; 
} 

public struct RepositoryItem 
{ 
    public string main; 
    public string clean; 
    public int curParCount; 
    public int totalCount; 
    public int parStart; 
    public int partialStart; 
    public double scrollPos; 
    public int selectionStart; 
    public int selectionEnd; 
    public string[] status; 
} 

Maintenant, si vous regardez, vous disposez d'un référentiel classe qui ne fait rien, mais maintenez le tableau. Puisque c'est le cas, vous pouvez effectivement éliminer cela et créer votre tableau en tant que variable et stocker ce que vous voulez.

Cela laisse la structure RepositoryItem. Je voudrais d'abord résoudre les problèmes qui violent le design guidelines for class libraries. Le plus grand infraction est ici la désignation des champs, ils doivent être Pascal-cased:

public struct RepositoryItem 
{ 
    public string Main; 
    public string Clean; 
    public int CurParCount; 
    public int TotalCount; 
    public int ParStart; 
    public int PartialStart; 
    public double ScrollPos; 
    public int SelectionStart; 
    public int SelectionEnd; 
    public string[] Status; 
} 

Vous devez également donner vos noms de champs plus significatifs noms. Tandis que "Pos" peut vous sembler évident, cela peut ne pas être évident pour les autres. "ScrollPosition" pourrait être un meilleur nom que "ScrollPos". Maintenant, au-delà de ça, ça devient un peu plus subjectif. Les questions que vous devez vous poser sont les suivantes: devrait-il s'agir d'une structure (si vous voulez une sémantique de copie par valeur, alors c'est bien, ça devrait l'être) ou une classe? De plus, les champs devraient-ils être en lecture seule (dans ce cas, cela devrait être une classe et vous devriez avoir un constructeur qui prend toutes les valeurs)?

En outre, considérez les implications si les propriétés/champs sont en lecture seule. Si le champ Statut est en lecture seule, envisagez de l'exposer comme un IEnumerable au lieu d'un tableau, car cela vous donnera beaucoup plus de flexibilité pour assigner la valeur plutôt que de forcer la mémoire contiguë qui demande la matrice. dans le tableau, puisque la référence au tableau est en lecture seule, pas les éléments dans le tableau eux-mêmes).

+2

Je pourrais aussi aborder le nombre magique. Pourquoi est-ce exactement 6? Est-ce que ça va changer? –

+0

@ Daniel Straight- J'allais à l'origine limiter le tableau Rep à une longueur de 6, mais j'ai maintenant décidé de le changer d'un tableau à une liste afin que je puisse changer sa longueur. Cependant, le tableau d'état aura toujours une longueur de 6, correspondant à 6 étiquettes. – Justin

+1

@highone - Dans mon expérience, "toujours" dure au mieux quelques années. ;) –

3

Eh bien, la façon Je le ferais ...

Public Class Repository: ObservableCollection<RepositoryItem> 
{ 
} 


public class RepositoryItem 
    { 
     public string main {get; set}; 
     public string clean {get; set}; 
     public int curParCount {get; set}; 
     public int totalCount {get; set}; 
     public int parStart {get; set}; 
     public int partialStart {get; set}; 
     public double scrollPos {get; set}; 
     public int selectionStart {get; set}; 
     public int selectionEnd {get; set}; 
     public string[] status {get; }; 
    }  

Fondamentalement, ceci est une classe de RepositoryItem (qui contient vos données, et toutes les fonctions que vous devrez peut-être utiliser pour IMPACT que les données) et un référentiel de classe, qui hérite de la classe ObservableCollection, en tapant à le RepositoryItem.

+1

La propriété ne doit pas être un tableau. – SLaks

+0

@SLaks: Pourquoi pas? – Bryan

+2

En fait, telle quelle, la propriété status est définitivement nulle. Ce n'est pas bon. (Oh, et les propriétés sont majuscules, souvenez-vous?) –

2

ParStart et PartialStart sonnent comme la même chose. Vous devez renommer l'un de ces champs pour rendre le nom plus descriptif. En outre, si Par est une abréviation, alors ne pas abréger. Vous devriez généralement éviter les abréviations (mais les acronymes sont OK s'ils sont bien connus). La même chose vaut pour "Rep" si c'est une abréviation.

En outre, je suis d'accord avec toutes les notes de Steven.

1
class RepositoryManager 
    { 
     private static List<Repository> Repo { get; set; } 
     . 
     . 
     . 
    } 

    public class Repository   
    { 
      public string Main { get; set; } 
      public string Clean { get; set; } 
      public int CurParCount { get; set; } 
      . 
      . 
    }           
Questions connexes