Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: как Разбивать базу проекта на Domain и Application Logic

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
ВеликийПрограмист
Отправлено: 21 Сентября, 2017 - 09:34:05
Post Id



Новичок


Покинул форум
Сообщений всего: 16
Дата рег-ции: Янв. 2016  


Помог: 0 раз(а)




Я в замешательстве книгу Domain Driven Design Эванса я не читал но вижу в статьях о ней что он предлогает разбить программу на 4 слоя

Presentation Layer
Application (Service) Layer
Domain (Business) Layer
Data Storage Layer

Есть еще статья эта идея не нова ИМХО есть статья Multitier architecture на википедии об том же самом, только вот одно но такое деление это будет соответствовать принципам ООП?

Как это реализовать, а именно разбить на Application и Domain слои есть какие-то примеры?
И зачем нужно Data Storage Layer понятно чтобы можно было легко поменять базу данных, но можно же сделать Wrapper зачем целый отдельный механизм заталкивания в базу какой в этом смысл?
 
 Top
Bio man
Отправлено: 22 Сентября, 2017 - 00:23:27
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




ВеликийПрограмист пишет:
это будет соответствовать принципам ООП?
Если под ООП подразумевается ООПрограммирование, то, чтобы это было ООП, нужно соблюсти всего 2 условия - инкапсуляция и абстракция.
Если ООПроектирование, то это очень философский вопрос, однозначного ответа нет.
Но такая многослойная архитектура довольно распространена.
ВеликийПрограмист пишет:
Как это реализовать, а именно разбить на Application и Domain слои есть какие-то примеры?
http://www[dot]elisdn[dot]ru/blog/104/do[dot][dot][dot]tities-modelling
ВеликийПрограмист пишет:
И зачем нужно Data Storage Layer понятно чтобы можно было легко поменять базу данных, но можно же сделать Wrapper зачем целый отдельный механизм заталкивания в базу какой в этом смысл?
По хорошему, твой код ничего не должен знать о том, как и где хранятся данные, и как их от туда доставать. Вся эта магия должна быть заключена в 1 месте - в репозиториях. Репозиторий это по сути фасад над хранилищем данных, который предоставляет простой и удобный интерфейс для доступа к данным.
 
 Top
ВеликийПрограмист
Отправлено: 27 Сентября, 2017 - 12:03:08
Post Id



Новичок


Покинул форум
Сообщений всего: 16
Дата рег-ции: Янв. 2016  


Помог: 0 раз(а)




Bio man пишет:
По хорошему, твой код ничего не должен знать о том, как и где хранятся данные, и как их от туда доставать. Вся эта магия должна быть заключена в 1 месте - в репозиториях. Репозиторий это по сути фасад над хранилищем данных, который предоставляет простой и удобный интерфейс для доступа к данным.


Он не должен знать, но он должен отправлять их на хранение к примеру когда новый клиент зарегистрировался вся validation делается на уровне приложения, но потом то приложение должно дать команду сохранить эти данные, пускай оно не знает как это будет осуществленно дальше, но команда исходит от преложения.

PHP:
скопировать код в буфер обмена
  1. class user {
  2.  
  3.    private $databaseObj;
  4.    private $viewObj;
  5.  
  6.    __consturct($DBObj, $ViewObj) {
  7.        $this->databaseObj = $DBObj;
  8.        $this->ViewObj = $ViewObj;
  9.    }
  10.  
  11.  
  12.    function validate_registration(array $user_fields) {
  13.    
  14.        /* ... Проверить првильность всех полей имя емайл пороль и т.п. */
  15.  
  16.       if ($fields_valid == true) {
  17.           //Приложение не знает куда идут данные просто говорит враперу сохранить
  18.           $status = $databaseObj->add_record("table_users", $user_fields_arr);
  19.  
  20.           if ($status == true) {
  21.               $viewObj->load_page("registration_success.php", "Регистрация OK.")
  22.           } else {
  23.               load_page("system_error.php");
  24.               email_admin();
  25.           }
  26.       }
  27.    }
  28.  
  29.    
  30.    function read_user(int $user_id = '') {
  31.  
  32.       if (!empty($user_id)) {
  33.             //Приложение не знает откуда данные просто говорит враперу считать их
  34.             $user_fields_arr = $databaseObj->get_record("table_users", $user_id);
  35.             $viewObj->load_page("user_edit.php", $user_fields_arr);
  36.       } else {
  37.             //Приложение не знает откуда данные просто говорит враперу считать их
  38.             $user_fields_arr = $databaseObj->get_all_records("table_users");
  39.             $viewObj->load_page("users_table.php", $user_fields_arr);
  40.       }
  41.    }
  42.  
  43. }


Обьяект $databaseObj это простенький wrapper для базы данных MySQL в котором есть generic метод add_record(string $table, array $fields) {...} который данные и добавит в указанную таблицу и даст return true;

1. Можно ли считать generic wrapper $databaseObj полноценным Data Storage Layer или он должен быть чем то большим чтобы так называться?

2А. Приложение знает название таблицы table_users где хоранятся данные, это нарушает правило что оно не должно знать где данные храняться и как?

Если бы я название таблицы перенес из приложения просто бы команду $storage_layer_obj->add_new_user($user_fields_arr); то мне бы пришлось действительно создавать сложный Data Storage Layer с кучей кода какой в этом смысл?

2Б. Я могу подключить одновременно воторую базу если у меня есть этот отдельный слой и просто дать её в другом обьекте и все не надо менять код приложения это плюс.

Но знание приложением название таблицы чему мешает? Ведь допустим я преешел с MySQL на другой движок все равно в любой базе нужно давать название таблице.

(Отредактировано автором: 27 Сентября, 2017 - 12:42:39)

 
 Top
Bio man
Отправлено: 29 Сентября, 2017 - 15:00:33
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




В рамках DDD, Application layer не знает деталей хранения данных.
Application layer это сервисы, которые производят какие-то действия над твоими объектоми модели.
Data Storage Layer - это репозитории, которые используются в сервисах.
Код, который ты привел, не вписывается никаким боком в DDD, это и не сервис, и не репозиторий. Больше похоже на контроллер, и то сложно это назвать контроллером.

И что такое generic wrapper?
Я похоже отстал от сегодняшних реалий ))

Разберись сперва с базовыми концепциями DDD, потом приходи.
(Добавление)
Почитай цикл статей по ссылке, которую я привел выше.
Там доходчиво описывается, что такое доменная модель, сервисы и репозитории.
 
 Top
LIME
Отправлено: 30 Сентября, 2017 - 05:48:14
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




ВеликийПрограмист оно тебе надо?
Bio man ты че выделываесся?
типа композиция против наследования?
ой... я тя умоляю
угомонися ...тоже мне тру солид
(Добавление)
ВеликийПрограмист пока забей
хорошо что думаешь но пока забей
(Добавление)
Bio man если бы ты че дельное сказал я бы молчал
 
 Top
Bio man
Отправлено: 30 Сентября, 2017 - 16:26:13
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




LIME пишет:
Bio man если бы ты че дельное сказал я бы молчал
здаров.
скажи че дельное, обсудим. я за дебаты. свою точку зрения не отстаиваю, потому готов услышать мысли оппозиции ))
и да, я за SOLID, за правильное наследование, хоть это к теме и не относится.
и я не понимаю, что тебя так смутило!
LIME пишет:
ВеликийПрограмист пока забей
полностью согласен, рано пока в эти дебри лезть.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB