Je suis récemment tombé sur l'implémentation de l'analyse de la ligne de commande FubuCore Je l'aime vraiment, les raisons étant:
- il est facile à utiliser - bien que je n'aie pas pu trouver de documentation pour cela, la solution FubuCore fournit également un projet contenant un bel ensemble de tests unitaires qui parlent plus de la fonctionnalité que n'importe quelle documentation.
- il a une belle conception orientée objet, pas de répétition de code ou d'autres choses que j'avais l'habitude d'avoir dans mes applications d'analyse de ligne de commande
- c'est déclaratif: vous écrivez essentiellement des classes pour les commandes et les ensembles de paramètres et vous les décorez d'attributs pour définir diverses options (par exemple, nom, description, obligatoire / facultatif)
- la bibliothèque imprime même un joli graphique d'utilisation, basé sur ces définitions
Voici un exemple simple sur la façon de l'utiliser. Pour illustrer l'utilisation, j'ai écrit un utilitaire simple qui a deux commandes: - ajouter (ajoute un objet à une liste - un objet se compose d'un nom (chaîne), d'une valeur (int) et d'un drapeau booléen) - liste (listes tous les objets actuellement ajoutés)
Tout d'abord, j'ai écrit une classe Command pour la commande 'add':
[Usage("add", "Adds an object to the list")]
[CommandDescription("Add object", Name = "add")]
public class AddCommand : FubuCommand<CommandInput>
{
public override bool Execute(CommandInput input)
{
State.Objects.Add(input); // add the new object to an in-memory collection
return true;
}
}
Cette commande prend une instance CommandInput comme paramètre, donc je définis cela ensuite:
public class CommandInput
{
[RequiredUsage("add"), Description("The name of the object to add")]
public string ObjectName { get; set; }
[ValidUsage("add")]
[Description("The value of the object to add")]
public int ObjectValue { get; set; }
[Description("Multiply the value by -1")]
[ValidUsage("add")]
[FlagAlias("nv")]
public bool NegateValueFlag { get; set; }
}
La commande suivante est 'list', qui est implémentée comme suit:
[Usage("list", "List the objects we have so far")]
[CommandDescription("List objects", Name = "list")]
public class ListCommand : FubuCommand<NullInput>
{
public override bool Execute(NullInput input)
{
State.Objects.ForEach(Console.WriteLine);
return false;
}
}
La commande 'list' ne prend aucun paramètre, j'ai donc défini une classe NullInput pour cela:
public class NullInput { }
Il ne reste plus qu'à câbler ceci dans la méthode Main (), comme ceci:
static void Main(string[] args)
{
var factory = new CommandFactory();
factory.RegisterCommands(typeof(Program).Assembly);
var executor = new CommandExecutor(factory);
executor.Execute(args);
}
Le programme fonctionne comme prévu, imprimant des conseils sur l'utilisation correcte au cas où des commandes ne seraient pas valides:
------------------------
Available commands:
------------------------
add -> Add object
list -> List objects
------------------------
Et un exemple d'utilisation de la commande 'add':
Usages for 'add' (Add object)
add <objectname> [-nv]
-------------------------------------------------
Arguments
-------------------------------------------------
objectname -> The name of the object to add
objectvalue -> The value of the object to add
-------------------------------------------------
-------------------------------------
Flags
-------------------------------------
[-nv] -> Multiply the value by -1
-------------------------------------