Как стать автором
Обновить

Комментарии 32

НЛО прилетело и опубликовало эту надпись здесь
Знаю что это не очень кошерно, но я отметил, что примеры в посту я не мои.
Много опечаток. Ну и, конечно, библиотек множество. Кому-то больше по нраву придется getopt.codeplex.com/.
Да верно, их много. Спасибо подправил.
Есть еще прекрасная штука Mono.Options:
tirania.org/blog/archive/2008/Oct-14.html
devlicio.us/blogs/rob_reynolds/archive/2009/11/22/command-line-parsing-with-mono-options.aspx

Получается что-то типа такого.
var p = new OptionSet () {
            { "n|name=", "the name of someone to greet.",
              v => names.Add (v) },
            { "r|repeat=", "the number of times to repeat the greeting.",
              (int v) => repeat = v },
            { "v", "increase debug message verbosity",
              v => { if (v != null) ++verbosity; } },
            { "h|help",  "show this message and exit", 
              v => show_help = v != null },
        }

Примерно те же яйцы, но на делегатах. В Command Line Parser Library не всем может понравиться генерить и обновлять модельку под параметры.
«Создания пользовательского класса с набором глобальных переменных»
Простите, а мы об одном языке говорим? Я думал, статья о c#.
Спасибо подбправил, согласен не корректно звучит.
«пользовательского класса с набором public переменных»
Лучше не стало.

Честное слово, вы бы хоть немного ознакомились с терминологией ООП и конкретно взятого c#.
Вы бы пример привели, как правильно?
«класс с набором публичных полей»
Слово «пользовательский» не нужно, переменная не может быть публичной.

Кстати, за использование в публичном интерфейсе полей (а не свойств) надо бить палкой по пяткам.
да согласен со всем кроме 2 строки. «пользовательский» можно оставить.
А что, вы можете создать какой-то другой класс? И в чем отличие «пользовательского» класса от не-пользовательского?
Хороший вопрос, просто это достаточно часто употребляемый термин в литературе. Как бы подразумевается что то что ты пишешь пользовательское, а то что написал Microsoft нет — «системное». С точки зрения самого термина, ясное дело никакой разницы.
«это достаточно часто употребляемый термин в литературе»
Да? Покажите мне хотя бы один пример из msdn.

«Как бы подразумевается что то что ты пишешь пользовательское, а то что написал Microsoft нет — «системное».»
А то, что Microsoft написал не в рамках BCL? А то, что написали third-party vendors?
Я не уточнил, это в наших переводных изданиях (книгах) по .NET.
Вообще, конечно, я понимаю, что может это и звучит обидно, но все же от части все программисты пользователи, той же VS.
Так что это слово в данном контексте только подчеркивет суть и не более того.
«Я не уточнил, это в наших переводных изданиях (книгах) по .NET. „
Лишний раз много говорит о качестве переводных изданий.

“Вообще, конечно, я понимаю, что может это и звучит обидно, но все же от части все программисты пользователи, той же VS.»
Программист — пользователь VS, но порожденный им код — не пользовательский. Более того, порождаемый программистом код вполне может быть «системным» для следующего программиста, который пишет к нему «пользовательский». И что в этом случае делать?

Просто обратите внимание, что в msdn такое словоупотребление не встречается вовсе. Там просто пишут «your class».
Да тут унас уже получается место для философии :) ок обязательно.
Это не философия, а азы. Разжеванные у всех, включая МакКоннела.
философия это к слову «пользовательский», а азы тут не причем.
Это как раз и есть азы, а именно выбор правильной абстракции (и, как следствие, правильного термина).
Конечно подравил — молодец. Но если честно, стоило ли так цепляться к терминам, тем более, я уверен что они были понятны на все 100%?
Это его первый пост, а вы сразу набросились.
Если человека не поправить в первом посте, то во втором он сделает все те же ошибки.
Это терминология, то есть азы.
Рекомендую ещё ознакомиться вот с такой штукой. Идеология совершенно иная (построено на колбэках), но тоже весьма юзабельно. Пример кода:
   string data = null;
   bool help   = false;
   int verbose = 0;
   var p = new OptionSet () {
   	{ "file=",      v => data = v },
   	{ "v|verbose",  v => { ++verbose } },
   	{ "h|?|help",   v => help = v != null },
   };
   List<string> extra = p.Parse (args);

В данном примере распознаётся строка вида file=filename.jpg, а так же указана возможность восприятия синонимов (v|verbose).
Тут лежит документация, всё достаточно подробно описано.
Да хорошое замечаение, если кто то хочет работать с Mono почему и нет!
Почему обязательно с моно? Библиотека к моновскому рантайму не привязана, замечательно работает под Windows и ставится через NuGet.
Я использую класс отсюда. Меньше кода, меньше возможностей, но для моих маленьких консольных приложений подходит идеально.
Я не говорил что они не подошли, они все по своему классные, моей идей было просто осветить эту тему. Да нужно наверно просто дописать кусочек.
Я не говорил что они не подошли, они все по своему классные, моей идей было просто осветить эту тему. Да нужно наверно просто дописать кусочек.
Все вроде бы хорошо, но чем больше параметров, тем больше появляется строк типа
int num = int.Parse(args[Х]);

где Х это номер параметра.


Я бы просто использовал циклы.
чем больше параметров, тем больше появляется строк

Откуда в программе вообще строки берутся? Вроде не должно быть.


Когда параметров сильно меньше, чем 100500 (всегда), можно просмотреть свитчем параметры, что там оно передалося, и что из этого нужно взять. Да, появится много немного строк, но мне нравится — когда параметры прибиты гвоздями к программе и к документации.


Вот, как простой пример к осуждению экспертами:


        private static string switch_on { get; set; } = "";
        private static int timeOut { get; set; }
        private static int interVal { get; set; }
        private static bool isDebug { get; set; } = false;
        private static IReadOnlyCollection<string> ProfileInfo { get; set; }

Switch by arguments
        private static void Main(string[] margs)
        {
            if (margs.Length > 0)
            {
                Console.WriteLine("This app startet with parameter/s");
                for (int i = 0; i < margs.Length; i++)
                {
                    switch_on = margs[i];
                    switch (switch_on)
                    {
                        case "-d":
                            Console.WriteLine("Case Debug");
                            isDebug = true;
                            break;
                        case "-t":
                            Console.WriteLine("Case Timeout");
                            timeOut = int.Parse(margs[++i]);
                            break;
                        case "-p":
                            Console.WriteLine("Case Profile");
                            // profile info write with starts and ands " char`s, whitespace char - is a separator of profile info items
                            ProfileInfo = new List<string>(margs[++i].Trim(new char[] { '"' }).Split(new char[] { ' ' }));
                            break;
                        case "-i":
                            Console.WriteLine("Case Interval");
                            interVal= int.Parse(margs[++i]);
                            break;
                        default: Console.WriteLine("Case Default"); break;
                    }
                    Console.WriteLine($"Arg {i} = {margs[i]}");
                }
            }

            Console.WriteLine($"Args length = {margs.Length}");
            Console.WriteLine($"Debug = {isDebug}");
            Console.WriteLine($"Timeout = {timeOut}");
            Console.WriteLine($"Interval = {interVal}");
            Console.WriteLine($"Profile info = {SummaryProfileInfo(ProfileInfo)}");

            Console.ReadLine();
        }

Теперь я могу передать параметры "-d -p "Юра Морозов" -i 555 -t 3600", в любом порядке, в любом наборе, и всё пройдёт гладко. Нет?

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории