|
2 / 2 / 0
Регистрация: 29.05.2024
Сообщений: 62
|
||||||
Конфигурация исполняемой программы15.05.2025, 15:04. Показов 9875. Ответов 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,217
|
|
| 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,217
|
|
| 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,217
|
||
| 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,217
|
|
| 15.05.2025, 21:56 | |
|
0
|
|
|
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,217
|
|
| 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
|
||||||||||||
|
7092 / 2323 / 352
Регистрация: 10.12.2013
Сообщений: 8,005
|
||||
| 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
|
||||
|
7092 / 2323 / 352
Регистрация: 10.12.2013
Сообщений: 8,005
|
||
| 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,217
|
|||
| 15.05.2025, 23:04 | |||
|
Выходной файл от адреса исходного у меня... В том же фолдере. из которого перетаскиваешь файл на ярлык обработчика. Удобно. Ты на это место смотришь и видишь. Добавлено через 1 минуту
0
|
|||
| 15.05.2025, 23:05 | |
|
0
|
|
| 15.05.2025, 23:05 | |
|
bat не является внутренней или внешней командой, исполняемой программой или пакетным файлом параллельная конфигурация Конфигурация компьютера Конфигурация железа Параллельная конфигурация неправильна Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу)))
Критические ошибки, мешающие компиляции и. . .
|
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата)
Этот документ предназначен для того, чтобы новый чат Claude мог продолжить
работу без необходимости заново разбираться в. . .
|
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса
Калибровка параметров симбиотической модели: технический обзор
Содержание:
Введение
Постановка проблемы
Технические аспекты реализации
Процесс внедрения изменений
|
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0»
https:/ / ibb. co/ NnkGpfMd
Представленная интегрированная схема описывает непрерывную нелинейную. . .
|
|
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы
### Аннотация
Представлено исследование по разработке агентной модели микоризной. . .
|
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики
Контекст
Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
|
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии
Введение
Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
|
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np
class PlantAgent:
def __init__(self, name, strategy, initial_biomass):
self. name = name
self. strategy = strategy # "greedy" (широколиственные) или. . .
|