Creazione di un programma simile a CMD (Command Line Parser)

-1

Sto creando un programma simile a CMD in cui l'utente gestisce il suo "disco" con i comandi. Mi piacerebbe sapere se c'è un modo di fare questo tipo di applicazione in un modo più semplice / migliore. In realtà sto facendo così:

Elenco dei comandi

Ho creato un enum con tutti i comandi per aggiungere e gestire facilmente i comandi

Esecuzione della riga di comando

Per sapere quale comando sta cercando di eseguire l'utente ottengo una lista con i valori enum e procedo a ottenere il comando nella lista.

var list = ((Commands[])Enum.GetValues(typeof(Commands))).ToList();

var commandText = inputLine.Split(' ')[0];

if (list.Select(x => x.ToString().ToLower()).Contains(commandText))
{
    var command = list.FirstOrDefault(x => x.ToString().ToLower() == commandText);
    switch (command)
    {
        case Commands.List:
            Listar();
            break;
        case Commands.Go:
            Go();
            break;
    }
}

Modifica:

La domanda è stata sbagliata, non sto cercando di trovare un modo migliore per risolvere il problema dello switch, lo sto utilizzando perché è un numero limitato di comandi, quindi ha senso utilizzarlo. La risposta che volevo era solo un modo migliore per creare un parser della riga di comando. In realtà sono in una competizione in cui non ho accesso a Internet, quindi niente NuGet.

Anche il modo di ottenere i parametri sembra sbagliato:

var temp = _line.Split('"').ToList();
var vals = new List<string>();

for (int i = 0; i < temp.Count; i++)
{
    if (i % 2 == 0)
        vals.AddRange(temp[i].Split('-').Select(x => x.Trim()));
    else
        vals.Add(temp[i]);
}


var path = _currentDirectory;

if (vals.Contains("p"))
    path = vals[vals.IndexOf("p") + 1];
    
posta Pancabiel 30.10.2018 - 14:47
fonte

1 risposta

3

Il problema principale che vedo con questo approccio è l'estensibilità.

Se si desidera aggiungere un comando aggiuntivo all'applicazione CMD, sarà necessario aggiungerlo all'enumerazione e aggiungere un numero crescente di elementi nell'istruzione switch. Questo funzionerà per 10, 20, forse più funzioni, ma che dire quando ne hai 100? O 1000?

Il mio suggerimento sarebbe di usare un'interfaccia

public interface ICmd
{
  string CommandText {get; }
  void Execute(string[] args);
}

Quindi nel tuo codice avresti:

var allCommands = GetAllLoadedCommands(); // probably via reflection
var cmd = allCommands.SingleOrDefault(c => c.Name == commandText);
if(cmd != null)
{
  cmd.Execute();
}

Vedi questa domanda per ulteriori dettagli sul bit di riflessione.

In questo modo tutto ciò che devi fare è implementare una nuova versione dell'interfaccia.

Per inciso - bel lavoro su enum GetValues (), non penso che questo sia il posto giusto per farlo, ma è una buona tecnica sapere.

    
risposta data 30.10.2018 - 15:04
fonte

Leggi altre domande sui tag