2

次の問題について、他の人から考えてもらいたいと思います。Products と Items という 2 つのクラスがあるとします。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 メソッドを呼び出して変更が保持されます。

一方、後者のアプローチの方が優れているように感じます。2 つのオブジェクトの役割を分離しています。Item オブジェクトには状態のみが含まれ、 Products オブジェクトはその状態で動作します。このソリューションは、単体テストの作成にも適している場合があります。何かご意見は?

4

1 に答える 1

1

したがって、事実上、アイテムは実際の変更をバッファリングしています。

明らかに両方のアプローチが機能しますが、最終的には、基礎となるデータベースのモデルまたはオーバーレイされたオブジェクト モデルにどれだけ厳密に準拠したいかによって異なります。

外部から$item->save()見ると、モデルの観点から最も理にかなっています-指摘したように、アイテムのプロパティを更新してから保存します。さらに、概念的にはアイテムに対して実行されるアクションです。

ただし、$products->save($item)2 つの顕著な利点と欠点があります。

プラス面として、保存を製品に移動することで、すべてのアイテムを可視化できるため、更新のバッチ処理/並べ替えを (潜在的に) よりスマートな方法で処理できます。また、保存コードを->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 に答える