Ніхто ще не згадував меч з двома кінцями, тому я додам свої 2 копійки. Якщо у вас є кілька проектів, і всі вони мають спільний код для багаторазового використання, відповідно до належних практик / принципів програмування (наприклад, DRY), ви повинні розмістити код в одному глобальному місці та структурувати його таким чином, щоб ним могли ділитися всі ваші проекти без будь-яких модифікацій. Іншими словами, визначте, що інтерфейси мають бути загальними та загальними для всіх.
Для цього є кілька варіантів: 1) Створити базовий проект, від якого залежать інші. Цей проект може створити бінарний дистрибутив, який споживають інші проекти. 2) Витягніть модель з відкритим кодом у вашій організації. Майте загальний код - це власна гілка коду, а інші проекти мають такий же спосіб, як ви брали вихідний код з будь-якої ОСС в Інтернеті.
Тепер ось, де заходить меч ...
Розміщення коду в загальному місці, від якого залежать інші проекти / люди, може стати досить дорогим. Скажімо, у вас є код і від цього залежать 4 інші проекти. Один із ваших клієнтів, який використовує проект A, виявляє помилку, і вам доведеться виправити помилку. Ви поспішаєте виправити помилку, і цей клієнт задоволений. Але ви просто змінили якийсь код, від якого залежать 3 інші проекти. Ви повторно перевірили все, щоб переконатися, що не було введено крайових умов?
Загальний код також повинен бути розроблений набагато ретельніше, а модульні інтерфейси повинні бути значно краще розроблені, оскільки цей код повинен вміщувати не одного, а чотирьох клієнтів, і кожен з них може просто використовувати цей код з такою незначною різницею.
Якщо ваші проекти працюють на різних циклах випуску, вам потрібно бути ще уважнішими щодо управління загальним кодом. Ви не можете просто внести зміни до загального коду, оскільки проект B потребує нової функціональності, якщо вам потрібно 3 дні від вирізання остаточного зображення для проекту C.
Я не кажу, що загальна бібліотека не є правильним рішенням. Я щиро прихильник DRY, і я створив і підтримував загальний код до цього і продовжую це робити. Просто хотілося викласти це там, що, якщо просто зробити код загальним, це матиме власні витрати.
Якщо ви єдиний використовуєте цей код, це не так вже й погано. Якщо у вас є команда інженерів, і вони починають використовувати загальний код, витрати збільшуються ще більше. Якщо залучені інші, очікуйте, що розміщення коду в загальній бібліотеці займе 3 рази більше часу, ніж потрібно, щоб довести його до точки, коли ви вважаєте, що він "завершений". Вам потрібно: а) зробити бібліотеку більш надійною для захисту від усіх видів крайових умов та недійсного використання; б) надавати документацію, щоб інші могли користуватися бібліотекою; в) допомагати іншим налагоджувати, коли вони користуються бібліотекою таким чином, що ви не очікували, і ваша документація не охоплює їх конкретного випадку використання.
Кілька пропозицій, які я можу запропонувати:
- Маючи загальний код, охоплений тестами автоматизованих одиниць, можна пройти довгий шлях і підказати вам, що коли ви вносите зміни, ви не просто зламали якийсь інший проект.
- Я б розмістив лише дуже стабільний функціонал в загальний код. Якщо ви писали клас минулого року, щоб займатися керуванням таймером, і ви не змінили його за 9 місяців, а тепер у вас є 3 інші проекти, які потребують таймерів, то впевнений, що це хороший кандидат. Але якщо ви щойно писали щось на минулому тижні, ну ... у вас не так багато варіантів (і я ненавиджу копію / вставлення коду, мабуть, більше, ніж наступний хлопець), але я б подумав двічі про те, щоб зробити це загальним.
- Якщо фрагмент коду є тривіальним, але ви використовували його в декількох місцях, можливо, краще кусати кулю, залишити DRY в спокої і пустити кілька копій.
- Іноді платять не просто ставити загальний код у загальне місце розташування, а всі з них посилатись. Але скоріше розглядайте загальний код як власний випуск із версіями, датами випуску та всім іншим. Таким чином проект C може сказати: "Я використовую загальну бібліотеку v1.3", і якщо проект D потребує нової функціональності, ви залишаєте v1.3 в спокої, випускаєте v1.4 і проект C не впливає. Майте на увазі, трактувати загальний код як власний продукт набагато дорожче, а не просто перевіряти його у загальне місце розташування.