2008-09-02 10 views
2

J'ai une situation où j'ai un formulaire principal qui affiche un formulaire de configuration avancé qui contient juste une demi-douzaine de cases à cocher et de listes déroulantes pour en sélectionner options avancées (les cases à cocher pour activer/désactiver, le combo pour sélectionner un média si activé).Meilleure façon de passer un grand nombre d'arguments dans une boîte de dialogue de configuration

Si je viens de passer les paramètres individuels pour les boîtes de contrôle et de liste déroulante dans le constructeur pour le dialogue qui est évidemment une douzaine d'arguments, ce qui semble un peu excessif. Mon autre option évidente serait puisque dans la forme principale ces paramètres sont stockés dans un grand IDictionary avec tous les autres paramètres principaux de forme que je pourrais juste passer ce dictionnaire dedans et le récupérer après avec les valeurs mises à jour, mais ma compréhension c'est que ce ne serait pas vraiment une bonne pratique de codage. Est-ce que je manque un bon moyen de faire cela qui est à la fois efficace et une bonne pratique de codage?

(ce code particulier est en C#, bien que j'ai le sentiment d'une solution générale s'appliquerait à d'autres langues)

Répondre

6

Personnellement, je créer un objet porteur pour stocker les valeurs. Vous obtenez alors l'intellisense gentil pour lui, et les changements à lui seraient tout à fait simples. Il serait également plus rapide que les recherches de dictionnaire pour les valeurs de paramètres. Et bien sûr, vous obtenez la sécurité du type. :)

0

Quelque chose comme cela devrait être bon:

MyConfigurationDialog dialog = new MyConfigurationDialog(); 

//Copy the dictionary so that the dialog can't mess with our settings 
dialog.Settings = new Dictionary(existingSettings); 

if(DialogResult.OK == dialog.Show()) { 
    //grab the settings that the dialog may have changed 
    existingSettings["setting1"] = dialog.Settings["setting1"]; 
    existingSettings["setting2"] = dialog.Settings["setting2"]; 
} 
0

Je suis d'accord avec Rob Cooper. Créez une classe pour représenter votre configuration et transmettez-la dans le constructeur de votre formulaire. Cela vous permettra également de définir des méthodes sur votre nouvelle classe "config" comme "saveSettings", "LoadSettings", etc. Cela devrait à son tour garder le code plus maintenable en général. Comme alternative rapide, si vous enregistrez ces fichiers dans un fichier quelque part, transmettez simplement le nom du fichier et demandez à votre formulaire de le lire au moment de l'exécution.

La première option est vraiment la voie à suivre, IMO.

1

Vous pourriez aller avec la solution de Rob; c'est le plus joli pour le développement. Votre "objet porteur" pourrait contenir l'IDictionary entier et avoir tapé des propriétés pour aider intellisense. Les propriétés pourraient mettre à jour l'IDictionary. Lorsque vous avez terminé, vous pouvez renvoyer l'objet transporteur et récupérer directement l'IDictionary.

Par exemple, si votre dictionnaire avait une paire de clés/valeur « FirstEnabled »/booléenne, vous pouvez le faire:

class ContainerObject 
{ 
    public IDictionary<object, object> _dict; 
    public ContainerObject(IDictionary<object, object> dict) 
    { 
     _dict = dict; 
    } 

    public bool FirstEnabled 
    { 
     get { return (bool) _dict["FirstEnabled"]; } 
     set { _dict["FirstEnabled"] = value; } 
    } 
} 

Vous pouvez changer le membre « _dict » à privé ou protégé et ont une fonction accesseur si tu veux.

Questions connexes