这是一个对象/数据建模和对象命名问题。
背景
想象一下,您正在获得车辆的维修报价 - 您通常会得到一张称为报价单的单张纸,并且在表格上有一个或多个行项目指示要进行的维修,包括定价、数量、描述信息。 报价本身包含客户名称、公司名称、公司徽标、地址、格式等内容。
假设我写了一个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
以帮助消除这种不和谐? 我是否保持原样? 我很困惑。 我如何命名事物以及如何在脑海中概念化这些概念,以便对象数据建模有意义,命名反映这种理解,并且没有不和谐?
我很挣扎,因为LineItem
和Quote
是紧密相连但又分开的概念。LineItem
本身没有意义,没有概念上的引用,所以命名事物有点困难,因为它们是相互联系的,但又是分开的。
当我们谈论 SOLID 时,S 代表单一责任原则,这意味着该类应该只有一个改变的理由。
在这种情况下,当Quote
或Line
更改时,您拥有的代码可能会更改。
你可以做的是创建/使用一个名为Quote
的类并创建一个方法getQuote
、getQuoteLines
、getQuoteItems
或其他东西,它将返回带有行的引号本身,因为Quote
是Line
的组合,至少在概念上,并且知道Lines
。 换句话说,Line
知道自己和它所属Quote
,但Line
不了解他们的兄弟姐妹,这就是为什么你应该把责任交给Quote
阶级。