2011-08-05 58 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您所有的按鈕將使用和在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就只有這個類的一個實例,然後他們可以叫goEast()goWest()等上一個類。這將把所有的邏輯保存在一個類中,並減少重複代碼的數量。

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));