Saya baru-baru ini menemukan implementasi parsing baris perintah FubuCore saya sangat menyukainya, alasannya adalah:
- mudah digunakan - walaupun saya tidak dapat menemukan dokumentasi untuk itu, solusi FubuCore juga menyediakan proyek yang berisi set Unit Tes yang bagus yang berbicara lebih banyak tentang fungsionalitas daripada dokumentasi apa pun yang bisa
- ia memiliki desain berorientasi objek yang bagus, tidak ada pengulangan kode atau hal-hal lain yang saya gunakan di aplikasi parsing baris perintah
- itu deklaratif: pada dasarnya Anda menulis kelas untuk Perintah dan set parameter dan menghiasnya dengan atribut untuk mengatur berbagai opsi (misalnya nama, deskripsi, wajib / opsional)
- perpustakaan bahkan mencetak Grafik Penggunaan yang bagus, berdasarkan definisi ini
Di bawah ini adalah contoh sederhana tentang cara menggunakan ini. Untuk menggambarkan penggunaannya, saya telah menulis sebuah utilitas sederhana yang memiliki dua perintah: - tambah (tambahkan objek ke daftar - objek terdiri dari nama (string), nilai (int) dan bendera boolean) - daftar (daftar semua objek yang saat ini ditambahkan)
Pertama-tama, saya menulis kelas Command untuk perintah '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;
}
}
Perintah ini menggunakan instance CommandInput sebagai parameter, jadi saya mendefinisikannya selanjutnya:
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; }
}
Perintah selanjutnya adalah 'daftar', yang diimplementasikan sebagai berikut:
[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;
}
}
Perintah 'list' tidak mengambil parameter, jadi saya mendefinisikan kelas NullInput untuk ini:
public class NullInput { }
Yang tersisa sekarang adalah memasang ini di metode Main (), seperti ini:
static void Main(string[] args)
{
var factory = new CommandFactory();
factory.RegisterCommands(typeof(Program).Assembly);
var executor = new CommandExecutor(factory);
executor.Execute(args);
}
Program ini berfungsi seperti yang diharapkan, petunjuk pencetakan tentang penggunaan yang benar jika ada perintah yang tidak valid:
------------------------
Available commands:
------------------------
add -> Add object
list -> List objects
------------------------
Dan contoh penggunaan untuk perintah '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
-------------------------------------