Чи потрібно впорядковувати свої папки за діловим або технічним доменом?


19

Наприклад, якщо я використовую MVC-подібну архітектуру, яку структуру папок я повинен використовувати:

domain1/
    controller
    model
    view
domain2/
    controller
    model
    view

Або:

controllers/
    domain1
    domain2
models/
    domain1
    domain2
views/
    domain1
    domain2

Я навмисно залишив розширення файлів, щоб зберегти це питання мовно-агностичним.

Особисто я вважаю за краще розділити домен на бізнес (відчуття кишки), але бачу, що більшість / багато фреймворків розділені за технічним доменом. Чому я можу обрати одне над іншим?


2
рамки орієнтовані на розробників, а не на бізнес-користувачів. Розробники , як очікується , буде більш комфортно з технічно-орієнтованого підходу і структури взяти до уваги - це може бути причиною того, що ви спостерігаєте
комар

Відповіді:


15

Я думаю, це залежить від конкретного проекту.

Наприклад, якщо різні бізнес-домени абсолютно незалежні один від одного, я б організував бізнес-домен.

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

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

Domain1              # This domain changes bits of standard MVC code
  controllers
  models
  views
Domain2              # this domain only modifies views, all else is standard
  views
Shared               # Here is the better part of code base
  controllers
  models
  views

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

Редагувати:

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

Звичайно, ви можете роздрібнити проект для кожної з цих компаній. Але якщо рамка / мова дозволяє, ви можете використовувати підкласинг або плагіни тощо, щоб налаштувати біти та фрагменти загального проекту під потреби кожного клієнта та організувати їх у макетах Business Domain.

Наприклад, якщо загальний проект експортує в JSON лише сам Елемент, Domain1 може підкласифікувати контролер і змусити його експортувати також останні проблеми з доставкою.

Якщо ви згодом виявите, що в Domain1 є компонент, який також дійсний для Domain2, ви можете витягнути загальну версію його до Спільного.

Як ви вже говорили, багато фреймворків організовуються за технічною областю, і це те, що я використовував зараз, тільки тому, що мій вибір FW полегшує це. Але, маючи трохи (або багато) мастила в ліктях, я думаю, що я можу переписати включені контури для підтримки макета Business Domain.


Думаю, ідея чудова, але я не можу уявити практичного прикладу. Не могли б ви дати простий, але освічуючий?
Флоріан Маргаїн

@FlorianMargaine - Я надам вам приклад із реального світу. Веб-сайти з нерухомості. На моїй останній роботі ми багато клієнтів продали кілька веб-сайтів з нерухомості. У нас була централізована база даних для всіх 50+ клієнтів. Кожен адміністратор бек-енду використовував спільний набір модулів. Кожна сторона, що звертається до клієнта, використовувала унікальні зображення та навігацію. Для кожного пошуку та розгортання сторінок використовували спільні модулі, за винятком випадків, коли клієнт хотів одноразових функцій. Для цих одноразових ми розділили код і дали їм свій модуль. (Недолік: Оновлення потрібно було робити в загальних моделях і дублювати в одноразових модулях)
Майкл Райлі - AKA Gunny

8

Я думаю, що це просвітливо запитати: "що мені більше додати на регулярній основі, більше доменів чи більше технічних підрозділів?" Тоді яка б не була відповідь, поставте це на найвищий рівень.

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

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

Зберігайте речі разом, якщо вони можуть змінитися одночасно.


Найкраща порада, але я не бачу, як передбачити, який тип доменів я буду додати найбільше.
Флоріан Маргаїн

Останнє речення прибиває це.
Хакан Деріал

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

3

Є ще одна альтернатива, і це переміщення окремих частин у плагінах. CakePHP робить це, наприклад. Це дозволить вам генерувати цілі деталі MVC, які можна використовувати повторно, які ви можете сортувати за будь-якою логікою.

Ваш основний додаток просто використовуватиме їх та посилатиметься на них.

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

Враховуючи це: Якщо ви розділитесь за доменом, як би ви повторно використовували частини програми? Наприклад, візьміть веб-магазин: надходить запит на / замовлення / перегляд / 1, тому вам потрібно показати номер замовлення. 1. Переходить на / замовлення / контролери / order_controller Якщо ви розділили домен по продуктах та замовленнях, вам уже знадобляться частини іншого "домену".

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

Плагін зробить саме те, що йому потрібно зробити. Це залежатиме від його введення, а не від інших "частин / доменів / областей".


Гарна ідея. Це по суті моя відповідь зверху вниз. Я поставив Спільний код у верхній частині і в основному підключений до специфіки Домену. Ви поміщаєте Домен вгорі і підключаєте Спільний код. Я думаю, що обидва є однаково хорошими підходами щодо дезадаптації та перевірки.
Лаас

2

Microsoft ASP.Net MVC 3 має поняття "Області". Коли ви впроваджуєте "Області" у свій проект MVC, вони розбиваються так:

area1/
   models
   views
   controllers
area2/
   models
   views
   controllers

Я вважав це цілком природним. Область - це «великий шматок» проекту, і робота в автономному підрозділі просто мала багато сенсу.

Ми використовували простори імен, щоб відповідати, FWIW.


2
Дякую за ваш внесок, але як це відповідає на моє запитання? (Порівнюючи обидва рішення)
Флоріан Маргаїн

@FlorianMargaine: Я демонструю, як це робило Microsoft, з (можливо, хибним) припущенням, що вони доклали багато інженерних зусиль для вибору більш розумного способу. Сподіваюся, це дає певний внесок.
gahooa

Гаразд, але це був бізнес-орієнтований спосіб, який я показав у своєму питанні ...
Флоріан Маргаїн,

1

Зі свого особистого досвіду роботи з веб-магазином, що складається з 300 000 рядків коду, я завжди хотів би організувати бізнес-домен. Таким чином, ви можете не тільки отримати швидкий огляд усіх відповідних класів, коли ви працюєте над однією функціональною областю, в Java ви також можете використовувати видимість пакету.

Деякі деталі для тих, хто цікавиться: Коли проект було розпочато 5 років тому, розробники створили таку структуру пакету:

com
  example
    web
      struts
        action
        form
      shared
      functionality1
      functionality2

Кожна функція магазину, така як кошик, пошук товарів тощо, складається з декількох дій, кожен з яких має власний клас форми (структура, доручена рамкою MVC). Ми закінчили понад 200 класів у пакеті дій, кожен з яких повністю відокремлений від асоційованого класу форм. Найгірше те, що дії не реалізують занадто багато логіки, але викликають послуги, що залежать від функції, які знаходяться в іншому пакеті.

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


0

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

Особисто я думаю, що набагато простіше зберігати свій Foo Controller і Foo Repository або все, що завгодно, ніж переходити назад і назад між папкою Controller і папкою Repository, як часто мені потрібно працювати над тим, як додавати функції навколо Foo. У великих проектах це ще важливіше, оскільки відстань між технічними папками може бути великим і стати помітною тратою часу під час розвитку.

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