Условная компиляция против проверок во время выполнения для индивидуальной настройки клиента?

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

Я видел, что в некоторых проектах с открытым исходным кодом это делается с помощью этого шаблона:

#define ENABLE_FEATURE_XYZ 0

#if ENABLE_FEATURE_XYZ
void featureXyzImpl()
{
...
}
#endif

void main()
{
#if ENABLE_FEATURE_XYZ
featureXyzImpl();
#endif
}

Здесь вы включаете или выключаете эту функцию, определяя ENABLE_FEATURE_XYZ в 0 или 1. Преимущество в том, что ненужного кода там нет.

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

void featureXyzImpl()
{
...
}

void main()
{
if (configFileValue("Enable Feature XYZ") == true) {
featureXyzImpl();
}
}

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

Существует ли руководство или методология для определения того, какой из этих методов лучше подходит для данной ситуации? Или мы должны просто выберите между ними бросок монеты, или из личных предпочтений?

0

Решение

Я думаю, это зависит от того, сколько «иногда».
Если вы включаете / отключаете функции, создавая индивидуальную версию для каждого клиента, вам необходимо тщательно отслеживать, что вы доставили тому или иному клиенту, поскольку вам необходимо поддерживать специальную версию приложения.
При использовании файлов конфигурации умный клиент может иметь возможность включить функции, за которые он не платил, но обслуживание намного проще для вас.
Я бы оставался с файлами конфигурации как можно дольше, поскольку они намного проще в обслуживании.

1

Другие решения

Если вы индивидуально компилируете свое приложение для каждой системы клиентов, я бы сказал, что вы можете сделать это как «условную компиляцию».
Также вы должны сделать это, если у вас есть несколько групп клиентов, и вы не хотите, чтобы кто-нибудь мог «взломать» вашу программу, чтобы использовать функции, за которые он не платит.
Но в любом другом случае я мог представить, что будет также лучшим решением отключить его во время выполнения.

РЕДАКТИРОВАТЬ:

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

1