如何避免冗长的switch-case语句?

时间:2011-07-12 15:33:36

标签: android switch-statement

我目前正在为Android应用编写代码,该应用将用于计算交叉口的流量。 在4路交叉口,应用程序将有24个按钮。

共有4组,一组用于:东行,南行,西行和北行车辆。 这4组中的每一组分为2组,分别用于卡车和汽车。 然后将这两组中的每一组分成左,右或经过的车辆。

在确定按下哪个按钮时,如何避免巨大的开关/案例陈述?

我要做的是:

每按一次按钮,输出一行: 车型,方向,转弯。

switch (id) {
    case R.id.car_westbound_left:
        Log.v("output", "car,westbound,left");
        break;
}

依此类推。

现在,我认为这不能很好地编写代码。 我可以创建一个类“按钮”,具有属性:车辆类型,方向,转弯然后以某种方式使用它?但我仍然需要按钮的ID来确定按下了哪个按钮?

3 个答案:

答案 0 :(得分:1)

字符串数组怎么样,其中id是数组的索引。所以你得到了字符串

Log.v("output", myoutputstrings[id]);

您只需要以某种方式初始化它,可能从文件或数据库中读取它。

答案 1 :(得分:1)

您可以将按钮(android:tag XML属性)的Tag属性设置为“car,westbound,left”,并使用getTag()方法检索它。

答案 2 :(得分:1)

有许多设计可以将24个案例从单个长“switch”分解为其他内容。常见的“OO”方法是集中在某种工厂,或者让24名“独立参与者”有权做你想做的事。

例如,如果您创建了24个按钮,这些按钮仅在按下时回显其日志语句,那将消除切换。如果你有额外的处理(除了日志记录),那么你需要做出战略决策来“集中”那个处理(就像在一个大的switch语句中,就像你现在一样),或者将处理“分散”成“独立的actor” (比如24“智能按钮”)具有上下文和权限,可以在按下时执行您想要的操作。

“分散式”设计可以成熟:您可能只有一个“DoIt”对象/按钮,其中状态是日志消息,您只需实例化其中的24个实例(但仅限于有一个班级)。即使24个实例要做完全不同的事情,您也可以在其他设计中进一步抽象出来,例如实例化24个引用24个不同MyOperation1MyOperation2MyOperation3的对象/按钮。 ..类实例。

恕我直言,关键的设计决定是:你想集中一下什么?如果它们都做了几乎相同的事情,那么你需要一个具有24个实例的类。如果它们的行为根本不同(您在case中的每个switch语句中的逻辑非常不同),那么您可能会从一个或几个处理类中受益,这些处理类可能共享一个共同的基类,然后实例化24个按钮,每个引用它的处理类实例。