コーディングは実際にはそれほど難しくありません。難しい部分は、理にかなっており、読みやすく、理解可能なコードを書くことです。だから、私はより良い開発者を獲得し、強固なアーキテクチャを作りたいと思っています。
それで、私はビデオゲームでNPCのアーキテクチャを作成したいと思います。これは、Starcraft、Age of Empires、Command&Conquersなどのようなリアルタイム戦略ゲームです。したがって、さまざまな種類のNPCがあります。A NPCは、これらの多くの能力(メソッド)に1を持つことができますBuild()
、Farm()
とAttack()
。
例:
労働者がすることができますBuild()
し、Farm()
戦士缶Attack()
市民缶Build()
、Farm()
とAttack()
漁師ができるFarm()
とAttack()
これまでのところすべてが明確であることを願っています。
だから今、私は私のNPCタイプとその能力を持っています。しかし、技術的/プログラム的な側面を見てみましょう。
さまざまな種類のNPCに適したプログラムアーキテクチャは何でしょうか。
さて、基本クラスを持つことができました。実際、これはDRYの原則を守る良い方法だと思います。WalkTo(x,y)
すべてのNPCが移動できるため、基本クラスのようなメソッドを持つことができます。しかし今、本当の問題に取り掛かりましょう。自分の能力をどこで実装しますか?(覚えておいてください:Build()
、Farm()
およびAttack()
)
能力は同じロジックで構成されるため、各NPC(Worker、Warrior、..)にそれらを実装することは、DRYの原則に迷惑をかける/破るでしょう。
さて、基本クラス内に能力を実装できました。NPCは、能力Xを使用することができる場合、これは検証というロジックのいくつかの種類が必要になりIsBuilder
、CanBuild
、..私は私が表現したいものを明確だと思います。
しかし、私はこの考えにあまり気分がよくありません。これは、機能が多すぎる肥大化した基本クラスのように聞こえます。
プログラミング言語としてC#を使用しています。したがって、ここでは多重継承はオプションではありません。手段:のような追加の基本クラスがあるFisherman : Farmer, Attacker
と機能しません。