使用if语句的效率低下 - Android

时间:2014-07-14 19:08:48

标签: java android if-statement refactoring performance

首先,这段代码有效。基本上我用if语句检查listview中单击的位置,然后运行另一个检查来比较drawables以显示正确的文本(因此,如果用户点击青蛙的图像,我将填充EditText字段用文字" Frog")。我遇到的一个主要问题是图像是一个随机图像,最终导致我发现这段怪物代码。

if(position==0) {

     if (username.getDrawable().getConstantState().equals(getResources().getDrawable(R.drawable.image06).getConstantState())) {
          Toast.makeText(ChatRoom2.this, "Key", Toast.LENGTH_LONG)
                       .show();
          String next = "<font color='#13b602'>@Key </font>";
          editText.append(Html.fromHtml(next));

          editText.setSelection(editText.getText().length());
     }  if (username.getDrawable().getConstantState().equals(getResources().getDrawable(R.drawable.image03).getConstantState())) {

          String next = "<font color='#13b602'>@BlueCube</font>";
          editText.setText(Html.fromHtml(next));

          editText.setSelection(editText.getText().length());
     }
}

这是对第一个位置的检查,并且只有两个嵌套ifs用于两个图像 - 我有30个图像要检查,因此每个位置将有30个if语句和10个位置。我有一种感觉,我对这个问题的解决方案很差,因为我需要为此创建500多行代码才能简单地工作。有没有办法创建一个只包含if语句的单独的类?

2 个答案:

答案 0 :(得分:1)

因此,我不使用Android进行编码,因此我甚至不确定您的代码正在做什么,但我认识到您正在遵循的模式,并且您认识到您的设计存在缺陷是正确的。

您所遵循的解决方案会导致大量代码重复,如果您遵循良好的Object Oriented惯例,可以将其消除。

1)使用类和方法分离您的动作。例如,您经常调用同一个if语句,以便您可以在一个类中包含所有操作。这种“主要”方法更像是一种程序性程序员的思维方式,你可以看到它可能会给你带来很多问题。相反,尝试将唯一行为拆分为它自己的类或方法,然后在需要时调用它 - 例如将所有这些重复的If子句放在一个单独的方法中,这样它就可以列出一次但是被调用多次你需要它

2)正确使用您的数据结构。我看到提到重复定位和带有指定文本的图像。您希望将所有这些信息存储在数据结构(例如散列映射)或专门为您的对象设计的类中(可能包含数据结构作为变量)。例如,您可以创建一个Image类,该类具有可以返回的特定文本变量。然后,您可以为图像加载数据,并为每个图像分配适当的文本(而不是硬编码这些值)。或者您可能有一个Position类,其中包含可以垂直分配的可能位置值的ArrayList,以便您可以在需要的地方重复使用它。

3)如果你真的有必须单独列出并具有共同因素的详细逻辑,请尝试使用switch statement而不是一系列If / Then语句。这样更清晰,减少了许多if子句中可能出现的重复。

请记住,如果您认为您的设计很丑陋......最有可能让它变得更好。即使是最好的代码也可以通过优化来消除重复和速度性能。有关如何优化设计的其他想法,请查看这些design patterns

希望有所帮助!

答案 1 :(得分:0)

事实证明,我需要在for循环中使用do-while循环来使其更清洁!