前回の記事からかなり日が空いてしまいましたが、続きみたいなものを書いておきます。

今回は、「case中に数行コードがあり、caseが大量に必要な場合」という事で、
いろいろ考えてみましたが、あまりいいアイデアが思いつかなかったですね。。。
とはいえ、caseが50個も書かれているswitchはさすがに引くかと思うので、これを減らして見やすくするという方法を日本を例にやってみます。

日本には都道府県が全部で47個あります。
そこで、各県毎に処理を変えたいという場合を考えます。
手っ取り早く書くと下記のようになりますね。


switch (currentPrefecture)
{
  case okinawa:
   処理1
   break;
  case fukuoka:
   処理2
   break;
  case saga:
   処理3
   break;
  ・・・
  case hokkaido:
   処理47
   break;
}


caseが47個もあると見難い?、間違えが見つけにくい?、シンプルじゃない?気がする
ので、
せめて10個以下にしたいと思うわけです(私は)。(caseの数を減らす方法があればご教授頂きたいです

前回の記事とやろうとすることは変わらないのですが、
まずcontextを作ります。


#include "cocos2d.h"
#include "TagConfig.h"

USING_NS_CC;

class PrefectureContext : public CCNode
{
public:
  virtual void getNearPrefecture(kTagPrefecture currentPrefecture) = 0;
};


次に、ステートによる切り替え処理を作ります。
caseを分けるために日本の地方を使っていきます。


#include "cocos2d.h"
#include "PrefectureContext.h"
#include "TagConfig.h"

USING_NS_CC;
class PrefectureState
{
private:
  PrefectureContext* contextState;
public:
  void setOkinawa();
  void setKyusyu();
  void setShikoku();
  void setChugoku();
  void setKinki();
  void setChubu();
  void setKanto();
  void setTohoku();
  void setHokkaido();
  static PrefectureState* getCurrentRegionState(kTagPrefecture currentPrefecture);
  void getNearPrefecture(kTagPrefecture currentPrefecture);
};

class Hokkaido : public PrefectureContext
{
    void getNearPrefecture(kTagPrefecture currentPrefecture);
};

class Tohoku : public PrefectureContext
{
    void getNearPrefecture(kTagPrefecture currentPrefecture);
};

class Kanto : public PrefectureContext
{
    void getNearPrefecture(kTagPrefecture currentPrefecture);
};

class Chubu : public PrefectureContext
{
    void getNearPrefecture(kTagPrefecture currentPrefecture);
};

class Kinki : public PrefectureContext
{
    void getNearPrefecture(kTagPrefecture currentPrefecture);
};

class Chugoku : public PrefectureContext
{
    void getNearPrefecture(kTagPrefecture currentPrefecture);
};

class Shikoku : public PrefectureContext
{
    void getNearPrefecture(kTagPrefecture currentPrefecture);
};

class Kyushu : public PrefectureContext
{
    void getNearPrefecture(kTagPrefecture currentPrefecture);
};

class Okinawa : public PrefectureContext
{
    void getNearPrefecture(kTagPrefecture currentPrefecture);
};



※PrefectureState.cppのシンタックスハイライター設定に挫折したので黒字で勘弁

#include "PrefectureState.h"

void PrefectureState::setHokkaido()
{
    this->contextState = new Hokkaido();
}

void PrefectureState::setTohoku()
{
    this->contextState = new Tohoku();
}

void PrefectureState::setKanto()
{
    this->contextState = new Kanto();
}

void PrefectureState::setChubu()
{
    this->contextState = new Chubu();
}

void PrefectureState::setKinki()
{
    this->contextState = new Kinki();
}

void PrefectureState::setChugoku()
{
    this->contextState = new Chugoku();
}

void PrefectureState::setShikoku()
{
    this->contextState = new Shikoku();
}

void PrefectureState::setKyusyu()
{
    this->contextState = new Kyushu();
}

void PrefectureState::setOkinawa()
{
    this->contextState = new Okinawa();
}

void PrefectureState::getNearPrefecture(kTagPrefecture currentPrefecture)
{
   this->contextState->getNearPrefecture(currentPrefecture);
}

void Hokkaido::getNearPrefecture(kTagPrefecture currentPrefecture)
{
  処理1
}

void Tohoku::getNearPrefecture(kTagPrefecture currentPrefecture)
{
  switch (currentPrefecture)
  {
    case aomori:
     処理2
     break;
    case Iwate:
     処理3
     break;
    ・・・
  }
}

void Kanto::getNearPrefecture(kTagPrefecture currentPrefecture)
{
  switch (currentPrefecture)
  {
    case ibaraki:
     処理8
     break;
    case Tochigi:
     処理9
     break;
    ・・・
  }
}

void Chubu::getNearPrefecture(kTagPrefecture currentPrefecture)
{
  switch (currentPrefecture)
  {
    case niigata:
     処理15
     break;
    case toyama:
     処理16
     break;
    ・・・
  }
}

void Kinki::getNearPrefecture(kTagPrefecture currentPrefecture)
{
   switch (currentPrefecture)
  {
    case mie:
     処理24
     break;
    case siga:
     処理25
     break;
    ・・・
  }
}

void Chugoku::getNearPrefecture(kTagPrefecture currentPrefecture)
{
   switch (currentPrefecture)
  {
    case tottori:
     処理31
     break;
    case simane:
     処理32
     break;
    ・・・
  }
}

void Shikoku::getNearPrefecture(kTagPrefecture currentPrefecture)
{
  switch (currentPrefecture)
  {
    case tokushima:
     処理36
     break;
    case kagawa:
     処理37
     break;
    ・・・
  }
}

void Kyushu::getNearPrefecture(kTagPrefecture currentPrefecture)
{
     switch (currentPrefecture)
     {
         case kTagPrefecture_Fukuoka:
    処理40
             break;
         case kTagPrefecture_Saga:
     処理41
             break;
   ・・・
        }
}

void Okinawa::getNearPrefecture(kTagPrefecture currentPrefecture)
{
  処理47
}



実行してみる

PrefectureState* state = PrefectureState::getCurrentRegionState(currentPrefecture); // 現在の県が属する地方のstateを取得
state->getNearPrefecture(currentPrefecture);

実行はこれだけ


という感じで終わりになります。
結果的にcaseの数は減らないのですが見やすい気はします。(゚Д゚)