маленькие радости
Mar. 28th, 2015 11:45 pmДобавил тут в одну программку простейшую конфигурацию: именованные параметры, загружаемые при первом обращении из текстового файла, и имеющие значения по-умолчанию на случай если файл конфигурации отсутствует или не содержит нужного значения. Потом заметил, что имена всех параметров указаны в исходниках, т.е. известны во время компиляции. А значит было бы неплохо прямо при компиляции убеждаться, что все запрашиваемые имена параметров верные, т.е. для каждого запрашиваемого параметра описано значение по-умолчанию, и нигде не будет ненароком запрошено что-нибудь неизвестное.
Делается просто. Добавляем еще одну пару скобок к функции получения значения из конфигурации, делая передаваемое имя параметра не рантайм-, а компайлтайм аргументом. Ассоциативный массив с ответами по-умолчанию делаем компайл-тайм константой (волшебное слово enum). В начало функции добавляем static if с проверкой (осуществляемой при компиляции) на наличие запрашиваемого имени в том ассоц.массиве. Если не найдено, говорим ругаться при компиляции такими-то словами. Все.
Теперь если допустить очепятку и написать
то программа не компилируется, а компилятор пишет
Мелочь, а приятно. За такие вот в том числе и люблю D.
Делается просто. Добавляем еще одну пару скобок к функции получения значения из конфигурации, делая передаваемое имя параметра не рантайм-, а компайлтайм аргументом. Ассоциативный массив с ответами по-умолчанию делаем компайл-тайм константой (волшебное слово enum). В начало функции добавляем static if с проверкой (осуществляемой при компиляции) на наличие запрашиваемого имени в том ассоц.массиве. Если не найдено, говорим ругаться при компиляции такими-то словами. Все.
string getOptionString(string name)() { static if (name !in defaults) { static assert(0, "unknown option name: " ~ name); } auto ops = getOptions(); return ops[name]; } private: enum defaults = ["quantity": "large", "quality" : "high"]; ...
Теперь если допустить очепятку и написать
string q = getOptionString!("quanlity");то программа не компилируется, а компилятор пишет
options.d(5): Error: static assert "unknown option name: quanlity" main.d(210): instantiated from here: getOptionString!"quanlity"
Мелочь, а приятно. За такие вот в том числе и люблю D.
no subject
Date: 2015-03-28 05:14 pm (UTC)So you cannot have ine config for dev and another for prod?
no subject
Date: 2015-03-28 07:03 pm (UTC)version(prod) { enum defaults = [...]; } version(dev) { enum defaults = [...]; }no subject
Date: 2015-03-29 02:20 am (UTC)no subject
Date: 2015-03-28 05:22 pm (UTC)no subject
Date: 2015-03-28 07:08 pm (UTC)Чтение конфига из файла тогда чуть усложняется по сравнению с текущим (заполнением хэша из строк в строки). Такой вот def_option(quantity, string, "large") будет тогда говорить как читать данную переменную. Можно, да, тоже вариант.
no subject
Date: 2015-03-28 07:19 pm (UTC)no subject
Date: 2015-03-28 11:49 pm (UTC)Побочный эффект.
Потом при настройке программы будет не понятно, читается ли файл с конфигом или нет, и тот ли файл читается. Мгновенного фидбэка нет.
Когда источник парметров только один - один конкретный файл, то намного проще запускать. Когда файла нет или он неправильный, нам об этом явно говорят и программа явно падает. А если не падает, то 100% файл там где надо и в нём описано всё что надо - защита от дурака.
no subject
Date: 2015-03-29 04:49 am (UTC)no subject
Date: 2015-03-29 07:14 am (UTC)no subject
Date: 2015-03-29 10:30 am (UTC)no subject
Date: 2015-03-30 10:27 am (UTC)Это, конечно, достаточно общая беда, но почему-то мне кажется, что достоинства такого кода, скажем так, несколько преувеличены.
no subject
Date: 2015-03-30 11:47 am (UTC)С автоматизацией вообще не вижу проблемы. Добавляешь тесты в исходники, они либо компилируются, либо нет, с сообщением где ошибка. Автоматизируется не хуже других тестов.
no subject
Date: 2015-03-30 05:16 pm (UTC)no subject
Date: 2015-04-14 08:29 am (UTC)no subject
Date: 2015-04-02 11:18 am (UTC)Но работало впечатляюще - можно было превью миксинов и шаблонов смотреть, по шагам смотреть как развертывание происходит
no subject
Date: 2015-04-02 12:30 pm (UTC)Вообще хотя бы не по шагам, но просто посмотреть во что в итоге выливаются все эти шаблоны после их подстановки и разворачивания было бы полезно иногда.
no subject
Date: 2015-04-14 08:27 am (UTC)Компилятор D умеет сразу рассказать про все ошибки, или для этого надо плодить разные единицы компиляции где-то снаружи?
no subject
Date: 2015-04-14 09:22 am (UTC)no subject
Date: 2015-03-29 07:50 am (UTC)enum Options {Quantity, Quality}
string GetOptionValue(Options option)
Внутри только проверку не забыть что кто-нибудь не передал ((Options)100500).
no subject
Date: 2015-03-29 10:28 am (UTC)У меня строчечки были, потому что хэш из строк в строки тривиально прочитать и запрашивать. Я как-то не вспомнил, что значения из enum и строки можно легко туда-сюда конвертировать.