Службовий рівень програми виклику функцій бази даних. Погана архітектура?


11

Сценарій:

  • Стек: Java, весна, сплячка.
  • Модель: Клієнт-серверна програма.
  • Шаблон: Контролер перегляду моделі (MVC).

Класи службового шару мають три форми поведінки:

  1. Деякі служби мають ділове правило в рамках методів і делегують наполегливість додатку. Подібно до:

    EntityManager.save (сутність);

  2. Деякі служби просто викликають функцію бази даних (передаючи параметри).

    CallableStatement cls = con.prepareCall ("{call databaseFunction (args)}");

  3. Деякі служби мають методи з обома способами поведінки.

Мої запитання:

  1. Чи є якісь проблеми у тому, щоб служби додатків безпосередньо викликали функції бази даних? Чи не вважається це поганою практикою? Якою буде модель архітектури, застосовною до такого проекту?
  2. Чи є якась проблема в поєднанні поведінки в одній службі? Такі як транзакції та послідовність?
  3. Що стосується технічного обслуговування, чи робить це капсулювання незрозумілим для розробника, що він також повинен змінювати функції в базі даних? Як цього уникнути?
  4. Чи трапляється цей сценарій в інших програмах по всьому світу чи це була лише архітектурна помилка?

Це питання схоже, але не зовсім те саме .. softwareengineering.stackexchange.com/questions/180012/…
Джон Ренор

Відповіді:


7

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

Я думаю, що є. Ви надаєте знання про внутрішню базу даних до служби додатків. Будь-яка зміна бази даних (зміна механізму зберігання даних або навіть перейменування поля або створення індексу) може вимагати змінити службу додатків, що порушує SRP .

Якою буде модель архітектури, застосовною до такого проекту?

Дивіться коментар нижче.

Чи є якась проблема в поєднанні поведінки в одній службі? Такі як транзакції та послідовність?

Я не вірю, що є технічна проблема, але є логічна. Ви просто змішуєте два підходи в додатку, роблячи його невиразним, менш структурованим, важко адаптуватися до змін. Дивіться також коментарі вище щодо порушення SRP.

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

Звичайно, це так.

Як цього уникнути?

Розмістіть методи та функції, які безпосередньо працюють з базою даних, на окремий рівень абстракції (будь то шар DAO або простий шаблон сховища - залежить від складності вашої програми)

Чи трапляється цей сценарій в інших програмах по всьому світу чи це була лише архітектурна помилка?

Я думаю, що в нашому світі все відбувається;)


Якщо я правильно розумію, може виникнути технічна проблема в тому, що якщо оновлення відбуваються у функціях / зберігаються-документах, а також через ORM, стан даної транзакції дуже важко пояснити. Хоча програма може працювати в її нинішньому стані, невелика зміна може перетворитись на деякі справді великі проблеми. Мій досвід роботи зі сплячим режимом полягає в тому, що якщо ви не дозволите йому керувати усім набором таблиць, з якими він працює, у вас виникне маса прикрих проблем.
JimmyJames

приємна і лаконічна відповідь. SRP - це перше, що мені прийшло в голову, коли я вперше подивився на код. Деякі співробітники кажуть, що метод не порушує SRP через те, що він викликає лише функцію бази даних. Але деякі з цих функцій виконують вибір, вставлення та оновлення. Так це чи не порушує SRP? (можливо, саме по собі це ще одне питання, щоб обговорити окремо?)
linuxunil

1
+1 для цього рядка Я думаю, що в нашому світі все відбувається;)
linuxunil

@linuxunil SRP слід поважати на всіх рівнях архітектури. У моєму випадку я мав на увазі SRP на рівні сервісу, а не на рівні методу. @ JimmyJames Так. Більшість ОРМ не справляються із збереженими процедурами. Але іноді необхідні збережені процеси.
Владислав Раструсний

3

Відповідно до того, що ви сказали, є сервісний рівень, тому архітектурна структура, яка здається придатною, є шаруватої архітектури. Подальша довідка

Так, зазвичай це погана практика робити прямі дзвінки до бази даних, крім іншого рівня доступу до даних, таким чином бізнес-рівень отримує доступ лише до абстракції бази даних.

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

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


Не впевнений, чому це було знято. Ця відповідь рекомендує відокремити код, який стосується різних проблем . Відчуває себе принципом програмування тут ... не впевнений, що це таке ... Людина. Якби тільки я міг придумати ім’я. +1 BTW
Грег Бургхардт

Хіба це не один із твердих принципів?
Дж. Пічардо

3
Ні. "S" у SOLID є принципом відповідальності S (SRP). Але розділення занепокоєнь, яке ви рекомендуєте, є вагомою причиною відокремлення логіки служби від логіки доступу до даних. Інша відповідь Владислава згадує принципала єдиної відповідальності. Відверто кажучи, СРП та розділення концернів добре поєднуються, як вино та сир.
Грег Бургхардт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.