Добрый день сообщество,
Долгое время я был просто читателем полезных технических статей.
Думаю, что пришло и мое время написать свой первый пост. Я надеюсь, что этот пост который, будет полезен не только начинающим разработчикам .net.
Мне кажется, что этой, на первый взгляд, банальной теме уделяется мало внимания. В этой статье я хотел бы поделится опытом работы с Command Line в .Net.
Почему, я выбрал эту тему, очень часто в университетах студентам рассказывают о параметрах командной строки
и после чего дают задачи, которые звучат примерно так “Напишите приложение А которое будет принимать параметры X,Y,Z, произведет действие и выведите их на экран...”.
После чего, обычно, получается примерно, следующий код:
Все вроде бы хорошо, но чем больше параметров, тем больше появляется строк типа
В большинстве случаев люди привыкают к такому типу вычитки параметров. Придя на реальный проект, и получая задание, написать небольшую консольное приложение, которое будет при определённых параметрах что то делать, работают с параметрами тем же способом.
Но в реальных приложениях параметров командной строки, может быть великое множество, да и порядок их не должен иметь особого значения для пользователя.
Но даже во многих реальных продуктах, в крации, суть вычитки параметров командной строки сводится к работе с массовом string[] args.
Я тоже написал и видел много вариантов чтения параметров, и в один прекрасный день нашел красивую реализацию вычитки параметров, которые меня устраивает полностью это библиотека Command Line Parser Library.
Чем же она хороша?
А прелесть ее использования заключается всего в 3-х шагах:
Как вы можете видеть, из примера, библиотека помогает парсить любые типа параметров, и помогает достаточно просто создавать помощь по работе с командной строкой.
Сама непосредственная работа с парсингои выглядит так:
Как видно использование данного подхода несет в себе массу положительных моментов в виде удобочитаемости, тестируемости, поддержки т.д.
Спасибо, надеюсь, мой первый «блин» вышел не комом, а экзешником.
Ссылки на библиотеку и примеры взяты из:
MSDN: http://msdn.microsoft.com/en-us/library/cb20e19t(v=vs.80).aspx
Command Line Parser Library: Command Line Parser Library
Долгое время я был просто читателем полезных технических статей.
Думаю, что пришло и мое время написать свой первый пост. Я надеюсь, что этот пост который, будет полезен не только начинающим разработчикам .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 <num>"); 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 <num>"); return 1; } } }
Все вроде бы хорошо, но чем больше параметров, тем больше появляется строк типа
где Х это номер параметра.int num = int.Parse(args[Х]);
В большинстве случаев люди привыкают к такому типу вычитки параметров. Придя на реальный проект, и получая задание, написать небольшую консольное приложение, которое будет при определённых параметрах что то делать, работают с параметрами тем же способом.
Но в реальных приложениях параметров командной строки, может быть великое множество, да и порядок их не должен иметь особого значения для пользователя.
Но даже во многих реальных продуктах, в крации, суть вычитки параметров командной строки сводится к работе с массовом string[] args.
Я тоже написал и видел много вариантов чтения параметров, и в один прекрасный день нашел красивую реализацию вычитки параметров, которые меня устраивает полностью это библиотека Command Line Parser Library.
Чем же она хороша?
А прелесть ее использования заключается всего в 3-х шагах:
- Создания пользовательского класса с набором public полей, которые будут нашими параметрами
- Используя атрибут 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<string>))] public IList<string> 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<string> 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 <http://www.opensource.org/licenses/mit-license.php>."); 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
