Обработка операций установки параметров для тысяч параметров - PullRequest
1 голос
/ 07 января 2012

Я пишу некоторый код, который по существу выполняет операции настройки оборудования промышленной автоматизации.Выполняемая настройка - это, в основном, индивидуальная настройка тысяч и тысяч параметров оборудования.

Вы можете представить большую часть кода как набор процедур, которые выглядят примерно так:

foo_set_x{
foo_param_1 = 1
foo_param_2 = 2
….
}

ПРИМЕЧАНИЕ: вышеприведенный пример является чрезвычайно упрощенным примером

По мере появления новых проектов некоторые параметры меняются, а некоторые нет.Поэтому, когда клиент использует эту утилиту настройки, он отвечает на вопрос, какую спецификацию параметра использовать.

Теперь некоторые подпрограммы изменяются на это:

foo_set_x{
IF param_spec_1 {
foo_param_1 = 1
….
}
IF param_spec_2 {
foo_param_1 = 2
….
}
}

И некоторые подпрограммы изменяются на это:

foo_set_y{
IF param_spec_1 OR param_spec_2 {
foo_param_1 = 1
foo_param_2 = 2
….
}
}

Таким образом, каждый раз, когда появляется новая спецификация параметра, мне приходится менять код в сотнях подпрограмм для поддержки новой спецификации.Мне это не кажется разумным подходом к этому.

Единственное решение, которое я могу придумать, - это создать переменные для каждого параметра.Затем все мои подпрограммы устанавливают параметр в переменную.Никаких утверждений IF или CASE не требуется.

Проблема в том, что, и я не шучу, близко к 5000 различным параметрам.Поскольку я работаю с довольно ограниченным и примитивным языком (НЕ ООП, а на основе C), каждая переменная должна быть глобальной и отнимать много драгоценного пространства.Я даже не могу понять, как я мог бы создать интеллектуальный список переменных из примерно 5000 переменных (минус то, что имеет смысл поместить в структуру или массив).

Спасибо всем.

PSПожалуйста, не стесняйтесь редактировать или предлагать лучшие теги.Я как бы потерялся здесь.

Ответы [ 2 ]

1 голос
/ 07 января 2012

Я бы рассмотрел два подхода:

Одним из них является подход, управляемый данными, где каждый param_spec имеет структуру (или массив), содержащую все соответствующие переменные. Вы говорите, что это займёт много места, но это может быть только пространство CODE (= ROM), которое он потребляет, потому что ваши структуры могут быть константами. И вы, вероятно, сэкономите часть пространства кода взамен.

foo_set_x{
  foo_param_1 = param_specs[spec_index].foo_param_1;
}

Другой способ - псевдо-ОО-подход. Помните, что настоящие программисты могут писать ОО-код на любом языке! Каждая спецификация param определяет свои собственные функции для каждой нашей подпрограммы foo_set_xyzzy, а foo_set_x просто вызывает правильную. Это имеет то преимущество, что все изменения для определенного набора параметров могут храниться в одном месте.

ps1_foo_set_x() {   foo_param_1 = 1; }

ps2_foo_set_x() {   foo_param_1 = 2; }

void (*foo_set_x)(void);

void select_ps1 {  foo_set_x = ps1_foo_set_x; }

void select_ps2 {  foo_set_x = ps2_foo_set_x; }

...

foo_set_x();
0 голосов
/ 07 января 2012

Лучше хранить значения параметров в облегченной базе данных, такой как SQLite, которую вы можете связывать и поставлять вместе с вашим приложением.

SQLite предоставляет C-API, с помощью которого вы можете сохранять / извлекать ваши параметры в БД.

когда ваш клиент отвечает спецификациям

foo_set_x{
IF param_spec_1 {
// write in db for spec_1
….
}
IF param_spec_2 {
// write in db for spec_2
….
}
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...