Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我的代码是否太重复?_Java_Android - Fatal编程技术网

Java 我的代码是否太重复?

Java 我的代码是否太重复?,java,android,Java,Android,我正在写我的文本冒险游戏,想知道是否有一种更简单的方法来编程重复的代码块,比如我下面的代码块 在该块中,用户将看到北、东、南和西的N、E、S、W。因此,我分别编写每个侦听器,并在每个侦听器中包含一个try/catch块。但是整个代码块现在看起来确实是重复的 以下是代码块: btnNorth.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) {

我正在写我的文本冒险游戏,想知道是否有一种更简单的方法来编程重复的代码块,比如我下面的代码块

在该块中,用户将看到北、东、南和西的N、E、S、W。因此,我分别编写每个侦听器,并在每个侦听器中包含一个try/catch块。但是整个代码块现在看起来确实是重复的

以下是代码块:

btnNorth.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            tvIntro.setText("You go north");
            String testString = "nothing";
            try {
                testString = Encounter.EncounterGeneratorText();
            } catch (Exception e) {
                    e.printStackTrace();
                }
            testString = Encounter.EncounterGeneratorText();
            tvIntro.setText(testString);
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            tvIntro.setText(testString);            
        }
    });

    btnEast.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            tvIntro.setText("You go east");
            String testString = "nothing";
            try {
                testString = Encounter.EncounterGeneratorText();
            } catch (Exception e) {
                    e.printStackTrace();
                }
            testString = Encounter.EncounterGeneratorText();
            tvIntro.setText(testString);
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            tvIntro.setText(testString);
        }
    });

    btnSouth.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            tvIntro.setText("You go south");
            String testString = "nothing";
            try {
                testString = Encounter.EncounterGeneratorText();
            } catch (Exception e) {
                    e.printStackTrace();
                }
            testString = Encounter.EncounterGeneratorText();
            tvIntro.setText(testString);
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            tvIntro.setText(testString);
        }
    });

    btnWest.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            tvIntro.setText("you go west");
            String testString = "nothing";
            try {
                testString = Encounter.EncounterGeneratorText();
            } catch (Exception e) {
                    e.printStackTrace();
                }
            testString = Encounter.EncounterGeneratorText();
            tvIntro.setText(testString);
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            tvIntro.setText(testString);
        };
    });

对。您应该将执行相同操作的侦听器保存为成员变量

private OnClickListener mOnClickListener = new OnClickListener() { ... };
像这样使用

btnNorth.setOnClickListener(mOnClickListener);
btnEast.setOnClickListener(mOnClickListener);
btnSouth.setOnClickListener(mOnClickListener);

您可以尝试将游戏逻辑封装在自己的类中。因此,每个
OnClickListener
将只拥有这一类的一个实例,然后它们就可以在这一类上调用
goEast()
goWest()
等。这将使所有逻辑保持在一个类中,并减少重复代码的数量。

我会尝试测试驱动开发。如果你总是做最简单的事情,你会发现重构你的代码更容易,这样你就可以避免重复你自己。

你可以创建一个所有按钮都将使用的OnClickListener,在这个OnClickListener中,你会发现哪个按钮被点击,并在switch语句中执行特定于方向的任务

大概是这样的:

private OnClickListener DirectionClickListner = new OnClickListener() {
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.north:
            //Set your strings for North
            break;
        case R.id.west:
            //Set your strings for West
            break;
        case R.id.east:
            //Set your strings for East
            break;
        case R.id.south:
            //Set your strings for South
            break;
        }
    }
};
btnEast.setOnClickListener(new MyOnClickListener(north));
btnSouth.setOnClickListener(new MyOnClickListener(south));
btnWest.setOnClickListener(new MyOnClickListener(west));
btnEast.setOnClickListener(new MyOnClickListener(east));

为什么不将其抽象为一个函数,如下所示(psuedo代码):


您当然可以进一步清理这些,但至少大多数常见代码都在一个位置:)

使用OO方法修改了您的示例,这也使您的代码更易于测试

static interface DirectionProvider {
    String getDirection();
}

DirectionProvider north = new DirectionProvider() {
    public String getDirection() {
        return "You go north";
    }           
};

DirectionProvider south = new DirectionProvider() {
    public String getDirection() {
        return "You go south";
    }           
};

DirectionProvider east = new DirectionProvider() {
    public String getDirection() {
        return "You go east";
    }           
};

DirectionProvider west = new DirectionProvider() {
    public String getDirection() {
        return "You go west";
    }           
};

static class MyOnClickListener extends OnClickListener {
    public MyOnClickListener(DirectionProvider dp) {
        @Override
        public void onClick(View v) {
            tvIntro.setText(dp.getDirection());
            String testString = "nothing";
            try {
                testString = Encounter.EncounterGeneratorText();
            } catch (Exception e) {
                e.printStackTrace();
            }
            testString = Encounter.EncounterGeneratorText();
            tvIntro.setText(testString);
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            tvIntro.setText(testString);            
        }
    }
}
您可以像这样使用新的侦听器:

private OnClickListener DirectionClickListner = new OnClickListener() {
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.north:
            //Set your strings for North
            break;
        case R.id.west:
            //Set your strings for West
            break;
        case R.id.east:
            //Set your strings for East
            break;
        case R.id.south:
            //Set your strings for South
            break;
        }
    }
};
btnEast.setOnClickListener(new MyOnClickListener(north));
btnSouth.setOnClickListener(new MyOnClickListener(south));
btnWest.setOnClickListener(new MyOnClickListener(west));
btnEast.setOnClickListener(new MyOnClickListener(east));

这个问题可能就在这里,这是一个很好的方法,尽管您创建了4个侦听器对象,您可以用简单的开关大小写创建一个。@MByD-我完全同意,我认为BalusC有最优雅/最简单的解决方案,并建议改为使用它。他如何传递北、南、北的特定值,东方和西方?他可以像胡克的答案那样做。