これにはゲーム開発プロジェクトが含まれていますが、実際には、データをコーディングして他のデータにマッピングすることを目的としています。これが、ここに投稿することにした理由です。
外部インベントリ アイテム データ ストレージに使用している形式:
[ID:IT_FO_TROUT]
[Name:Trout]
[Description:A raw trout.]
[Value:10]
[3DModel:null]
[InventoryIcon:trout]
[Tag:Consumable]
[Tag:Food]
[Tag:Stackable]
[OnConsume:RestoreHealth(15)]
[OnConsume:RestoreFatigue(15)]
質問は、最後の 2 つのOnConsumeプロパティに集中しています。基本的に、2 つの特性は、アイテムが消費されると、消費者の健康が 15 ポイント上昇し、疲労も同様に上昇することを意味します。これは、バックグラウンドで、2 つの異なるメソッドを呼び出します。
void RestoreHealth(Character Subject, int Amount);
void RestoreFatigue(Character Subject, int Amount);
メソッドをファイル内の対応する文字列にどのようにマッピングしますか? これは私が考えたことです:
アイテムが消費されるたびに、文字列 (イベント) のリストがItem イベント マネージャーに渡されます。マネージャーは各文字列を解析し、適切なメソッドを呼び出します。設定は非常に簡単で、これはあまり頻繁に行われる操作ではないため、パフォーマンスへの影響はそれほど大きくない可能性があります (文字列のサイズも小さく (最大 10 ~ 15 文字)、O(n) 時間で解析されます)。 )。
各インベントリ アイテム(クラス) は、初期化時に文字列イベントを 1 回だけ解析します。各文字列イベントは、辞書。これは、私が考えることができるパフォーマンスの点で最も効率的な方法ですが、他のことを行うのが非常に困難になります。ディクショナリ内のすべての値は、同じ種類のデリゲートでなければなりません。これは私が維持できないことを意味します
a) RestoreHealth(int)
b) SummonMonster(ポジション、カウント)
同じ辞書にあり、呼び出し可能なメソッドの種類ごとに新しいデータ構造を設定する必要があります。これは膨大な量の作業です。
両方の方法を改善するために、頭に浮かんだいくつかの方法:
アイテムのOnConsumeイベントが 2 回解析されないように、アイテム イベント マネージャー内である種の一時キャッシュを使用できますか? ただし、2) で発生した問題と同じ問題が発生する可能性があります。
map<InventoryItem,List<delegate>>
.NET ライブラリ内のハッシュテーブルデータ構造により、任意の種類のオブジェクトを任意の時点でキーおよび/または値にすることができます (ディクショナリとは異なります)。これを使用して、文字列 A をデリゲート Xにマップ し、同じ構造内で文字列 B をデリゲート Yにマップすることもできます。これを行うべきではない理由はありますか?この方法によってもたらされるトラブルを予測できますか?
私も反省の方法で何かを考えていましたが、それに関しては私は正確に経験していません。そして、毎回文字列を解析する方が速いと確信しています。
編集
アレクセイ・ラガの答えを念頭に置いた私の最終的な解決策。イベントの種類ごとにインターフェイスを使用します。
public interface IConsumeEvent
{
void ApplyConsumeEffects(BaseCharacter Consumer);
}
サンプル実装者 (特定のイベント):
public class RestoreHealthEvent : IConsumeEvent
{
private int Amount = Amount;
public RestoreHealthEvent(int Amount)
{
this.Amount = Amount;
}
public void ApplyConsumeEffects(BaseCharacter Consumer)
{
Consumer.Stats.AlterStat(CharacterStats.CharStat.Health, Amount);
}
}
パーサーの内部 (イベントの特殊性を気にする唯一の場所 - データ ファイル自体を解析しているため):
RestoreHealthEvent ResHealthEv = new RestoreHealthEvent (Value);
NewItem.ConsumeEvents.Add (ResHealthEv );
キャラクターがアイテムを消費すると:
foreach (IConsumeEvent ConsumeEvent in Item.ConsumeEvents)
{
//We're inside a parent method that's inside a parent BaseCharacter class; we're consuming an item right now.
ConsumeEvent.ApplyConsumeEffects(this);
}