【问题标题】:How to avoid long switch-case statements?如何避免长的 switch-case 语句?
【发布时间】:2011-07-12 15:33:36
【问题描述】:

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

有 4 组,一组用于:东行、南行、西行和北行车辆。 这 4 组中的每一个都分为 2 组,每组 3 个按钮用于卡车和汽车。 然后将这两组中的每一个分为左转、右转或通过的车辆。

在确定按下哪个按钮时,如何避免出现巨大的 switch/case 语句?

我想做的是:

每次按下按钮时,输出一行: 车辆类型、方向、转弯。

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

等等等等。

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

【问题讨论】:

  • 哇——你是如何实现你的按钮的?能发个布局吗?如果您使用现有的 Button 类,您可以只使用点击侦听器吗?
  • 好吧..您可以使用长 if-else 语句来代替;-) 您可能想要使用车辆对象和某种类型的交叉路口类,您可以在其中放置车辆。 4 路交叉口会创建 4 个车辆对象或类似的东西。
  • @Nathan 这是我现在拥有的按钮中的XML Layoutscreenshot

标签: android switch-statement


【解决方案1】:

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

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

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

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

【讨论】:

  • 首先非常感谢您的回答。我所有的按钮基本上都做同样的事情,它们必须输出汽车或卡车和西/东/北/南和左/右/直通。当然,取决于按下哪个按钮。我应该将按钮分散到按钮组中吗?每个“卡车”按钮?还是每个“西”按钮?这在这里有用吗?或者我是否不可避免地不得不手写这 24 个场景
  • 听起来像编写一个 MyButton 类,该类将字符串输出:new MyButton("car","Eastbound","left")new MyButton("car,Eastbound,left"),并且您将其实例化 24 次,按钮本身执行 @987654330 @ 按下按钮时带有他们的字符串。然后,开关就消失了。
【解决方案2】:

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

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

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

【讨论】:

  • 这是个好主意,但我的 int com.example.helloandroid.R.id.car_westbound_left = 2131034119 我怎么能把它用作数组中的索引?编辑:啊,我认为这是初始化它的部分,对吧?
  • 地图或哈希图可能就是你想要的。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多