Нещодавно я натрапив на виконання розбору рядків командного рядка FubuCore, мені це дуже подобається, тому:
- це просто у використанні - хоча я не зміг знайти документацію на нього, рішення FubuCore також пропонує проект, що містить приємний набір тестів Unit, які говорять більше про функціональність, ніж будь-яка документація могла
- він має приємний об'єктно-орієнтований дизайн, відсутність повторення коду чи інших подібних речей, які я мав у своїх програмах для розбору командного рядка
- це декларативно: ви в основному пишете класи для команд і наборів параметрів і прикрашаєте їх атрибутами для встановлення різних параметрів (наприклад, ім'я, опис, обов'язковий / необов'язковий)
- бібліотека навіть друкує хороший графік використання, виходячи з цих визначень
Нижче наводиться простий приклад того, як це використовувати. Для ілюстрації використання я написав просту утиліту, яка має дві команди: - додати (додає об’єкт до списку - об’єкт складається з імені (рядок), значення (int) та булевого прапора) - список (списки всі додані об'єкти)
Перш за все, я написав клас Command для команди "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;
}
}
Ця команда приймає екземпляр CommandInput як параметр, тому я визначаю наступне:
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; }
}
Наступна команда - «список», яка реалізується наступним чином:
[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;
}
}
Команда 'list' не приймає жодних параметрів, тому для цього я визначив клас NullInput:
public class NullInput { }
Все, що залишилося зараз, - це підключити метод методом Main (), як це:
static void Main(string[] args)
{
var factory = new CommandFactory();
factory.RegisterCommands(typeof(Program).Assembly);
var executor = new CommandExecutor(factory);
executor.Execute(args);
}
Програма працює як очікувалося, друкуючи підказки про правильне використання у випадку, якщо будь-які команди є недійсними:
------------------------
Available commands:
------------------------
add -> Add object
list -> List objects
------------------------
І вибірки використання команди "додати":
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
-------------------------------------