Как правильно назвать и концептуализировать сценарий моделирования данных объекта с помощью объекта Quote, который содержит позиции?

Это вопрос моделирования объектов / данных и именования объектов.

Фон

Представьте, что вы получаете ремонтную заявку на автомобиль — вы обычно получаете один лист, который называется ценой, и на листе есть одна или несколько позиций, указывающих на ремонт, с информацией о ценах, количестве, описании. В самой цитате есть такие вещи, как имя клиента, название компании, логотип компании, адрес, форматирование и т. Д.

Предположим, я пишу Quote объект, где цитата имеет ноль или более экземпляров LineItem,

Рассмотрим следующий код:

class LineItemRepository extends GenericRepository
{
/**
* Return Quote Domain entity, populated with line items and metadata
*/
function getQuote(int $quoteId): Quote
{
//selects all line items that belong to a quote with quote_id
$query = $this->getDoctrine()->createQuery('
SELECT item
FROM ' . LineItem::class . ' item
WHERE item.quoteId = :quote_id
');
$query->setParameter('quote_id', $quoteId);
$lineItems = $query->getResult();

//creates & populates a domain Quote object with
//quote metadata and line items
$quoteData = $this->getDoctrine()->find(Quote::class, $quoteId);
$quote = new Quote($quoteData);
$quote->setLines($lineItems);
return $quote;
}
}

Выше у меня есть LineItemRepository это концептуально «отвечает» за управление отдельными позициями, где позиции являются частью цитаты. Так что внутри моего getQuote Метод Я запрашиваю все позиции с помощью Doctrine ORM, где позиции принадлежат определенной цитате с заданным идентификатором цитаты. Метод возвращает Quote объект, где объект содержит метаданные цитаты (информация о клиенте и т. д.) и позиции с собственными метаданными (количество, описание и т. д.)

Для меня это создает диссонанс. Как репозиторий, отвечающий за отдельные позиции, может вернуть цитату, когда Quote почти отдельная сущность, которая не является LineItem? Это отдельные понятия и как-то они смешаны вместе. Разве он не должен возвращать … просто позиции в группе, например, например, массив?

Должен ли я переименовать LineItemRepository в QuoteRepository вместо того, чтобы помочь устранить этот диссонанс? Я сохраняю вещи как есть? Я довольно смущен. Как я называю вещи и как я концептуализирую эти понятия в моей голове, чтобы моделирование данных объекта имело смысл, а наименование отражает это понимание, и что нет диссонанса?

Я борюсь, потому что LineItem а также Quote являются понятиями, которые довольно хорошо связаны, и все же отдельные. LineItem само по себе не имеет смысла, без концептуальной привязки к цитате, поэтому называть вещи довольно сложно, поскольку они связаны, но раздельно.

0

Решение

Когда мы говорим о SOLID, S означает принцип единой ответственности, что означает, что у класса должна быть только одна причина для изменения.

В этом случае ваш код может измениться, когда Quote или же Line изменения.

Что вы можете сделать, это создать / использовать класс с именем Quote и создать метод getQuote, getQuoteLines, getQuoteItems или что-то, что вернет саму цитату со строками, потому что Quote это композиция Lineпо крайней мере в концепции, и знать Lines,
Другими словами, Line знает себя и Quote это принадлежит, но Line не знает их братьев и сестер, поэтому вы должны дать ответственность Quote учебный класс.

2

Другие решения

Других решений пока нет …