用于替换布尔地狱的模式

时间:2014-02-19 18:58:58

标签: design-patterns

我已经嵌套if / else,这取决于几个布尔值 它的游戏引擎更新功能和它叫做每个milisecound左右 现在我有几个运动的条件 它就是这样的:

function update()
{
  if(b_layer_1 == true)
  {
     b_layer_1->posY(-2)
     if(b_layer_1->posY() = 150)
     {
       b_layer_1 = false ;
       b_layer_2 = true ;
       b_layer_3 = false ;
     }
   }
    if(b_layer_2 == true)
   {
     b_layer_2->posY(-2)
     if(b_layer_2->posY() = 400)
     {
       b_layer_1 = false ;
       b_layer_2 = false ;
       b_layer_3 = true ;
     }
   }
    if(b_layer_3 == true)
   {
     b_layer_3->posY(-2)
     if(b_layer_3->posY() = 700)
     {
       b_layer_1 = false ;
       b_layer_2 = false ;
       b_layer_3 = false ;
      // ... Here i can have more layers boolean's 
      //...
     }
   }
   //.. it can continue up to 20 layers to control with booleans ...




  }
}
我正在寻找一些(我不确定)状态模式来摆脱这个布尔地狱

1 个答案:

答案 0 :(得分:1)

状态模式更多地基于应用程序的独占状态。在你的情况下,它不是A或B或C,而是A,也许是B,也许是C.看起来你会使用某种密钥和对的集合(我不知道c和c ++,有什么东西吗?像C#中的Dictionary<TKey, TValue>一样?)其中键是你的图层对象,值是一个自定义类型,包含有关当“图层为真”时应该发生的设置和动作的信息。在伪代码中

for all layers in layers_collection
  if layer is true then
    layer.pos(-2)
    if layer.post == layer.settings.expectedPosition
        layer.setMyBools

这就是我要做的。我实际上可以给你写一个C#代码,但我想这不会比你说的多得多。也许考虑使用特定的语言标记来标记您的问题?