这是一个对象/数据建模和对象命名问题。
背景
想象一下,您正在获得车辆的维修报价 - 您通常会得到一张表格,称为报价,并且在表格上有一个或多个行项目,表示要进行的维修,价格,数量,描述信息。报价本身包含客户名称,公司名称,公司徽标,地址,格式等。
假设我写了一个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
,概念上是#34;负责"管理单个订单项,其中订单项是报价的一部分。因此,在我的getQuote
方法中,我使用Doctrine ORM请求所有订单项,其中订单项属于特定报价,并带有给定的报价ID。该方法返回一个Quote
对象,其中对象包含引用元数据(客户信息等),以及包含其自己的元数据的订单项(数量,描述等)
对我来说,这会产生 dissonance 。当Quote
几乎是一个单独的实体,而不是LineItem
时,负责各个订单项的存储库如何返回引号?这些是不同的概念,并且它们混合在一起。它不应该返回..只是一个组中的行项目,例如像数组一样?
我是否应该将LineItemRepository
重命名为QuoteRepository
而不是帮助消除这种不和谐?我保持原样吗?我很困惑。我如何命名,以及如何在脑海中概念化这些概念,以便对象数据建模有意义,命名反映了这种理解,并且没有不和谐?
我很挣扎,因为LineItem
和Quote
是相互联系良好且又分开的概念。 LineItem
本身没有意义,没有在概念上附加于引用,因此命名事物很难,因为它们是连接的,但是是分开的。
答案 0 :(得分:2)
当我们谈论SOLID时,S代表单一责任原则,这意味着该类应该只有一个改变的理由。
在这种情况下,您所拥有的代码可能会在Quote
或Line
更改时更改。
你可以做的是创建/使用一个名为Quote
的类并创建一个方法getQuote
,getQuoteLines
,getQuoteItems
或其他东西,它将返回引用本身使用这些行,因为Quote
是Line
的组合,至少在概念中,并且知道Lines
。
另一方面,Line
知道自己及其所属的Quote
,但Line
并不知道他们的兄弟姐妹,这就是为什么你应该对{{1}负责} class。