2 Stimmen

Wie kann ich Sammlungen von Strings in OOP organisieren?

Ich schreibe eine Anwendung, die Befehlszeilenbefehle an eine Anwendung eines Drittanbieters sendet.

Ich habe also eine Liste von Befehlen wie:

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

Ich weiß nicht, wie ich sie am besten im OOP-Stil organisieren kann.

Im Moment habe ich:

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;
        ...
}

Ich möchte dies auf eine saubere Art und Weise tun können. Vielleicht so:

SendCommand (Commands.ApplyBlur) , usw.

Aber ich weiß nicht, welcher Weg der beste ist. Ich dachte daran, sie in einer Sammlung aufzubewahren, aber ich dachte, das wäre weder übersichtlich noch sinnvoll.

3voto

Daniel Brückner Punkte 57561

Ich schlage vor, ein Wörterbuch zu verwenden, um zwischen der Eingabe und dem Befehl zu unterscheiden. Die einfachste Lösung ist eine direkte Zuordnung zwischen den Schlüsseln und dem Befehlstext.

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();
}

Je nach Ihren tatsächlichen Bedürfnissen könnte es eine sauberere Lösung sein, eine zweistufige Zuordnung vorzunehmen - von der Eingabetaste zu einem Aufzählungswert und von dem Aufzählungswert zum Befehlstext. Sie sollten auch darüber nachdenken, eine Befehlsklasse zu erstellen und statische Instanzen für Ihre Befehle bereitzustellen.

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");
}

Mit dieser Klasse würde der Code zum Senden der Befehle etwa wie folgt aussehen.

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();
}

2voto

Jorge Zuanon Punkte 1234

Ich fange gerade erst an, Design Patterns zu verstehen, aber das scheint perfekt zu sein für die Befehlsmuster .

2voto

Tim Jarvis Punkte 17605

Also hier sind meine Annahmen, die 3rd-Party-App hat eine endliche und statische Reihe von Befehlsschaltern, werden Sie nicht mit dem Satz von Schaltern durcheinander, nur suppliating sie an die App.

Scheint mir, dass, wenn diese Annahmen korrekt sind, ein Befehl-Muster ist Overkill, ich wäre nur geneigt, eine statische Command(s) Klasse zu erstellen, die einfach die Zeichenketten als statische Eigenschaft oder Konstante und enthält die statische senden Befehlsmethode ausstellt.

Sie könnten also einfach schreiben, wie Sie vorgeschlagen haben...

Command.SendCommand(Command.ProcessImages);

1voto

mnuzzo Punkte 3381

Sie könnten die Befehlsmuster damit Sie jeden Befehl in seine eigene Klasse einordnen können. Auf diese Weise können Sie die Befehle auch von mehreren Stellen in Ihrem Programm aus zugänglich machen, ohne den Code jedes Mal neu schreiben oder kopieren und einfügen zu müssen, wenn Sie etwas tun wollen.

0voto

Ehz Punkte 1972

Es kann von Vorteil sein, Ihre Befehlsnamen in einen Aufzählungstyp zu packen, damit andere Programmierer, die Ihre Befehlsklasse verwenden, nicht den genauen Textbefehl kennen müssen, den sie senden sollen, sondern ihn einfach aus einem Satz mit Hilfe der Autovervollständigung in Visual Studio auswählen können

public enum CommandType
{        
    ApplyBlur,
    ProcessImage,
    Save
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X