我目前正在为Android应用编写代码,该应用将用于计算交叉口的流量。 在4路交叉口,应用程序将有24个按钮。
共有4组,一组用于:东行,南行,西行和北行车辆。 这4组中的每一组分为2组,分别用于卡车和汽车。 然后将这两组中的每一组分成左,右或经过的车辆。
在确定按下哪个按钮时,如何避免巨大的开关/案例陈述?
我要做的是:
每按一次按钮,输出一行: 车型,方向,转弯。
switch (id) {
case R.id.car_westbound_left:
Log.v("output", "car,westbound,left");
break;
}
依此类推。
现在,我认为这不能很好地编写代码。 我可以创建一个类“按钮”,具有属性:车辆类型,方向,转弯然后以某种方式使用它?但我仍然需要按钮的ID来确定按下了哪个按钮?
答案 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个不同MyOperation1
,MyOperation2
,MyOperation3
的对象/按钮。 ..类实例。
case
中的每个switch
语句中的逻辑非常不同),那么您可能会从一个或几个处理类中受益,这些处理类可能共享一个共同的基类,然后实例化24个按钮,每个引用它的处理类实例。