ฉันเพิ่งเจอการใช้บรรทัดคำสั่งการแยกวิเคราะห์ FubuCore ฉันชอบมันมากเหตุผล:
- มันใช้งานง่าย - แม้ว่าฉันจะไม่พบเอกสารประกอบ แต่โซลูชัน FubuCore ยังมีโครงการที่มีชุดทดสอบหน่วยที่ดีซึ่งพูดถึงการใช้งานได้มากกว่าเอกสารใด ๆ
- มันมีการออกแบบเชิงวัตถุที่ดีไม่มีการทำซ้ำรหัสหรือสิ่งอื่น ๆ ที่ฉันเคยมีในแอพบรรทัดคำสั่งของฉัน
- เป็นการประกาศ: โดยทั่วไปคุณเขียนคลาสสำหรับคำสั่งและชุดพารามิเตอร์และตกแต่งด้วยแอททริบิวเพื่อตั้งค่าตัวเลือกต่าง ๆ (เช่นชื่อคำอธิบายบังคับ / ไม่จำเป็น)
- ห้องสมุดยังพิมพ์กราฟการใช้งานที่ดีตามคำจำกัดความเหล่านี้
ด้านล่างเป็นตัวอย่างง่ายๆเกี่ยวกับวิธีใช้สิ่งนี้ เพื่อแสดงการใช้งานฉันได้เขียนโปรแกรมอรรถประโยชน์ที่มีสองคำสั่ง: - เพิ่ม (เพิ่มวัตถุในรายการ - วัตถุประกอบด้วยชื่อ (สตริง), ค่า (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 { }
สิ่งที่เหลืออยู่ในตอนนี้คือการเชื่อมโยงสิ่งนี้ในวิธีการหลัก () เช่นนี้:
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
-------------------------------------