Обмін класами або інтерфейсами між різними проектами


17

Я шукав деякі відповіді в ТА чи тут, але без жодних результатів, тому я б просив вас.

Припустимо, у мене є два різні проекти - наприклад, серверна частина та клієнтська частина програми. Я розробляю власну частину, в той час як мій друг робить другу. Але ми обидва повинні використовувати деякі загальні інтерфейси , як Userабо AccountInfoабо ChangableAccount... незалежно від того , щоб забезпечити сумісність. Наприклад, якщо клієнти надсилають дані користувача на сервер, сервер повинен працювати в одному класі. Те ж саме з інтерфейсами тощо. Більше того, якщо в загальному інтерфейсі є якісь зміни, обидва проекти повинні адаптувати його код до нової ситуації.

Єдине рішення, яке я бачу зараз, - створити ще один додатковий проект, в якому визначені всі загальні речі. Ми, я та мій друг, повинні додати цей проект як залежність до основного проекту (клієнта чи сервера). Спільним проектом можна керувати деякою системою контролю версій, тому у нас завжди є найсучасніший стан.

Яке ще рішення ви б запропонували? Як такі проблеми вирішуються в професійних додатках?


1
Ви повинні контролювати версію, поділяєте ви чи ні. Ви хочете сказати, що не використовуєте керування версіями для клієнтських та серверних проектів? Якщо так, то негайно виправте це.
Себастьян Редл

Відповіді:


15

створити один додатковий проект, в якому визначені всі загальні речі

Це саме перший крок для спільного використання багаторазових частин - і його легка частина. Більш складною є частина вирішити, чи мають два проекти, які використовують спільну бібліотеку, незалежні цикли випуску (чи ні), і якщо це можливо, що "проект A" використовує версію 1.0 вашої спільної конфігурації, тоді як проект B використовує версія 2.0 водночас .

Якщо ви хочете, щоб остання була можливою, вам потрібно скласти сувору схему версій і керувати випуском для вашої бібліотеки (і номери версій як частину назви файлу бібліотеки, як це запропонував @RoryHunter). У цій ситуації слід також подбати про зворотну сумісність у вашій кишці. Бібліотекою слід керувати як окремий продукт, додаючи до нього тести, щоб переконатися, що різні версії у виробництві будуть хорошою ідеєю, і такий інструмент, як Maven, також може мати сенс.

Якщо ви хочете запобігти такій ситуації, вам слід керувати "проектом A", "проектом B" та вашим об'єктом як спільним проектом із комбінованим процесом розробки, складання та випуску. Це дозволить змінити загальний інтерфейс спільної бібліотеки набагато частіше та частіше, ніж у першому сценарії. І вам не знадобиться щось на зразок Maven або номерів версій у назві файлу бібліотеки. Але компроміс полягає в тому, що A і B вже не можна розвивати самостійно.


13

Ваше рішення - правильне. Помістіть спільний код в інший проект, який створює власний файл JAR, і використовуйте його в обох проектах. Створюючи файл JAR, можливо, ви захочете включити версію до імені, наприклад, у стилі Debian;

libmyproject-shared-1.0.jar

Це не запобігає проблемі з версією, але має допомогти. Я ніколи не використовував Maven, але я розумію, що це може допомогти в цій ситуації.


2

створити один додатковий проект, в якому визначені всі загальні речі

Це саме те, що .Net очікує, що ви це зробите.

Абстрагуйте ці об'єкти на третій асамблеї та посилайте це на обидва проекти. Я б запропонував зробити це як інтерфейси, які чистіше, але ...

Слідкуйте за серіалізацією:

  • Єдиний спосіб я міг безпосередньо серіалізувати / десерилізувати об'єкти між двома програмами (правда, це був деякий час тому за допомогою Framework 2.0) - встановити "спільну" збірку в кеш глобальної асамблеї на клієнтських та серверних машинах. Якщо збірка була "локальною" для кожного проекту, то Рамка розглядала їх як дискретні типи і відмовлялася [де] серіалізувати один в інший.
  • І [de] серіалізація об'єктів, введених як інтерфейси, є дещо "викликом". Оригінальний, неінтерфейсний тип, здавалося, не "проробляв" це "трубу" серіалізації, тому приймач не знав, який конкретний тип "побудувати" з вхідного потоку.

1

Як підказали інші, ваш розумовий процес є точним. У професійному плані більшість використовує щось на кшталт Мейвена чи Градла для ефективного управління цими залежностями.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.