Son zamanlarda FubuCore Komut satırı ayrıştırma uygulamasına rastladım Gerçekten hoşuma gitti, nedenleri:
- kullanımı kolay - bunun için bir belge bulamamam da, FubuCore çözümü, işlevsellik hakkında herhangi bir belgenin yapabileceğinden daha fazla konuşan güzel bir Birim Testleri içeren bir proje de sunuyor.
- güzel bir nesne yönelimli bir tasarıma, kod tekrarı veya komut satırı uygulamalarımda kullandığım başka şeylere sahip değil
- bildirim niteliğindedir: temel olarak Komutlar ve parametre setleri için sınıflar yazar ve çeşitli seçenekleri ayarlamak için niteliklerle süslersiniz (örn. ad, açıklama, zorunlu / isteğe bağlı)
- kütüphane bu tanımlara dayanarak güzel bir Kullanım Grafiği bile yazdırıyor
Aşağıda bunun nasıl kullanılacağına dair basit bir örnek verilmiştir. Kullanımı göstermek için iki komut içeren basit bir yardımcı program yazdım: - add (listeye bir nesne ekler - bir nesne bir ad (dize), değer (int) ve bir boole bayrağı içerir) - list (listeler şu anda eklenen tüm nesneler)
Her şeyden önce, 'add' komutu için bir Command sınıfı yazdım:
[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;
}
}
Bu komut parametre olarak bir CommandInput örneği alır, bu yüzden bir sonraki tanımlayın:
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; }
}
Bir sonraki komut aşağıdaki gibi uygulanan 'list'tir:
[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' komutu hiçbir parametre almaz, bu yüzden bunun için bir NullInput sınıfı tanımladım:
public class NullInput { }
Şimdi kalan tek şey bunu Main () yönteminde bağlamaktır:
static void Main(string[] args)
{
var factory = new CommandFactory();
factory.RegisterCommands(typeof(Program).Assembly);
var executor = new CommandExecutor(factory);
executor.Execute(args);
}
Program beklendiği gibi çalışır, herhangi bir komutun geçersiz olması durumunda doğru kullanım hakkında ipuçları yazdırır:
------------------------
Available commands:
------------------------
add -> Add object
list -> List objects
------------------------
Ve 'add' komutu için örnek bir kullanım:
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
-------------------------------------