ゲームのバックエンドを表す PHP の小さなテスト アプリケーションに取り組んでいます。次の点を考慮してください。
// GameSession Model
class GameSession {
private $player;
...
}
// Player Model
class Player {
private $inventory;
...
}
// Inventory Model
class Inventory {
private $extensions;
...
}
class InventoryExtension {
...
}
class GameController {
public function newGame() {
// Create a new game session
$gameSession = new GameSession();
$gameSessionMySQL = new GameSessionMySQL();
...
// Save updated game session to DB
$gameSessionMySQL->update($gameSession);
}
}
データ マッパー オブジェクト 'GameSessionMySQL' (クラス定義は表示されていません) を使用して、ゲーム セッションをデータベースに更新/保存しています。そのマッパーは、ゲーム セッション データを挿入、更新、取得、および削除する方法を知っています。
行わないのは、GameSession 内にある Player の更新です。Player には独自の PlayerMySQL マッパーがあります。
さらに、Player モデルには Inventory モデルがあり、これにも独自の InventoryMySQL マッパーがあります。Inventory モデルには InventoryExtension があります。だから私は推測するオブジェクトのツリーのような構造を持っています。
適切なマッパー オブジェクトをどこでインスタンス化し、それらを使用する必要があるのか わからないため、行き詰まっていますか? それらをすべて GameController 内に配置し、必要なモデルを GameSession から get() する必要がありますか? 私は次のようなものを書くことになるかもしれないので、それは私には良くないようです:
$playerMySQL->update($game->Session->getPlayer());
$inventoryMySQL->update($gameSession->getPlayer()->getInventory());
$inventoryExpansionMySQL->update($gameSession->getPlayer()->getInventory()->getExpansion(1);
...
...などなど、手続き型のように疑わしい一連の行になるまで。
一方、各モデルは、必要なマッパーをコンストラクターでインスタンス化してから、関連する CRUD メソッドを独自の (おそらく同様の名前の) CRUD メソッド内から呼び出す必要がありますか? 私は、データ アクセス関連のものはドメイン オブジェクトとは別に保管する必要があるとかなり確信しているので、これは疑わしいと思います。
これらすべてを従来のMVC パラダイムに実装しています。つまり、コントローラーは、ビューからの入力を受け入れることを除いて、ビューに対して何もしません:P
正当な理由のある明確な回答をいただければ幸いです。私はまだOOテクニックを学んでいるので、より難解な用語で簡単にしてください:)
どうもありがとう