【问题标题】:Replacing if else statement with pattern example用模式示例替换 if else 语句
【发布时间】:2018-09-02 22:10:57
【问题描述】:

基于 SO 上的各种线程(例如 Replace Multiple If\Else with Design PatternReplacing if else statement with pattern )我知道我可以用 Command pattern 替换多个 if\else statements

但是对于我这个级别的人来说,答案远非简单或详细..我将有 60 个else if 块..并进行了一些研究,我发现命令模式是最好的..搜索有关如何使用的教程到那个一步一步似乎很难,因为我发现的一切都是在复杂的问题中解释的。相信我,如果我没有进行大量研究并放弃互联网,我不会在这里提出问题! (我相信这个问题的答案会受到试图实现相同目标的人的赞赏,因为到目前为止互联网上还没有明显且结构良好的答案)

编辑2:
这是我所有 else if 块的结构:

 else if (data.equals("Exercice Inolerance, ")) {
        AddCode(mmDatabase.getTesta2());}

 else if (data.equals("Neta, ")) {
        AddCode(mmDatabase.getTesta3());}

PS:itemList.add 的范围可以是 1 到 10!

如何逐步将其转换为命令模式..谢谢!

Item.Java

public class Item {

    private String name = "";

    public Item() {
    }

    public Item(String name){
        this.name = name;
    }

    public String getItemName() {
        return name;
    }

    public void setItemName(String name) {
        this.name = name;
    }

}

【问题讨论】:

  • 你可能不会。你以错误的方式思考模式。模式的重点不是每次都尽可能地使用它。它能够识别设计方法并在适用的情况下使用它们,并向其他人描述您的设计。在这种情况下,使用命令模式几乎没有意义——它几乎不会增加代码的清晰度。
  • @Gabe Okey 谢谢 .. 还有其他方法可以简化我的代码,或者我应该手动执行(每次在 else if 下添加 bloc 并更改它?)
  • 您可以将单个 if 分解为它们自己的函数。如果代码变大,这将提高清晰度。如果命令模式的静态选项集相对较小,我并没有真正看到通过为命令模式投入大量开销来提高可读性或可维护性。现在,如果我们谈论的是在运行时注册的选项的变量列表,那将是一个不同的答案。
  • 如果每个分支的大部分自定义代码都是关于为意图设置参数,请考虑在每个新活动上使用静态 createIntent 函数。这有一些好处,包括将创建 Activity 意图的所有逻辑保留在实际类中(如参数名称)。
  • @Gabe Sechan 非常感谢您的回答..但这似乎很难..应用你所说的,我是 android 新手,这是我正在开发的第一个应用程序..我不介意手动做这些事情,我想我可以处理改变每个集团..但它好吗?这样做可以接受吗?这就是我所担心的..如果我通过创建 60 else if bloc 并手动更改它们来做一些愚蠢的事情..那么如果我手动执行它们又可以吗?再次感谢

标签: java android


【解决方案1】:

首先想到的是添加一个

Class<? extends Activity> handlerActivity;

Item 类的字段,在构造函数中初始化它

new Item("Jenny",Figures.class);

在你的 onItemClick 方法中做

Intent intent = new Intent(DecisionTree.this, itemList.get(position).getHandlerActivity());
startActivity(i);

(或以任何其他方式将 Item 映射到它的处理活动)

正如您帖子的第一条评论所说,不要仅仅为了应用模式而应用模式。当然,我在这里提供的解决方案远非完美,它只是为了帮助您摆脱 ifs。我假设 Jenny、Bladna 和 Drafat 是某种业务常量,因此通常您会使用枚举常量或单独的类(如果您的设计更复杂)来实现多态行为

编辑:这是你的代码

public class Item {

    private final String name;
    private final Class<? extends Activity> handlingActivity;

    public Item(String name, Class<? extends Activity> handlingActivity) {
        this.name = name;
        this.handlingActivity = handlingActivity;
    }

    public Class<? extends Activity> getHandlingActivity() {
        return handlingActivity;
    }

    public String getName() {
        return name;
    }
}

用法:

itemList.add(new Item("Jenny", Figures.class));
            itemList.add(new Item("Bladna", State.class));
            itemList.add(new Item("Drafat", Casa.class));
            itemListAdapter.notifyDataSetChanged();
            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    Intent intent = new Intent(DecisionTree.this, itemList.get(position).getHandlingActivity())
                            startActivity(intent);

                }
            }

【讨论】:

  • 所以如果我理解你的建议,1/ 我应该添加:Class&lt;? extends Activity&gt; handlerActivity;在我正在处理的同一活动中的 onCreate 之后..2/ 并且在我应该添加所有具有意图的项目班级:new Item("Jenny",Figures.class); ..3/ 用 if else bloc 做我的正常工作,而不是使用 listview.itemclicklistener( position ==0 do that, position ==1 do this )..i 应该只添加:Intent intent = new Intent(DecisionTree.this, itemList.get(position).getHandlerActivity(); startActivity(i);
  • 是这样吗?这也很棒..它会大大减少我的代码!
  • @Zouhair 将 Class...> 字段添加到 Item 类中,您理解正确吗?
  • 对不起,我是android新手,这是第一次看到这种代码..我在我的帖子中添加了item.class..你能更新你的帖子吗使用我的 Item.class 并指定在哪里添加其余代码..抱歉给您带来麻烦,非常感谢您的回答!
  • @Zou 如果每个 Activity 都将通过 Intent 接收额外内容,您仍然需要定义 if/else 语句来根据类类型确定进入每个 Intent 的数据
猜你喜欢
  • 1970-01-01
  • 2015-03-18
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
  • 2019-04-09
  • 1970-01-01
相关资源
最近更新 更多