2009-06-21 8 views
2

J'écris une application qui envoie des commandes en ligne de commande à une application tierce.Comment puis-je organiser des collections de chaînes dans OOP?

J'ai donc une liste de commandes comme:

"process images" 
"apply effect blur" 
"save as png" 
... 

Je ne sais pas comment mieux les organiser dans un style POO.

En ce moment, j'ai:

switch (e.KeyCode) 
{ 
    case Keys.A: 
     SendCommand ("process images"); 
     break; 
    case Keys.B: 
     SendCommand ("apply effect blur"); 
     break; 
    case Keys.C: 
     SendCommand ("save as png"); 
     break; 
     ... 
} 

Je veux être en mesure de le faire d'une manière propre. Peut-être comme:

SendCommand (Commands.ApplyBlur), etc.

Mais je ne sais pas quelle est la meilleure façon. J'ai pensé à les stocker dans une collection, mais je pensais que ce ne serait pas clair ou raisonnable.

Répondre

3

Je suggère d'utiliser un dictionnaire pour la carte entre l'entrée et la commande. La solution la plus simple consiste à mapper directement entre les clés et le texte de la commande.

Dictionary<ConsoleKey, String> map = new Dictionary<ConsoleKey, String>() 
{ 
    { ConsoleKey.A, "process image" }, 
    { ConsoleKey.B, "apply blur effect" }, 
    { ConsoleKey.C, "save as png" } 
}; 

ConsoleKey key = Console.ReadKey().Key; 

String command; 
if (map.TryGetValue(key, out command)) 
{ 
    SendCommand(command); 
} 
else 
{ 
    HandleInvalidInput(); 
} 

En fonction de vos besoins réels, il pourrait être une solution plus propre pour effectuer une cartographie en deux étapes - de la clé d'entrée à une valeur ENUM et de la valeur ENUM au texte de commande. Vous devriez également penser à créer une classe de commande et fournir des instances statiques pour vos commandes.

public class Command 
{ 
    public Command(String commandText) 
    { 
     this.CommandText = commandText; 
    } 

    public String CommandText { get; private set; } 

    public void Send() 
    { 
     // Dummy implementation. 
     Console.WriteLine(this.CommandText); 
    } 

    // Static command instances. 
    public static readonly Command ProcessImage = new Command("process image"); 
    public static readonly Command BlurImage = new Command("apply blur effect"); 
    public static readonly Command SaveImagePng = new Command("save as png"); 
} 

Avec cette classe le code pour envoyer les commandes serait quelque chose comme ceci.

Dictionary<ConsoleKey, Command> map = new Dictionary<ConsoleKey, Command>() 
{ 
    { ConsoleKey.A, Command.ProcessImage }, 
    { ConsoleKey.B, Command.BlurImage}, 
    { ConsoleKey.C, Command.SaveImagePng } 
}; 

ConsoleKey key = Console.ReadKey().Key; 

Command command; 
if (map.TryGetValue(key, out command)) 
{ 
    command.Send(); 
} 
else 
{ 
    HandleInvalidInput(); 
} 
+0

Très bonne réponse. –

2

Je commence juste à comprendre les motifs de conception, mais cela semble être parfait pour le Command Pattern.

1

Vous pouvez utiliser le Command pattern pour vous permettre de placer chaque commande dans sa propre classe. Cela vous permettra également de rendre les commandes accessibles à partir de plusieurs endroits dans votre programme sans avoir à réécrire ou copier et coller le code chaque fois que vous voulez faire quelque chose.

+0

Merci, mais les commandes sont juste des chaînes, est-il sensé de créer des classes séparées pour chacun? –

+0

Ils peuvent être dans le même fichier.Le modèle de commande a été conçu pour des commandes plus complexes, mais il semble être le meilleur pour vos besoins. – mnuzzo

2

Donc, voici mes hypothèses, l'application 3rd Party a un ensemble fini et statique de commutateurs de commande, vous ne serez pas jouer avec l'ensemble des commutateurs, juste en les fournissant à l'application.

Il me semble que si ces hypothèses sont correctes, un modèle de commande est overkill, je serais juste enclin à créer une classe de commandes statiques qui expose les chaînes comme une propriété statique ou constante et contient l'envoi statique méthode de commande.

vous pouvez alors simplement écrire comme vous le suggérez ...

Command.SendCommand(Command.ProcessImages); 
+0

Vos hypothèses sont correctes. –

0

Il peut être bénéfique pour vous mettre les noms des commandes dans un type énuméré pour que d'autres programmeurs qui utilisent votre classe de commande ne doivent pas connaître la commande exacte du texte à envoyer, ils peuvent simplement sélectionner à partir d'un jeu à l'aide auto-complétion dans Visual Studio

public enum CommandType 
{   
    ApplyBlur, 
    ProcessImage, 
    Save 
} 
Questions connexes