2

我想从其他人那里得到一些关于以下问题的想法。假设我们有两个类 Products 和 Items。Products 对象允许我们访问任何 Item 对象。这是示例。

$products = new Products();

// get existing item from products
$item = $products->get(123);

// create item
$item = $products->create();
$item->setName("Some new product");
$item->setPrice(2.50);

现在更新/保存项目状态的最佳方法是什么?我看到 2 个选项:

$item->save();

或者

$products->save($item);

第一种方法似乎非常直接。一旦设置了 Item 对象的属性,对其调用 save 方法将持续更改。

另一方面,我觉得后一种方法更好。我们将两个对象的角色分开。Item 对象仅包含状态, Products 对象在该状态上运行。此解决方案也可能更适合编写单元测试。有什么想法吗?

4

1 回答 1

1

因此,这些项目有效地缓冲了实际的变化。

显然这两种方法都行得通,但它归结为您希望与底层数据库模型或覆盖对象模型的紧密程度。

从外部看,$item->save()就模型而言最有意义 - 正如您所指出的,您更新项目的属性,然后将它们保存下来。此外,它在概念上是对项目执行的操作。

但是,$products->save($item)它提供了两个显着的优点和一个缺点。

从好的方面来说,通过将保存移动到产品中,它可以(潜在地)以更智能的方式处理更新的批处理/重新排序,因为它具有所有项目的可见性。它还允许将保存代码用作->add()(或多或少)

一个缺点是它会(从对象模型视图)添加以下可能的用途,您可能不想要:

$p1 = new Products();
$p2 = new Products();
$item = $p1->create();
// set $item values
$p2->save($item);

显然,您可以添加一个“这是我的吗?不?然后向 抛出一个错误'测试Products::save,但这是用于阻止语法暗示可以/应该工作的用例的额外代码。或者至少可能会通过代码审查。

因此,我会说采用看起来最简单且与所需功能$item->save()

于 2014-05-15T08:39:14.827 回答