আমি সম্প্রতি ফুবুকোর কমান্ড লাইনটি পার্সিং বাস্তবায়ন পেরিয়ে এসেছি যা সত্যিই আমার পছন্দ হয়েছে, কারণগুলি:
- এটি ব্যবহার করা সহজ - যদিও আমি এর জন্য কোনও ডকুমেন্টেশন পাইনি, ফুবুকোর সমাধান ইউনিট টেস্টের একটি দুর্দান্ত সেট রয়েছে যা কোনও ডকুমেন্টেশনের চেয়ে কার্যকারিতা সম্পর্কে আরও বেশি কথা বলার ব্যবস্থা করে provides
- এটিতে একটি দুর্দান্ত অবজেক্ট ওরিয়েন্টেড ডিজাইন রয়েছে, কোনও কোডের পুনরাবৃত্তি বা এই জাতীয় কিছু নেই যা আমি আমার কমান্ড লাইনে পার্সিং অ্যাপগুলিতে করতাম
- এটি ঘোষণামূলক: আপনি মূলত কমান্ড এবং পরামিতিগুলির সেটগুলির জন্য ক্লাস লেখেন এবং বিভিন্ন বিকল্প নির্ধারণের জন্য গুণাবলী সহ তাদের সাজাইয়া রাখুন (যেমন নাম, বিবরণ, বাধ্যতামূলক / alচ্ছিক)
- এমনকি লাইব্রেরি এই সংজ্ঞাগুলির উপর ভিত্তি করে একটি দুর্দান্ত ইউজ গ্রাফ প্রিন্ট করে
এটি কীভাবে ব্যবহার করবেন সে সম্পর্কে নীচে একটি সাধারণ উদাহরণ দেওয়া আছে। ব্যবহারটি চিত্রিত করার জন্য, আমি একটি সাধারণ ইউটিলিটি লিখেছি যার দুটি কমান্ড রয়েছে: - যুক্ত করুন (একটি তালিকায় একটি অবজেক্ট যুক্ত করুন - কোনও বস্তুর একটি নাম (স্ট্রিং), মান (int) এবং একটি বুলিয়ান পতাকা রয়েছে) - তালিকা (তালিকা সমস্ত বর্তমানে যুক্ত করা বস্তু)
প্রথমত, আমি 'অ্যাড' কমান্ডের জন্য একটি কমান্ড ক্লাস লিখেছিলাম:
[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;
}
}
এই কমান্ডটি একটি কমান্ড ইনপুট উদাহরণটিকে প্যারামিটার হিসাবে গ্রহণ করে, তাই আমি এটি পরবর্তীটি সংজ্ঞায়িত করি:
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' কমান্ডটি কোনও প্যারামিটার নেয় না, সুতরাং আমি এর জন্য একটি নুলিনপুট শ্রেণি সংজ্ঞায়িত করেছি:
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
-------------------------------------