Чи відокремлює козир ДУХУВАННЯ в REST?


19

Я будую API REST, щоб відкрити більшість функціональних можливостей існуючого Java API. Обидва API призначені для внутрішнього використання в моїй організації; Мені не доводиться проектувати для зовнішнього використання. Я маю вплив на обидва API, але я реалізую REST. API API і надалі буде використовуватися для локальних додатків (він не "звільнений"), але API REST буде використовуватися для значних нових розробок.

Деякі з класів Java API - це просто дані (боби з властивостями, getters, setters). І принаймні деякі з них мають сенс передавати (у якійсь формі) через API REST у вигляді даних (які будуть переведені на XML або JSON). Наприклад, клас, який зберігає інформацію про серверну машину. Я стикаюся з наступним вибором для цих класів даних: чи ...

  1. відкрийте оригінальний клас Java (або підклас) безпосередньо в API REST, або
  2. створити новий клас передачі даних (шаблон DTO) спеціально для API REST?

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

Аргументи для №1:

  • СУХИЙ (не повторюй себе)
  • Швидше здійснити
  • Простіше оновити API REST

Аргументи для №2:

  • Що робити, якщо REST API потрібно розробити окремо від Java API? (Це дещо ймовірно.)
  • Що робити, якщо в класах даних Java є значні зміни, такі як видалення властивостей, додавання поведінки або зміни в ієрархії класів? (Це також є дещо ймовірним.)

Підсумок полягає в тому, що це здається компромісом між DRY (# 1) та роз'єднанням (# 2).

Я схиляюся до початку №1, а потім, якщо виникають проблеми з переходом до №2 пізніше, слідуючи спритному керівництву не будувати те, що ви не можете довести, що вам потрібно. Це погана ідея; чи варто починати з №2, якщо я думаю, що я все-таки можу закінчитися там?

Чи відсутні в моїх списках основні аргументи / наслідки?


Якщо я пам'ятаю PragProg, дійсно DRY , що потрібно зробити було б мати одне джерело , з якого ОБИДВА класу Java , а також DTO генеруються .
AakashM

"Що якщо" = YAGNI IMO
Jonathan Cast

Відповіді:


10

Хороше запитання, просто кажучи, розлучити. Ось так іти сюди, ви не хочете прив’язуватися до версії Java.

Є один сценарій, який ви не розв'язуєте: якщо ваша технологія дозволить надсилати непровідні об'єкти надсилати по дроту, тобто якщо ви можете використовувати поточні об'єкти java зараз як YAGNI, а заміну на інший тип, який ви налаштовуєте, буде простою програмою, яка нічого не порушить через інформацію про тип, що надходить через провід. Отже, якщо інформація про тип не перетинає провід, ви можете YAGNI на це.

Будьте дуже обережні та уважні, що будь-яке оновлення версії java не змінить жоден із цих об'єктів. Інакше просто розв’яжіть зараз і не переживайте про це, я думаю, це залежить від того, скільки часу у вас буде, якщо у вас є вибір.

Однак, якщо інформація про тип надходить через провід у вашому протоколі, тоді плавне випадання нових типів, коли зміна базових типів Java може бути неможливим і може бути більшим зусиллям. Якщо так, то YAGNI тепер означає накопичення технічної заборгованості та ризику, пов’язаного з вашою базовою технологією.

Особисто я зараз би просто розлучився.

Крім того, DRY не грає в це, оскільки ви не писали основні фрагменти, тому не дублюєте код і, отже, не буде повторюватися болів помилок, що є головним питанням DRY (і загальної ремонтопридатності проблеми, яких знову не буде, оскільки у вас немає дублікатів для підтримки)


7

Основними аргументами для №1 є простота впровадження та оновлення, але чи відповідає вони вашим вимогам?

У своїх аргументах за №2 ви вказуєте, що API Java та REST API можуть змінюватися незалежно. Це означає, що вони є окремими проблемами, і ви не повторюєте себе, використовуючи окремі класи. Просто тому , що дві речі , які виглядають так само, не означає , що вони є однаковими.


6

Ваш API REST не повинен відповідати тій же структурі, що і ваша модель даних

Реалізуючи REST, переконайтеся, що ви створюєте інтуїтивно зрозумілий зовнішній API, а потім перетасуйте це у своїх внутрішніх класах моделей даних. Це дозволяє змінювати кожен незалежно від інших, що веде до API, що може тривати десятиліття .

Тому розв’язка - це шлях, куди йти сюди.

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