【问题标题】:return program to a previous function and clear current function data(Java)将程序返回到前一个函数并清除当前函数数据(Java)
【发布时间】:2020-05-17 23:19:13
【问题描述】:

标题可能有点不直观,但我不知道该怎么解释。

这就是我正在为一项任务设计一个“应用程序”的交易,其中一个要求是应用程序的 UI 是基于文本的,并且使用 MVC 模式工作。

我一直在努力实现的一个方面是有效地“后退/返回”菜单。

这是我想出的最好的东西:

public class Menu{
    Scanner read;

    public int MainMenu(){
        System.out.println("############# !!! Main Menu !!! #############\n");
        System.out.println("1) Shop");    //there's more options but I want to keep short and I only need one to demonstrate my troubles
        System.out.println("0) Quit");    //terminates the application

        int e = -1;
        while (e<0 || e>4){
            e = read.nextInt();
            if (e<0 || e>4)
                System.out.println("Wrong choice");
        }
        return e;   //this value goes to the controller that then redirects to fucntions such as the one we see bellow
    }

    public int ShopMenu(){
        System.out.println("############# !!! Shop Menu !!! #############\n");
        System.out.println("\nLogin with your acount. If you want to go back to the main menu type: -back.\n");

        System.out.println("Type your email: ");
        String email=read.next();     //this string is meant to be read in the Class that holds all the registred emails so it can verify it's validity, but that's a not a concern currently.
        switch (email){
            case "-back": MainMenu(); email=""; email = read.next() ; break;
        }

        return 1;
    }
}

虽然我可以使用此解决方案返回主菜单,但 我认为 email 字符串已“用完”(因为 init 不再为空,用户可以'不要再写了),下次我选择商店菜单时,我无法输入另一封电子邮件,程序停止运行。

我的意图是一旦 ShopMenu 功能结束,电子邮件字符串被清除,用户可以继续使用它来插入其他电子邮件,而应用程序终止。所有这些都不会明显影响返回上一个菜单的能力。

--编辑--

应 MarsAtomic 的要求,这是程序当前状态的输出:

####### !!!主菜单 !!!

1) 商店

0) 退出

1

####### !!!商店菜单!!!

使用您的帐户登录。如果要返回主菜单类型: -返回。

Insira o 电子邮件:

-返回

####### !!!主菜单 !!!

1) 商店

0) 退出

1

-返回

进程以退出代码 0 结束

【问题讨论】:

  • “用完”是什么意思?描述你看到的,而不是你认为正在发生的,因为我很确定你没有看到你认为你看到的。更好的是,为了消除所有疑问,运行您的程序并复制并粘贴输出并将其编辑到您的问题中。
  • 我想说电子邮件字符串不再是空的,我不能再在上面写/输入任何东西了
  • 好的,我们又来了……为什么您认为电子邮件“不再为空”?你的意思是当你的程序第二次提示输入电子邮件地址时,它只是打印提示然后退出而不接受输入?这就是输出似乎所描绘的,如果这是真的,那么正在发生的事情并不是你认为正在发生的事情。
  • 我正在学习java,所以我说我认为这就是发生的事情,因为这是我根据对输出的观察以及我使用java的少量经验和知识得出的结论。反正。对于我应该如何处理这个问题,您或任何人可以给我任何建议或可能的解决方案吗?
  • @Mr.Maleiro 这是一个反问。他试图帮助你检查你的假设。发现您的假设是解决您自己制造的问题的第一步。检查它们是第二步。

标签: java user-interface model-view-controller input


【解决方案1】:

虽然此问题不包含问题,但我看到了问题区域。

在你的 switch 语句中

switch (email){
    case "-back": MainMenu(); email=""; email = read.next() ; break;
}

你打电话给MainMenu()

但是您在代码注释中声明调用Menu 的正确方法是控制器的 责任。在这里,您让Menu 负责调用下一个Menu 方法。

控制按指示流动:在ShopMenu() 的第一次循环中,调用了-back case,调用MainMenu(),它向任何人返回int

case "-back": MainMenu();

然后控制转到

email=""; email = read.next() ; break;

然后ShopMenu() 完成,将 1 返回到(大概)控制器:

return 1;

一种或另一种“1”会导致控制器结束其执行。因为它总是返回 1,所以ShopMenu() 完成后总是会导致这个结果。


注意结构和声明的目标,这段代码对于 Java 程序来说确实看起来非常像 C。

如果这应该是 MVC,

1) Menu 类是模型的哪一部分?是景色吗?视图不应该只负责显示吗?它也应该负责输入吗?它还应该负责路由和输入检查吗?谁最适合承担这些责任?

2) 为什么不在您在此处提供的内容中至少包含控制器?幸运的是,提供的内容中存在可识别的问题,但我们不知道是什么调用了这些方法或何时调用。

Java 约定将为您提供帮助。类一般应以名词命名,方法应以动词作为最重要的词。这不是因为“它恰到好处”,而是因为它可以帮助您思考代码的每一部分代表什么、数据或行为。

【讨论】:

  • Menu 类是视图 yes。它看起来像 C,因为这是我唯一能适应的语言(就像我说我正在学习 Java)。我担心粘贴 Controller 类会使这个问题变得太长,我想让事情变得简单。所以我应该让输入总是由 Controller 类处理吗?不过,我主要关心的是如何允许用户在主菜单和商店菜单之间来回切换,而程序在没有用户明确命令的情况下停止运行。
【解决方案2】:

Whelp,我想我设法找到了解决方案。只需要在 ShopMenu 函数中使用字符串缓冲区和递归调用:

public void ShopMenu(){
        System.out.println("############# !!! Shop Menu !!! #############\n");
        System.out.println("\nLogin with your acount. If you want to go back to the main menu type: <b.\n");
        StringBuffer Semail = new StringBuffer();
        Semail.append(ler.next());
        String SMail = Semail.toString();
        if (SMail.equals("<b")) {
            email.delete(0, email.length());
            MainMenu();
            ShopMenu();
        }
}

【讨论】:

  • 这仍然是结构不佳的代码。确保您理解@pfdint 发布的答案。好的代码有一个入口点和(最好)一个出口点。想象一下试图走下走廊。如果你需要在一个房间里做某事,你进入,做你需要做的,然后回到走廊,在那里你可以移动到下一个房间。你不会在墙上踢一个洞来到达下一个房间。代码不应类似于 thisthis
  • 你能告诉我我应该在我的代码中做什么吗?因为我没有想法......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多