thedeemon: (office)
[personal profile] thedeemon
Добавил тут в одну программку простейшую конфигурацию: именованные параметры, загружаемые при первом обращении из текстового файла, и имеющие значения по-умолчанию на случай если файл конфигурации отсутствует или не содержит нужного значения. Потом заметил, что имена всех параметров указаны в исходниках, т.е. известны во время компиляции. А значит было бы неплохо прямо при компиляции убеждаться, что все запрашиваемые имена параметров верные, т.е. для каждого запрашиваемого параметра описано значение по-умолчанию, и нигде не будет ненароком запрошено что-нибудь неизвестное.

Делается просто. Добавляем еще одну пару скобок к функции получения значения из конфигурации, делая передаваемое имя параметра не рантайм-, а компайлтайм аргументом. Ассоциативный массив с ответами по-умолчанию делаем компайл-тайм константой (волшебное слово 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.

Date: 2015-03-28 05:14 pm (UTC)
From: [identity profile] juan-gandhi.livejournal.com

So you cannot have ine config for dev and another for prod?

Date: 2015-03-28 07:03 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
There are two possible values for each parameter: default value and the one from config file. Default one is set in sources, the other is in a file. Config files can of course be different. Default values can be defined differently by using
version(prod) {
  enum defaults = [...];
} 
version(dev) {
  enum defaults = [...];
}

Date: 2015-03-29 02:20 am (UTC)
From: [identity profile] juan-gandhi.livejournal.com
Kind of makes sense to me.

Date: 2015-03-28 05:22 pm (UTC)
From: [identity profile] justy-tylor.livejournal.com
А не проще добавить возможность указания def_option(quantity, string, "large") в любом исходнике, чтобы потом просто quantity, без всяких getOptionString? Такие макросы (через регистраторы в статике) легко делаются в C++. В D должно получиться даже чуть надёжнее.

Date: 2015-03-28 07:08 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Можно просто по переменной на каждую опцию завести.
Чтение конфига из файла тогда чуть усложняется по сравнению с текущим (заполнением хэша из строк в строки). Такой вот def_option(quantity, string, "large") будет тогда говорить как читать данную переменную. Можно, да, тоже вариант.

Date: 2015-03-28 07:19 pm (UTC)
From: [identity profile] justy-tylor.livejournal.com
Так сам def_option и создаёт переменную, а также регистрирует её на загрузку/сохранение/default конфига. А в более развитом варианте в ту же строчку добавляются min_value, max_value и прочие параметры для автоматической генерации конфигурационного GUI.

Date: 2015-03-28 11:49 pm (UTC)
From: [identity profile] dev117.livejournal.com
"и имеющие значения по-умолчанию на случай если файл конфигурации отсутствует или не содержит нужного значения."

Побочный эффект.

Потом при настройке программы будет не понятно, читается ли файл с конфигом или нет, и тот ли файл читается. Мгновенного фидбэка нет.

Когда источник парметров только один - один конкретный файл, то намного проще запускать. Когда файла нет или он неправильный, нам об этом явно говорят и программа явно падает. А если не падает, то 100% файл там где надо и в нём описано всё что надо - защита от дурака.

Date: 2015-03-29 04:49 am (UTC)
From: [identity profile] thedeemon.livejournal.com
У меня при запуске говорит, если файл не прочитался.

Date: 2015-03-29 07:14 am (UTC)
From: [identity profile] diam-2003.livejournal.com
В таких случаях всегда интересует вопрос: а как там с отладкой static-ов?
Edited Date: 2015-03-29 07:14 am (UTC)

Date: 2015-03-29 10:30 am (UTC)
From: [identity profile] thedeemon.livejournal.com
static assert для прогона тестов при компиляции, pragma(msg, "...") как аналог отладки printf-ами.

Date: 2015-03-30 10:27 am (UTC)
From: [identity profile] diam-2003.livejournal.com
Печально. Про автоматизированное тестирование я даже не заикаюсь спрашивать :)
Это, конечно, достаточно общая беда, но почему-то мне кажется, что достоинства такого кода, скажем так, несколько преувеличены.

Date: 2015-03-30 11:47 am (UTC)
From: [identity profile] thedeemon.livejournal.com
А чего печально, чего не хватает-то? Пошагового отладчика? Без него масса других языков живет успешно.
С автоматизацией вообще не вижу проблемы. Добавляешь тесты в исходники, они либо компилируются, либо нет, с сообщением где ошибка. Автоматизируется не хуже других тестов.

Date: 2015-03-30 05:16 pm (UTC)
From: [identity profile] theiced.livejournal.com
за интерактивные отладчики вообще лишать высокого звания инженера. ну просто за тупость - там где они работают - они ну ваще не нужны полностью. там где вот хуй пойми что и черти ебут гусей в 509 потоках на 43 нодах, при этом переодически раздаются разные подземные стуки со стороны железа - вот там они что то непригодны совсем. ну и да - у меня есть мнение что между "но у меня на компьютере всё работает" и использованием интерактивных отладчиков есть корреляция.
Edited Date: 2015-03-30 05:16 pm (UTC)

Date: 2015-04-14 08:29 am (UTC)
From: [identity profile] diam-2003.livejournal.com
"черти ебут гусей в 509 потоках на 43 нодах, при этом переодически раздаются разные подземные стуки со стороны железа" в метапрограммировании... Хм! Сразу видно сеньора, знающего толк.

Date: 2015-04-02 11:18 am (UTC)
From: [identity profile] max klyga (from livejournal.com)
Для D1 был кстати пошаговый отладчик для шаблонов в DDT плагине под eclipse, но там разработчкик руками на java портировал фронтенд DMD для этого и в конце повесился из-за необходимости это дело обновлять.

Но работало впечатляюще - можно было превью миксинов и шаблонов смотреть, по шагам смотреть как развертывание происходит

Date: 2015-04-02 12:30 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Ого, не знал о таком, прикольно.
Вообще хотя бы не по шагам, но просто посмотреть во что в итоге выливаются все эти шаблоны после их подстановки и разворачивания было бы полезно иногда.

Date: 2015-04-14 08:27 am (UTC)
From: [identity profile] diam-2003.livejournal.com
Вот это ("без него масса других языков живёт успешно") как раз больше похоже на "у меня на компьютере всё работает" или "я всегда пишу правильный код с первого раза". Гордыня это всё.

Компилятор D умеет сразу рассказать про все ошибки, или для этого надо плодить разные единицы компиляции где-то снаружи?

Date: 2015-04-14 09:22 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Разные единицы не нужны, можно в одном файле сразу все описывать и тут же использовать, компиляется сразу без разделения на фазы.

Date: 2015-03-29 07:50 am (UTC)
From: [identity profile] n16bs.livejournal.com
Не понятно зачем передавать строчечки.

enum Options {Quantity, Quality}
string GetOptionValue(Options option)

Внутри только проверку не забыть что кто-нибудь не передал ((Options)100500).

Date: 2015-03-29 10:28 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Да, пожалуй так даже лучше.

У меня строчечки были, потому что хэш из строк в строки тривиально прочитать и запрашивать. Я как-то не вспомнил, что значения из enum и строки можно легко туда-сюда конвертировать.

Profile

thedeemon: (Default)
Dmitry Popov

December 2025

S M T W T F S
 12 3456
789101112 13
14151617181920
21222324252627
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 8th, 2026 10:49 pm
Powered by Dreamwidth Studios