मैं हाल ही में FubuCore कमांड लाइन को लागू करने के लिए आया था जिसे मैं वास्तव में पसंद कर रहा हूं, इसके कारण:
- इसका उपयोग करना आसान है - हालाँकि मुझे इसके लिए कोई दस्तावेज नहीं मिला, FubuCore समाधान भी एक परियोजना प्रदान करता है जिसमें यूनिट टेस्ट का एक अच्छा सेट है जो किसी भी दस्तावेज की तुलना में कार्यक्षमता के बारे में अधिक बात करता है।
- यह एक अच्छी वस्तु उन्मुख डिजाइन, कोई कोड पुनरावृत्ति या अन्य ऐसी चीजें हैं जो मैं अपने कमांड लाइन पार्सिंग एप्लिकेशन में उपयोग करता था
- यह घोषणात्मक है: आप मूल रूप से कमांड और मापदंडों के सेट के लिए कक्षाएं लिखते हैं और उन्हें विभिन्न विकल्पों (जैसे नाम, विवरण, अनिवार्य / वैकल्पिक) को सेट करने के लिए विशेषताओं के साथ सजाते हैं।
- पुस्तकालय भी इन परिभाषाओं के आधार पर एक अच्छा उपयोग ग्राफ प्रिंट करता है
नीचे इसका उपयोग करने के तरीके के बारे में एक सरल उदाहरण दिया गया है। उपयोग को समझाने के लिए, मैंने एक साधारण उपयोगिता लिखी है जिसमें दो कमांड हैं: - 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;
}
}
'सूची' कमांड कोई पैरामीटर नहीं लेता है, इसलिए मैंने इसके लिए 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
-------------------------------------