私はこのパターンをコードで時々使用しますが、それが良いのか、悪いのか、名前があるのかさえ疑問に思っています。問題を解決するために一般的に使用されるパターンであるかどうかを確認するためにいくつかの調査を行いましたが、何も見つからないようです。それが私に役立つのは、あまりにも多くの同僚やピアオブジェクトが記憶の知識を利用できないようにすることです. 例がそれを最もよく説明していると思います。
プレイヤーがインベントリを持っているゲームがあるとします。インベントリにはアイテムがあり、各アイテムには databaseId があるため、同じアイテムの 2 つのコピーが単純に同じデータベース エントリを指すことができます。何かがプレーヤーのインベントリからアイテムを取得する必要がある場合、アイテム自体の明示的な知識はなく、削除する必要があるアイテム DB ID を知っているだけです。さらに、アイテムはクライアント ユーザー インターフェイスに使用される handleId (一意) によって格納されます (一意のハンドルがインターフェイスに渡されるため、UIItem は基本的に一種のコールバック ID を持ちます)。
疑似コード:
class Inventory
Map<int, Item> m_Items;
public:
bool RemoveItem(int dbItemId, int count)
{
Item* pItem = GetItemByDBId(dbItemId);
if (pItem) { return RemoveItem( pItem, count); }
return false
}
bool RemoveItem(int handle, count)
{
Item* pItem = m_Items.Find(handle); //Find in my Map returns a const pointer.
if (pItem) { return RemoveItem( pItem, count); }
return false;
}
private:
bool RemoveItem(Item* item, int count); //Handles logic of removing, removes, and returns true if the remove succeeds (ie, quest items can't be removed, etc)
Item* GetItemByHandle(int handle); //returns the item in the map by handle, null if not found
Item* GetItemByDBId(int dbId); //returns the first item with this dbId, null if not found.
現在、UI がアイテムを削除したい場合 (つまり、プレイヤーがアイテムをゴミ箱にドラッグした場合)、知識を分離する public メソッドがあります。NPC がアイテムを削除したい場合 (NPC がプレイヤーに触れたときに盗み、特定の ItemId を探しているとしましょう)、知識を分離する public メソッドも持っています。
私の質問はまず、このパターンには名前がありますか、それとも私が見ていない別のパターンの変数ですか? 第二に、これは良い習慣ですか、それとも悪い習慣ですか? 私にとっては良いのですが、何かが足りないかもしれません。