Дуже обережно
Розгалуження функцій - це варіант, але я вважаю, що він дещо важкий. Крім того, це робить глибокі модифікації легкими, що може призвести до розгортання вашої програми, якщо не тримати її під контролем. В ідеалі ви хочете максимально активувати налаштування, намагаючись зберегти базу основного коду максимально спільною та загальною.
Ось як я це зробив би, хоча я не знаю, чи застосовний він до вашої кодової бази без великих модифікацій та повторних факторів. У мене був подібний проект, де основна функціональність була однаковою, але кожен клієнт вимагав дуже специфічного набору функцій. Я створив набір модулів і контейнерів, які потім збираю за допомогою конфігурації (à la IoC).
то для кожного замовника я створив проект, який в основному містить конфігурації та сценарій збірки для створення повністю налаштованої установки для їх сайту. Інколи розміщую там також деякі компоненти, виготовлені на замовлення для цього клієнта. Але це трапляється рідко, і коли це можливо, я намагаюся зробити це в більш загальній формі і відсунути його, щоб інші проекти могли їх використовувати.
Кінцевий результат - я отримав потрібний мені рівень налаштування, я отримав налаштовані сценарії встановлення, так що, потрапляючи на сайт клієнта, я не виглядаю так, як весь час налаштовую систему, і як доданий ДУЖЕ значний бонус, який я отримую мати можливість створювати тести регресії, підключені безпосередньо на збірці. Таким чином, у будь-який час я отримую помилку, що відповідає специфіці замовника, я можу написати тест, який буде стверджувати систему під час її розгортання, і таким чином можна робити TDD навіть на тому рівні.
так коротше:
- Сильно модульна система з плоскою структурою проекту.
- Створіть проект для кожного профілю конфігурації (клієнт, хоча більше одного може поділитися профілем)
- Зберіть необхідні набори функціональних можливостей як інший продукт і обробіть його як такий.
Якщо зробити все правильно, збірка продукту повинна містити всі файли конфігурації, окрім кількох.
Користуючись цим деякий час, я закінчила створення метапакетів, які збирають в основному використовувані або основні системи як основний блок і використовують цей метапакет для складання клієнтів. Через кілька років у мене з’явився великий набір інструментів, який я міг дуже швидко зібрати для створення клієнтських рішень. Я зараз розглядаю Spring Roo і бачу, чи не можу я просунути цю ідею трохи далі, сподіваючись, що одного разу я можу створити перший проект системи прямо із замовником у нашому першому інтерв'ю ... Я думаю, ви могли б назвати це користувачем Розвиток ;-).
Сподіваюся, що це допомогло
#ifdef
працює для вас?