替代1000个if-then-else语句

时间:2015-06-22 16:49:54

标签: java android if-statement switch-statement

我正在为Android编写基于文本的RPG游戏,以便熟悉Java和XML。我想在按钮的ListView中显示一个字符串数组选项,并且根据用户按下的按钮,我想用一组新选项相应地更新活动。

例如,假设游戏开始时有以下选择:

{option1, option2, option3, option4}

如果用户点击option2,我想显示:

{2-option1, 2-option2, 2-option3, 2-option4}

或者说让用户点击4而不是2.然后:

{4-option1, 4-option2, 4-option3, 4-option4}

所以,我正在尝试确定一种速度有效/内存有效的方法来确定要显示的下一个String[]

最初我正考虑构建一个GIANT if-then-else树(或switch语句 - 无关紧要),其中每个可能的选项都会有一个if语句。 例如:

// choice是用户选择的选项

if(choice==option1){
   return {"1-option1", "1-option2", "1-option3"}
}else if(choice== 1-option1 ){
   return {"1-1-option1","1-1-option2","1-1-option3"}

List将继续,直到每个可能的选择都返回一个String [],该[]对应于要显示的下一组选项。

然后,我开始考虑用对象做这个会更简洁,更容易:

   MyObject newObject = MyObject(choice)
   newObject.getOptions()

其中choice是一个构造函数参数,用于将String[]初始化为正确的下一组选项;和getOptions()返回此String[]

但是,这将是很多对象,我不确定它会简化if / switch语句方法。

那么,有什么想法可以有效地处理这样的事情吗?

3 个答案:

答案 0 :(得分:5)

使用对象内部的Map(可能是HashMap)将"option2"{"2-option1", "2-option2", "2-option3", "2-option4"}相关联。

数据结构选择在编程中非常重要。

答案 1 :(得分:1)

您将需要像 OptionProvider 这样的单一对象,其方法如下:

 - List<Option> getFirstOptions() 
 - List<Option> getNextOptions(Option option)

此对象可以保存有关哪些选项位于地图中哪个选项之后的信息,例如Map<Option,List<Option>>。您可以手动填充Map,也可以填充XML文件或数据库中的数据。

然后你可以使用像 DisplayOptionUtils 这样的实用程序类:

 - String getOptionPrompt(List<Option> chosenOptions, List<Option> nextAvailableOptions)

这将返回您希望选项显示给用户的方式(例如,它可以使用StringBuilder来创建您需要的内容)。

然后在你的主要课程中你可以得到类似的东西:

List<Option> chosenOptions = new ArrayList<>();
List<Option> nextOptions = OptionProvider.getInstance().getFirstOptions();
while(!nextOptions.isEmpty()) {
  System.out.println(DisplayOptionUtils.getOptionPrompt(chosenOptions, nextOptions);
  Option selectedOption = Option.getByValue(getUserInput());
  chosenOptions.add(selectedOption);
  nextOptions = OptionProvider.getInstance().getNextOptions(selectedOption);
}

这种设计并不完美(我在10分钟内提出它)但希望它会让你知道如何达到你想要的效果。

答案 2 :(得分:0)

将概念转换为更一般的概念:总有一个当前状态,并且该状态可能有一组选项。然后可以将选择简单地理解为触发状态转换。

所以你可以简单地用XML格式化它:

<state name="Main Menu">
   <option name="Buy" newState="Shop"/>
</state>
<state name="Shop>
   <option name="Exit" newState="Main Menu"/>
</state>

状态和选项可以轻松地建模为类。不需要复杂的代码,只需将所有现有状态放入Map中。要更改状态,只需向地图询问属于该州名称的状态,并将该状态设置为当前状态...