Задать вопрос
@Alksar

Проектирование архитектуры классов модели. Какой из двух вариантов выбрать?

Добрый день.

При проектировании архитектуры приложения возник вопрос. Имеется три сущности: Заказчик, Заказ, Исполнитель. Каждый заказ относится только к одному заказчику. Заказ разбивается на составляющие и передается исполнителям. У приложение есть три основные задачи:
1) Создание счетов для заказчиков, включающих заказы.
2) Создание чеков исполнителям, включающих выполненные исполнителями работы.
3) Ведение интерактивной таблицы, отражающей все заказы со всеми подробностями, в том числе и с перечнями выполненных работ и исполнителями в рамках заказа.

Стоимость заказа не зависит от количества и стоимости выполненных работ исполнителями. Заказы и выполненные работы не зависят друг от друга логически, но имеют некоторые общие поля - например дату заказа и др..

В голову приходит два варианта взаимодействия классов:

1. Класс Заказчик хранят в себе сделанные заказы. При этом создание счетов получается очень простой операцией: извлечь из заказчика все его заказы и упаковать в счет.
Класс Исполнитель хранит в себе выполненные работы. При этом создание чеков аналогично простое.
Но возникает сложности с ведением интерактивной таблицы (пункт "3)"). Эта таблица формируется из базы данных, а значит для того, чтобы связать заказ с работами исполнителей придется для каждого заказа "потрошить" всех исполнителей в поисках работ выполненных в рамках этого заказа.

2. Класс Заказ - "главный". Он хранит в себе своего заказчика, а также исполнителей и их работы выполненные в ходе заказа. Теперь отображение и изменение этой таблице простое. Но трудности с составлением счетов и чеков, так как чтобы выбрать все заказы определенного заказчика - придется просматривать все заказы. Для выбора всех работ исполнителя для чека - придется просматривать опять же все заказы.

Можно ли как-то объединить эти решения? использовать преимущества обоих без недостатков?
Извиняюсь за много букв, мой первый вопрос тут. Спасибо!
  • Вопрос задан
  • 574 просмотра
Подписаться 2 Оценить 5 комментариев
Пригласить эксперта
Ответы на вопрос 2
SternMore
@SternMore
Работаю над GrabDuck.com
Из приведенных вами примеров, более логично сделать Заказ главным и хранить всю информацию в нем. Это отвечает основному предназначению системы - хранить информацию о заказах.

Для отчетов по исполнителям и заказчикам, если по каким то причинам не устраивает искать сведения перебором, можно реализовать соответствующие отображения (views) и использовать их. Т.е. иметь отдельно списки заказчиков и исполнителей, а в данных списках хранить только ссылки на заказчиков и исполнителей из "главного" списка заказов.

Соответственно необходимо настроить систему, чтобы при добавлении или изменении заказа соответствующие изменения применялись и на списке заказчиков и исполнителей.
Ответ написан
Комментировать
max-kuznetsov
@max-kuznetsov
Главный IT-архитектор
Класс "Заказ" может иметь указатель на экземпляр класса "Заказчик" (в случае ООП это будет ссылка на объект). Каждый "Заказчик" может иметь список "Заказов" (массив указателей на сделанные им заказы).

"Заказ" должен быть композицией нескольких составных частей - "работ", каждая из которых должна иметь указатель на исполнителя, а "Исполнитель" может иметь массив указателей на "работы", которые ему назначены.

При таком исполнении не нужно смотреть все заказы, чтобы выявить относящиеся к данному заказчику. И не нужно отдельно выбирать работы для исполнителя. Вы же работаете с классами, а не с таблицами БД: тут логика несколько иная. Реляционные БД основаны на теории множеств, а не на теории взаимосвязанных объектов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы