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

时间:2018-03-20 19:52:26

标签: php refactoring repository-pattern data-modeling naming

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

背景

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

假设我写了一个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而不是帮助消除这种不和谐?我保持原样吗?我很困惑。我如何命名,以及如何在脑海中概念化这些概念,以便对象数据建模有意义,命名反映了这种理解,并且没有不和谐?

我很挣扎,因为LineItemQuote是相互联系良好且又分开的概念。 LineItem本身没有意义,没有在概念上附加于引用,因此命名事物很难,因为它们是连接的,但是是分开的。

1 个答案:

答案 0 :(得分:2)

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

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

你可以做的是创建/使用一个名为Quote的类并创建一个方法getQuotegetQuoteLinesgetQuoteItems或其他东西,它将返回引用本身使用这些行,因为QuoteLine的组合,至少在概念中,并且知道Lines。 另一方面,Line知道自己及其所属的Quote,但Line并不知道他们的兄弟姐妹,这就是为什么你应该对{{1}负责} class。