Это вопрос моделирования объектов / данных и именования объектов.
Фон
Представьте, что вы получаете ремонтную заявку на автомобиль — вы обычно получаете один лист, который называется ценой, и на листе есть одна или несколько позиций, указывающих на ремонт, с информацией о ценах, количестве, описании. В самой цитате есть такие вещи, как имя клиента, название компании, логотип компании, адрес, форматирование и т. Д.
Предположим, я пишу 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
само по себе не имеет смысла, без концептуальной привязки к цитате, поэтому называть вещи довольно сложно, поскольку они связаны, но раздельно.
Когда мы говорим о SOLID, S означает принцип единой ответственности, что означает, что у класса должна быть только одна причина для изменения.
В этом случае ваш код может измениться, когда Quote
или же Line
изменения.
Что вы можете сделать, это создать / использовать класс с именем Quote
и создать метод getQuote
, getQuoteLines
, getQuoteItems
или что-то, что вернет саму цитату со строками, потому что Quote
это композиция Line
по крайней мере в концепции, и знать Lines
,
Другими словами, Line
знает себя и Quote
это принадлежит, но Line
не знает их братьев и сестер, поэтому вы должны дать ответственность Quote
учебный класс.
Других решений пока нет …