2011-08-05 11 views
3

私はテキストアドベンチャーゲームに取り組んでいましたが、以下のような繰り返しのコードブロックをプログラムする簡単な方法があるかどうかは疑問でした。私のコードは繰り返しすぎていますか?

このブロックでは、北、東、南、西にN、E、S、Wが表示されます。だから私は別々に各リスナーを書いて、各リスナーにtry/catchブロックを入れる。しかし、コード全体が本当に繰り返しているようです。

btnNorth.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      tvIntro.setText("You go north"); 
      String testString = "nothing"; 
      try { 
       testString = Encounter.EncounterGeneratorText(); 
      } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      testString = Encounter.EncounterGeneratorText(); 
      tvIntro.setText(testString); 
      try { 
       Thread.sleep(500); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      tvIntro.setText(testString);    
     } 
    }); 

    btnEast.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      tvIntro.setText("You go east"); 
      String testString = "nothing"; 
      try { 
       testString = Encounter.EncounterGeneratorText(); 
      } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      testString = Encounter.EncounterGeneratorText(); 
      tvIntro.setText(testString); 
      try { 
       Thread.sleep(500); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      tvIntro.setText(testString); 
     } 
    }); 

    btnSouth.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      tvIntro.setText("You go south"); 
      String testString = "nothing"; 
      try { 
       testString = Encounter.EncounterGeneratorText(); 
      } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      testString = Encounter.EncounterGeneratorText(); 
      tvIntro.setText(testString); 
      try { 
       Thread.sleep(500); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      tvIntro.setText(testString); 
     } 
    }); 

    btnWest.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      tvIntro.setText("you go west"); 
      String testString = "nothing"; 
      try { 
       testString = Encounter.EncounterGeneratorText(); 
      } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      testString = Encounter.EncounterGeneratorText(); 
      tvIntro.setText(testString); 
      try { 
       Thread.sleep(500); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      tvIntro.setText(testString); 
     }; 
    }); 
+7

はい、それはあまりにも繰り返しています。 –

+3

この質問はここにあるはずですhttp://codereview.stackexchange.com/ –

答えて

10

すべてのボタンが使用するOnClickListenerを1つ作成し、そのOnClickListenerで、クリックされたボタンを検出してswitchステートメントの方向指定のタスクを実行できます。

このような何か:

private OnClickListener DirectionClickListner = new OnClickListener() { 
    public void onClick(View v) { 
     switch (v.getId()) { 
     case R.id.north: 
      //Set your strings for North 
      break; 
     case R.id.west: 
      //Set your strings for West 
      break; 
     case R.id.east: 
      //Set your strings for East 
      break; 
     case R.id.south: 
      //Set your strings for South 
      break; 
     } 
    } 
}; 
2

はい:ここ

は、コードのブロックです。同じことをメンバー変数とするリスナーを保存する必要があります。

private OnClickListener mOnClickListener = new OnClickListener() { ... }; 

です。

btnNorth.setOnClickListener(mOnClickListener); 
btnEast.setOnClickListener(mOnClickListener); 
btnSouth.setOnClickListener(mOnClickListener); 
+0

彼は北、南、東、西の特定の値をどうやって渡しますか? –

+0

彼は 'hooked82'の答えのようにすることができます。 – user802421

2

ゲームロジックを独自のクラスにカプセル化することができます。したがって、それぞれのOnClickListenerは、この1つのクラスのインスタンスを持つだけで、その1つのクラスでgoEast()またはgoWest()などを呼び出すことができます。これにより、すべてのロジックが1つのクラスに保持され、繰り返しコードの量が削減されます。

2

私はテスト駆動開発を試みます。最も簡単なことをやっているのであれば、自分のコードをリファクタリングして自分自身を繰り返すことを避けることができます。

7

単一の関数に、この(擬似コード)のようなことをなぜ抽象的ではない:

btnNorth.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     move("North");   
    } 
}); 
btnSouth.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     move("South");   
    } 
}); 
btnEast.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     move("East");   
    } 
}); 
btnWest.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     move("West");   
    } 
}); 

void move(String direction) { 
     tvIntro.setText("You go " + direction); 
     String testString = "nothing"; 
     try { 
      testString = Encounter.EncounterGeneratorText(); 
     } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     testString = Encounter.EncounterGeneratorText(); 
     tvIntro.setText(testString); 
     try { 
      Thread.sleep(500); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     tvIntro.setText(testString); 
} 

あなたは確かにいくつかのより多くを、これをクリーンアップするが、時ができ共通コードのほとんどが単一の場所にあります:)

+0

これはすばらしいアプローチですが、単純なスイッチケースで作成できるリスナーオブジェクトを4つ作成しますが、 – MByD

+0

@MByD - 私はBalusCが最もエレガントでシンプルなソリューションを持っていると思います。 –

2

あなたの例をオブジェクト指向のアプローチで変更したので、コードがさらにテスト可能になりました。

static interface DirectionProvider { 
    String getDirection(); 
} 

DirectionProvider north = new DirectionProvider() { 
    public String getDirection() { 
     return "You go north"; 
    }   
}; 

DirectionProvider south = new DirectionProvider() { 
    public String getDirection() { 
     return "You go south"; 
    }   
}; 

DirectionProvider east = new DirectionProvider() { 
    public String getDirection() { 
     return "You go east"; 
    }   
}; 

DirectionProvider west = new DirectionProvider() { 
    public String getDirection() { 
     return "You go west"; 
    }   
}; 

static class MyOnClickListener extends OnClickListener { 
    public MyOnClickListener(DirectionProvider dp) { 
     @Override 
     public void onClick(View v) { 
      tvIntro.setText(dp.getDirection()); 
      String testString = "nothing"; 
      try { 
       testString = Encounter.EncounterGeneratorText(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      testString = Encounter.EncounterGeneratorText(); 
      tvIntro.setText(testString); 
      try { 
       Thread.sleep(500); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      tvIntro.setText(testString);    
     } 
    } 
} 

そして、あなたはこのようなあなたの新しいリスナーを使用することができます。

btnEast.setOnClickListener(new MyOnClickListener(north)); 
btnSouth.setOnClickListener(new MyOnClickListener(south)); 
btnWest.setOnClickListener(new MyOnClickListener(west)); 
btnEast.setOnClickListener(new MyOnClickListener(east)); 
関連する問題