Управление кодовой базой для связанных приложений, разработанных последовательно - PullRequest
0 голосов
/ 28 июля 2010

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

Поскольку все версии, принадлежащие нашим клиентам (A1, B2, A3), до сих пор финансировались и разрабатывались отдельно и последовательно в каждом случае, мы просто сделали снимок исходного кода клиентов, поместили его в новый репозиторий SVN и запустили вносить изменения оттуда. До сих пор у нас все получалось, но в будущем ожидается рост числа клиентов, и мы планируем внедрить некоторые улучшения из приложения клиента A3 в новую версию для A1, и наша текущая настройка не останется управляемой в рамках нашего текущего процесса. .

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

Мы предполагаем, что наши клиенты будут разделены на две основные группы на основе некоторых различий в возможностях высокого уровня. Мой префикс наших идентификаторов клиентов с A и B отражает это; Версии программного обеспечения A1 и A3 имеют гораздо больше общего, чем версии B2. В настоящее время мы не ожидаем, что будет добавлена ​​категория C, но не можем исключать, что она изменится через несколько лет.

Наша основная идея состоит в том, чтобы разделить общие части функциональных возможностей (классы внутренних и выигрышных форм) на общие базовые библиотеки для клиентов типа A и B; а затем наследовать общие классы и реализовывать специфичные для клиента функции для каждой версии в отдельном решении. У нас также может быть общая библиотека верхнего уровня для вещей, совместно используемых как с A, так и с B, хотя между A и B достаточно различий, и я обеспокоен тем, что в конечном итоге мы переопределим достаточно методов, которые в конечном итоге только добавят сложности ситуация.

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

Первое - это то, что из-за NDA для конкретных клиентов у нас, скорее всего, появятся новые разработчики, которым не будет предоставлен доступ к приложениям, сделанным ранее, потому что без их работы над приложением клиента X они не смогут соответствовать внешним требованиям. навязанная необходимость знать требование для утверждения NDA.

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

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

Изменить: Этот вопрос, кажется, в основном умер здесь, но я получил приличную дискуссию на другом сайте.

1 Ответ

1 голос
/ 29 июля 2010

Я не был в вполне этой ситуации, но, надеюсь, это будет полезно.

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

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

Для меня существует важное различие между «библиотечным» кодом, который предлагает низкоуровневое «кодирование», или службами системного уровня (сохранение файлов, доступ к confog и т. Д.) И чистым кодом / модулями бизнес-логики. Так что я бы подумал, что разумное повторное использование здесь было бы приемлемым.

Также в соответствие с SAP и SDP используется подход, позволяющий максимально абстрагировать реализации: здесь будет полезна инверсия зависимости и шаблон стратегии.

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

Кажется, что все предложения, которые я здесь привел, относятся к уровню кода / архитектуры / шаблона - я знаю, что я не очень заинтересовался практическим управлением кодом / QA / Release - извините.

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