// 同じ名前のオブジェクトとメソッドが多いので頭のなかで混乱してた

気になる点
* 経験上，再帰開始場所と再帰終了条件が別のメソッドにあるとバグりやすい気がする．
  * 調べたら [相互再帰](https://ja.wikipedia.org/wiki/%E7%9B%B8%E4%BA%92%E5%86%8D%E5%B8%B0) というらしい  
  > 参照透過性の成立している言語では、相互再帰はあまり問題を生まないが、破壊的操作を行う関数同士で相互再帰を行うと、ロジックが複雑になりすぎ>て、カオス（混沌）となり、バグの温床となることが多い。
* 再帰の中でプロパティの変化が発生してるのでプロパティの追跡がしにくい
  * 例えば 「カム太郎倒したらいきなり 10 レベルあがったんだけど」みたいなバグっぽい挙動が合った時に処理が追いにくい
  * これは前述の相互再帰の破壊的操作に該当するかな
* 再帰の最深部で emit() をしてる
  * front -> ctrl -> model という階層を頭のなかで考えてるんだけど model の都合で処理が中断した場合（メソッド呼び出しの深度の問題とか）に emit するかどうかというのを front 側で決定できる仕組みじゃないのでエラーかどうかをクライアントに通知する手段が難しい気がする
* tryLevelUp_() と levelUp() と addExp() （全部 ctrl.Player の話）の関係がちょっと複雑
  * levelUp() と addExp() は public のため任意の場所で呼ばれる可能性がある
  * private tryLevelUp_() のエントリポイントは levelUp() と addExp() の２つ
  * addExp() が呼ばれた場合は levelUp() も呼ばれる
  * levelUp() が呼ばれた場合は addExp() は呼ばれない