|
2 / 2 / 0
Регистрация: 29.05.2024
Сообщений: 62
|
||||||
Конфигурация исполняемой программы15.05.2025, 15:04. Показов 9912. Ответов 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
|
||
|
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,218
|
|
| 15.05.2025, 18:51 | |
|
Должен генерироваться экзешником с дефолтными настройками.
Если имеешь желание, должно быть можно что то изменить. Если пропадёт, должен появиться снова. Хотя у каждого свой вкус, сказал индус...
0
|
|
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
||
| 15.05.2025, 18:54 | ||
|
Опять же, при условии что они не используются в компиляции, а лишь в рантайме. Я об этом специально поставил акцент. То есть, вы намешали две разные задачи.
0
|
||
|
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,218
|
|
| 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
|
|
|
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,218
|
||
| 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
|
|||
|
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,218
|
|
| 15.05.2025, 21:56 | |
|
0
|
|
|
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,218
|
|
| 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
|
||||||||||||
|
7093 / 2324 / 353
Регистрация: 10.12.2013
Сообщений: 8,019
|
||||
| 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
|
||||
|
7093 / 2324 / 353
Регистрация: 10.12.2013
Сообщений: 8,019
|
||
| 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
|
||||||||||
|
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,218
|
|||
| 15.05.2025, 23:04 | |||
|
Выходной файл от адреса исходного у меня... В том же фолдере. из которого перетаскиваешь файл на ярлык обработчика. Удобно. Ты на это место смотришь и видишь. Добавлено через 1 минуту
0
|
|||
| 15.05.2025, 23:05 | |
|
0
|
|
| 15.05.2025, 23:05 | |
|
bat не является внутренней или внешней командой, исполняемой программой или пакетным файлом параллельная конфигурация Конфигурация компьютера Конфигурация железа Параллельная конфигурация неправильна Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
|
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы
## О чём эта статья
В процессе построения ОДУ-модели (система дифференциальных. . .
|
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет)
Содержание проекта
Симуляция вековой (50 лет) экологической сукцессии в почве леса
Основные участники: АМ-гриб, ЭКМ-гриб,. . .
|
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов
Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
|
|
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация
В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
|
Сукцессия 20. Война автоботов. Делаем ставки. Лёд против "пш-пш!".
anaschu 11.07.2026
Битва ИИ в ризосфере: Как мы скрестили жесткие ОДУ, закон Фика и «подземный шантаж»
Уважаемые коллеги!
Хочу поделиться уникальным опытом ведения междисциплинарной компьютерной разработки. Прямо. . .
|
Сукцессия 19. Какие выводы я сделал из модели? Часть 2.Внутримикоризный стехиометрический буфер и хроно-дискретные зоны экспансии
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы
Математический аппарат моделирования
|
Сукцессия 18. Какие выводы я сделал из войны грибов с деревьями? Часть 1- рассказ и немного про термины
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы
Математический аппарат моделирования
Система ОДУ описывает динамику изменения массы различных компонентов системы во времени. Ключевой. . .
|