如何使用包含行项的报价对象正确命名和概念化对象数据建模方案?



这是一个对象/数据建模和对象命名问题。

背景

想象一下,您正在获得车辆的维修报价 - 您通常会得到一张称为报价单的单张纸,并且在表格上有一个或多个行项目指示要进行的维修,包括定价、数量、描述信息。 报价本身包含客户名称、公司名称、公司徽标、地址、格式等内容。

假设我写了一个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 请求所有行项目,其中行项目属于具有给定报价 ID 的特定报价。 该方法返回一个Quote对象,其中该对象包含报价元数据(客户信息等)和具有自己的元数据(数量、描述等)的行项

对我来说,这造成了一种不和谐。 当Quote几乎是一个单独的实体(不是LineItem)时,负责单个行项目的存储库如何返回报价? 这些是单独的概念,不知何故它们混合在一起。 它不应该返回吗..也许只是组中的行项目,例如数组?

我是否或应该将LineItemRepository重命名为QuoteRepository以帮助消除这种不和谐? 我是否保持原样? 我很困惑。 我如何命名事物以及如何在脑海中概念化这些概念,以便对象数据建模有意义,命名反映这种理解,并且没有不和谐?

我很挣扎,因为LineItemQuote是紧密相连但又分开的概念。LineItem本身没有意义,没有概念上的引用,所以命名事物有点困难,因为它们是相互联系的,但又是分开的。

当我们谈论 SOLID 时,S 代表单一责任原则,这意味着该类应该只有一个改变的理由。

在这种情况下,当QuoteLine更改时,您拥有的代码可能会更改。

你可以做的是创建/使用一个名为Quote的类并创建一个方法getQuotegetQuoteLinesgetQuoteItems或其他东西,它将返回带有行的引号本身,因为QuoteLine的组合,至少在概念上,并且知道Lines。 换句话说,Line知道自己和它所属Quote,但Line不了解他们的兄弟姐妹,这就是为什么你应该把责任交给Quote阶级。

最新更新