|
2 / 2 / 0
Регистрация: 29.05.2024
Сообщений: 62
|
||||||
Конфигурация исполняемой программы15.05.2025, 15:04. Показов 10088. Ответов 64
Добрый день, уважаемое сообщество.
Поделитесь, пожалуйста, тем как вы организуете получение и хранение конфигурационной информации. Я здесь сознательно выделил два вопроса. Один вопрос, как хранить конфигурационную информацию на уровне файлов. И второй вопрос, как хранить конфигурационную информацию на уровне исполняемого кода. На уровне файлов я использую два подхода. В одном подходе, я храню конфигурационную инфу в файле main.h и инклюжу его внутри main.cpp. Во втором подходе, я храню инфу в файле config.ini и как-то считываю этот файл. Решение о том, какую конфигурационную инфу, куда закидывать, принимаю исходя из того, как часто приходится её менять в ходе разработки и тестирования кода. Если часто меняю - то в config.ini, если редко - то в main.h. Это делается, чтобы не делать всякий раз пересборку проекта, если поменял путь к какому-то входному или выходному файлу. Поэтому задаюсь вопросом, а почему бы всю инфу не хранить в config.ini? И отвечаю себе так, вот мне недавно книжку Агнера Фога посоветовали, так он всю конфиг инфу в main.h закидывает и не парится. Т.е. наоборот никаких config.ini он не использует. Вот пример его кода из файла main.h main.h
Второй вопрос, как организовать хранение конфига на уровне исполняемого кода. Я тут использую несколько способов. 1. Использую namespace. Это такой способ шифрануть глобальные константы внутрь namespace, чтобы избежать конфликтов. 2. Использую статические поля структур/классов. Глобальные константы не использовал, т.к. начитался, что это зло. А смотрю код у этого же Фога и там сплошь и рядом глобальные константы без угрызений совести, и даже без namespace. Поэтому я засомневался в своих взглядах на глобальные константы. А есть ещё такие конфигурационные данные, которые на момент запуска программы не известны, т.е. их не засунешь ни в config.ini, ни в main.h, но они вычисляются в начале программы и не меняются в течение всей программы, например, время запуска программы. Сейчас я их храню в namespace, но уже сомневаюсь в правильности такого подхода. Поэтому резюмирую второй вопрос, как на уровне переменных вы храните конфигурационную информацию? Заранее спасибо за ответы.
0
|
||||||
| 15.05.2025, 15:04 | |
|
Ответы с готовыми решениями:
64
Превращение строки в название исполняемой функции ""D:\"" не является внутренней или внешней командой, исполняемой программой или пакетным файлом |
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
|||
| 15.05.2025, 18:26 | |||
|
Он может хранится отдельным файлом в т.ч. в dll. Если же данные не нужно отделять, то есть, они участвуют в компиляции. Такие как константы, шаблоны и т.д. Можно выделить в отдельную сущность Config.
0
|
|||
|
2 / 2 / 0
Регистрация: 29.05.2024
Сообщений: 62
|
||
| 15.05.2025, 18:50 [ТС] | ||
|
0
|
||
|
629 / 387 / 67
Регистрация: 09.03.2016
Сообщений: 4,310
|
|
| 15.05.2025, 18:51 | |
|
Должен генерироваться экзешником с дефолтными настройками.
Если имеешь желание, должно быть можно что то изменить. Если пропадёт, должен появиться снова. Хотя у каждого свой вкус, сказал индус...
0
|
|
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
||
| 15.05.2025, 18:54 | ||
|
Опять же, при условии что они не используются в компиляции, а лишь в рантайме. Я об этом специально поставил акцент. То есть, вы намешали две разные задачи.
0
|
||
|
629 / 387 / 67
Регистрация: 09.03.2016
Сообщений: 4,310
|
|
| 15.05.2025, 18:57 | |
|
По умолчанию там буковка C. Такая есть у всех... По желанию можно поменять на диск , где места много.
0
|
|
|
2 / 2 / 0
Регистрация: 29.05.2024
Сообщений: 62
|
||
| 15.05.2025, 19:48 [ТС] | ||
|
Один вопрос, как лучше хранить неизменяемую информацию на уровне файлов. Второй вопрос, как лучше хранить неизменяемую информацию на уровне переменных.
0
|
||
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
|
| 15.05.2025, 20:12 | |
|
0
|
|
|
629 / 387 / 67
Регистрация: 09.03.2016
Сообщений: 4,310
|
||
| 15.05.2025, 21:46 | ||
|
Очень умно пишите. Не все такие умные. Я например не очень...
0
|
||
|
2 / 2 / 0
Регистрация: 29.05.2024
Сообщений: 62
|
|||
| 15.05.2025, 21:54 [ТС] | |||
|
В ходе исполнения программы мне надо знать строку "C:\my_project\input\**********.txt ". Вопрос: В каком файле, в каком месте диска, короче, где я храню эту информацию? Имеется в виду не где находится файл *************.txt , а где находится строка "C:\my_project\input\*************.t xt". Откуда я могу её прочитать? Добавлено через 3 минуты
0
|
|||
|
629 / 387 / 67
Регистрация: 09.03.2016
Сообщений: 4,310
|
|
| 15.05.2025, 21:56 | |
|
0
|
|
|
629 / 387 / 67
Регистрация: 09.03.2016
Сообщений: 4,310
|
|
| 15.05.2025, 22:05 | |
|
Как желаешь так и храни.
Главное что бы твоя программа была полезна людям. И если будешь не так хранить тебя простят.
0
|
|
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
||||||||||||
| 15.05.2025, 22:12 | ||||||||||||
Сообщение было отмечено Alex_Solo_Mars как решение
Решение1. Это константа и она никогда не изменяется. Тогда она хранится в том месте где используется, в том же контексте, внутри той же сущности.
Внешний файл. Сущность которая будет использовать это значение, уже не будет её у себя держать. Будет принимать строку методом/конструктором. 3. Запрос у пользователя во время выполнения. Поведение как и во втором случае. Глобальных хиромантий быть должно по минимуму. Если у вас предвидится много общих данных. Так и создайте отдельную сущность, о которой я и упоминал.
Вплоть до constexpr. Запихать константы в неймспейс ничуть не лучше чем в глобальном пространстве.
1
|
||||||||||||
|
Нарушитель
7164 / 2333 / 353
Регистрация: 10.12.2013
Сообщений: 8,072
|
||||
| 15.05.2025, 22:21 | ||||
|
Максимальная гип кость. Если это 'C', то инкапсуляцию обеспечивает function Config(), если 'C++', то класс Config По требованию выдаёт либо статическую переменную, либо динамическую. веселее всего из sqlite. нмв так одни плюсы у такого выбора. спросил у бесплатного инопланетного разума:
По сути получился Windows Registry + Registry monitor, только намного лучше.
0
|
||||
|
2 / 2 / 0
Регистрация: 29.05.2024
Сообщений: 62
|
||||
| 15.05.2025, 22:34 [ТС] | ||||
|
Ваш пункт 1, это скорее про магические числа, тут вопрос у меня нету. Давайте уточню. Есть константа, которая иногда меняется перед запуском программы, а иногда нет. Вот у меня есть двадцать имён файлов. Я запускаю программу с ними. В следующий раз девятое имя изменил, а остальные - нет. А в следующий раз наоборот. Судя по вашему ответу, это пункт 2. "Вам нужно дать пользователю изменять её до момента запуска приложения. Внешний файл." Это я понимаю, к тому и склоняюсь. Но потом смотрю код у разных людей и вижу что они предпочитают эти штуки засовывать в хедэры. Я задаю вопрос на киберфорум.ру про это. На первых двух страницах мне советуют эту инфу хранить в хедэрах. На третьей странице советуют хранить во внешнем файле. Возможно тут есть элемент вкуса и по большому счёт фиолетово когда я прочитаю с диска эту информация, во время компиляции или в рантайме. Вы также затронули и второй мой вопрос. Спасибо. Я делаю всеми тремя предложенными вами способами: глобальная константа, постоянный член в классе и внутри неймспейса. Мой вопрос о том, а что же лучше? Смотрю коды грамотных людей, вижу там глобальные константы, охреневаю, но вы меня успокаиваете тем, что это возможно в педагогических целях так реализовано. Меня на самом деле радует уже то, что вы по крайней мере поняли мои вопросы, т.к. другим мне не удалось донести свои мысли. Возможно я как-то коряво изъясняюсь. Добавлено через 2 минуты Добавлено через 1 минуту
0
|
||||
|
Нарушитель
7164 / 2333 / 353
Регистрация: 10.12.2013
Сообщений: 8,072
|
||
| 15.05.2025, 22:41 | ||
|
0
|
||
|
2 / 2 / 0
Регистрация: 29.05.2024
Сообщений: 62
|
||
| 15.05.2025, 22:45 [ТС] | ||
|
И это только один из способов, которые я использую. Поэтому и задаюсь вопросом, а как всё-таки рациональнее.
0
|
||
| 15.05.2025, 22:57 | |||||||
0
|
|||||||
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
||||||||||
| 15.05.2025, 23:01 | ||||||||||
|
Если вам не нужно знать эти данные во время компиляции, то они автоматически переходят в категорию данных "этапа выполнения". Например : Библиотека libconfig Но часто каждый сам пилит для себя. Это полумера. Да, искать потом эти константы, если вам приходится их менять, дело не очень. Но если они там железно будут такими, то это уже и не "маг. числа". Ну блин. Включайте фантазию. Раз вы хотите что бы эти данные были в одном месте.
Но лучше их прописать структурно, сгруппировано. Вообще, все по ситуации. Самая главная ошибка вашего вопроса, в фразе "что лучше". Только время покажет насколько хорош ваш выбор в каждом конкретном случае. А на счет обуч. материалов. Так ни в книга ни на форуме вы этого не увидите. Самое программирование начинается на практических задачах. Главное выучить базовые инструменты ЯП и практиковаться, практиковаться и практиковаться. Любая задача решается введением нового слоя абстракций. Важно потом выбраться из этих слоев
0
|
||||||||||
|
629 / 387 / 67
Регистрация: 09.03.2016
Сообщений: 4,310
|
|||
| 15.05.2025, 23:04 | |||
|
Выходной файл от адреса исходного у меня... В том же фолдере. из которого перетаскиваешь файл на ярлык обработчика. Удобно. Ты на это место смотришь и видишь. Добавлено через 1 минуту
0
|
|||
| 15.05.2025, 23:05 | |
|
0
|
|
| 15.05.2025, 23:05 | |
|
bat не является внутренней или внешней командой, исполняемой программой или пакетным файлом параллельная конфигурация Конфигурация компьютера Конфигурация железа Параллельная конфигурация неправильна Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
|
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
|
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ
Основная суть и тезисы по измерениям:
0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема.
Объект не может перемещаться в 0D.
1D (Первое измерение):. . .
|