実現したいこと
node.jsの初心者です。
オンラインゲームを作っており、その中で参加者(player)に役割(role)を持たせたいです。
参加者それぞれに好きな役割を選ばせる形です。
これの実現として、次のような形を考えています(実際のコードではなく、例です)
class Player{ consutructor(name){ this.name = name this.role = null } takeRole(role){ //?? } solo(){ if(this.role.canSolo){ console.log("俺の歌を聞け!") } } } class Role{ constructor(type){ this.type = type this.vocal = 300 this.dance = 300 this.visual = 300 this.canSolo = false } totalAppeal(){ return this.vocal + this.dance + this.visual } } class Vocalist extends Role{ constructor(){ super("vocalist") this.vocal = 700 this.canSolo = true } } //Roleは他にも複数存在
roleはほぼ構造体です。
疑問
問題はtakeRoleの部分です。
playerに与えるroleが決まっていれば
//player内 takerole(role){ this.role = role } var uduki = new Player("uduki") uduki.takeRole(new Vocalist())
などとすれば良いように思うのですが、
udukiから希望するroletypeを受け取ってroleを設定しようとすると、
uduki.takeRole("Vocalist")
のような形でコールせざるを得ないと考えています。
この時takeRole内部でどう処理をすればいいのかがわかりません。
考えたこと
・roleManagerのようなオブジェクト、あるいはクラスを作る
すなわち、
var roleManager = { "Vocalist": Vocalist, "Dancer": Dancer, "Performer": Performer } //player内 takeRole(roleName){ this.role = new roleManager[roleName]() } var uduki = new Player("uduki") uduki.taleRole("Vocalist")
のような形にすればやりたいことは達成できますが、
この形だと、roleの種類だけroleManagerの行数を増やさなくてはならず、あまりスマートに思えません。
(roleは将来的に増やしていくことを考えています。)
あるいは、
class Role{ constructor(type){ this.type = type this.vocal = 300 this.dance = 300 this.visual = 300 this.canSolo = false switch(type){ case "Vocalist": this.canSolo = true this.vocal = 700 break case "Dancer": //以下延々と処理 } } } uduki.takeRole(new Role(roleName))
のような方法も考えましたが、これはもっと筋が悪い気がします。
evalは…さすがに論外ですよね。
質問
①この方針で行く場合、takeRoleの実装はどのような方法がスマート、あるいはスタンダードですか?
②そもそも、現状の設計は理にかなっているものですか?
ほぼメソッドを持たないRoleクラスに違和感を感じていて、その情報をplayerに持たせれば十分なような気もしています。
その場合は、どのような形にすべきですか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/25 08:30
2020/02/25 09:53
2020/02/26 04:15
2020/02/26 06:40