Работа с Command Line в .Net

Автор: admin от 13-04-2012, 00:04, посмотрело: 3 137

Добрый день сообщество,

Долгое время, я был просто, читателем полезных технических статей.
Думаю что пришло и мое время написать свой первый пост. Я надеюсь, что этот пост который, будет полезен не только начинающим разработчикам .net.

Мне кажется, что этой, на первый взгляд, банальной теме уделяется мало внимания. В этой статье я хотел бы поделится опытом работы с Command Line в .Net.

Почему, я выбрал эту тему, очень часто в университетах студентам рассказывают о параметрах командной строки
static void Main(string[] args)

и после чего дают задачи, которые звучат примерно так в“Напишите приложение А которое будет принимать параметры X,Y,Z, произведет действие и выведите их на экран...”.
После чего, обычно, получается примерно, следующий код:
class MainClass
{
    static int Main(string[] args)
    {
        // Test if input arguments were supplied:
        if (args.Length == 0)
        {
            System.Console.WriteLine("Please enter a numeric argument.");
            System.Console.WriteLine("Usage: Factorial ");
            return 1;
        }

        try
        {
            // Convert the input arguments to numbers:
            int num = int.Parse(args[0]);

            System.Console.WriteLine("The Factorial of {0} is {1}.", num, Functions.Factorial(num));
            return 0;
        }
        catch (System.FormatException)
        {
            System.Console.WriteLine("Please enter a numeric argument.");
            System.Console.WriteLine("Usage: Factorial ");
            return 1;
        }
    }
}


Все вроде бы хорошо, но чем больше параметров тем больше появляется строк типа
int num = int.Parse(args[Х]);
где Х это номер параметра.

В большинстве случаев люди привыкают к такому типу вычитки параметров. Придя на реальный проект, и получая задание, написать небольшую консольное приложение, которое будет при определённых параметрах что то делать, работают с параметрами тем же способом.
Но в реальных приложениях параметров командной строки, может быть великое множество, да и порядок их не должен иметь особого значения для пользователя.
Но даже во многих реальных продуктах, в крации, суть вычитки параметров командной строки сводится к работе с массовом string[] args.

Я тоже написал и видел много вариантов чтения параметров, и в один прекрасный день нашел красивую реализацию вычитки параметров, которые меня устраивает полностью это библиотека Command Line Parser Library.

Чем же она хороша?

А прелесть ее использования заключается всего в 3-х шагах:
  • Создания пользовательского класса с набором глобальных переменных которые будут нашими параметрами

  • Используя атрибут Option над каждой переменной создать ее описание.

  • Самое использование CommandLineParser.

  • public enum OptimizeFor
            {
                Unspecified,
                Speed,
                Accuracy
            }

            public sealed class Options : CommandLineOptionsBase
            {
                #region Standard Option Attribute
                [Option("r", "read",
                        Required = true,
                        HelpText = "Input file with data to process.")]
                public string InputFile = String.Empty;

                [Option("w", "write",
                        HelpText = "Output file with processed data (otherwise standard output).")]
                public string OutputFile = String.Empty;

                [Option("j", "jump",
                        HelpText = "Data processing start offset.")]
                public double StartOffset = 0;

                [Option(null, "optimize",
                    HelpText = "Optimize for Speed|Accuracy.")]
                public OptimizeFor Optimization = OptimizeFor.Unspecified;
                #endregion

                #region Specialized Option Attribute
                [ValueList(typeof(List))]
                public IList DefinitionFiles = null;

                [OptionList("o", "operators", Separator = ';',
                    HelpText = "Operators included in processing (+;-;...)." +
                    " Separate each operator with a semicolon." +
                    " Do not include spaces between operators and separator.")]
                public IList AllowedOperators = null;
              
                [HelpOption(HelpText = "Dispaly this help screen.")]
                public string GetUsage()
                {
                    var help = new HelpText(Program._headingInfo);
                    help.AdditionalNewLineAfterOption = true;
                    help.Copyright = new CopyrightInfo("Giacomo Stelluti Scala", 2005, 2009);
                    this.HandleParsingErrorsInHelp(help);
                    help.AddPreOptionsLine("This is free software. You may redistribute copies of it under the terms of");
                    help.AddPreOptionsLine("the MIT License .");
                    help.AddPreOptionsLine("Usage: SampleApp -rMyData.in -wMyData.out --calculate");
                    help.AddPreOptionsLine(string.Format("       SampleApp -rMyData.in -i -j{0} file0.def file1.def", 9.7));
                    help.AddPreOptionsLine("       SampleApp -rMath.xml -wReport.bin -o *;/;+;-");
                    help.AddOptions(this);

                    return help;
                }

                private void HandleParsingErrorsInHelp(HelpText help)
                {
                    string errors = help.RenderParsingErrorsText(this);
                    if (!string.IsNullOrEmpty(errors))
                    {
                        help.AddPreOptionsLine(string.Concat(Environment.NewLine, "ERROR: ", errors, Environment.NewLine));
                    }
                }        
            }


    Как вы можите видеть, из примера, библиетека помогает парсить любые типа параметров, и помогает достаточно просто создавать помощь по работе с командной строкой.

    Сама непосредтвенная работа с парсингои выгдядит так:
    private static void Main(string[] args)
            {
                var options = new Options();
                ICommandLineParser parser = new CommandLineParser();
                if (!parser.ParseArguments(args, options))
                    Environment.Exit(1);

                DoCoreTask(options);

                Environment.Exit(0);
            }


    Как видно использование данного подхода несет в себе массу положительных моментов в виде удобочитаемости, тестируемости, поддержки т.д.

    Спасибо, надеюсь мой первый «блин» вышел не комом, а экзешником.

    Ссылки на библиотеку и примеры взяты из:
    MSDN: http://msdn.microsoft.com/en-us/library/cb20e19t(v=vs.80).aspx
    Command Line Parser Library: Command Line Parser Library



    Источник: Убунтариум

    Категория: Операционные системы / Ubuntu

    Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
    Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

    Добавление комментария

    Имя:*
    E-Mail:
    Комментарий:
    • bowtiesmilelaughingblushsmileyrelaxedsmirk
      heart_eyeskissing_heartkissing_closed_eyesflushedrelievedsatisfiedgrin
      winkstuck_out_tongue_winking_eyestuck_out_tongue_closed_eyesgrinningkissingstuck_out_tonguesleeping
      worriedfrowninganguishedopen_mouthgrimacingconfusedhushed
      expressionlessunamusedsweat_smilesweatdisappointed_relievedwearypensive
      disappointedconfoundedfearfulcold_sweatperseverecrysob
      joyastonishedscreamtired_faceangryragetriumph
      sleepyyummasksunglassesdizzy_faceimpsmiling_imp
      neutral_faceno_mouthinnocent