繁体   English   中英

同一方法内的方法调用

[英]Method calling within the same method

我正在开发一个小型应用程序,允许学生在选定后加入课程。 我希望用户能够按ID选择学生,按ID选择班级,并将用户添加到该班级。 这可行,但是添加学生后,我希望程序询问学生是否要加入另一个班级,而不是重置整个程序并不得不返回。

我认为我已经接近解决方案,但不知道如何使我的方法(signUp())返回方法的一半。 这有意义吗? 将学生输入课程并选择“加入另一个课程”后,我想返回代码中的粗体注释。

抱歉,如果您觉得这很冗长而令人困惑,那么我是新手,所以感谢您的耐心配合!

static void signUp() {
        System.out.println("\nSign Up For a Class\n");
        try {
          Scanner input = new Scanner(System.in);
          System.out.println("Enter Student ID: ");
          String user_entered_student_id = input.nextLine();

          Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/ClassSelector?autoReconnect=true&useSSL=false", "", "");
          Statement myStmt = con.createStatement();
          Statement myStmt2 = con.createStatement();
          Statement myStmt3 = con.createStatement();

          ResultSet rs;
          rs = myStmt.executeQuery("SELECT student_name FROM ClassSelector.students WHERE student_id = " + user_entered_student_id);
          while (rs.next()) {
            String userEnterId = rs.getString("student_name");
            System.out.println("Is " + userEnterId + " the correct student? (Y/N)");
            String confirm = input.nextLine();

            if (confirm.equals("Y") || confirm.equals("y")) {
              ResultSet rs2 = myStmt2.executeQuery("SELECT * FROM ClassSelector.classes");
              while (rs2.next()) {
                String avlClasses = rs2.getString("class_id") + "\t" + rs2.getString("classname") + "\t" + rs2.getString("description");
                System.out.println(avlClasses);
              }
            } else if (confirm.equals("N") || confirm.equals("n")) {
              System.out.println("Oops, let start over");
              return;
            }
    **//RETURN TO THIS SECTION OF CODE AND PROCEEED**
            System.out.println("Enter Class ID from Classes Listed Above to Join: ");
            String selectedClass = input.nextLine();
            ResultSet rs3 = myStmt3.executeQuery("SELECT * FROM ClassSelector.classes WHERE class_id = " + selectedClass);
            while (rs3.next()) {
              String innerJoin = (userEnterId + " has been added to " + rs3.getString("classname") + " " + rs3.getString("class_id"));
              System.out.println(innerJoin);
              String student_classJoin = "INSERT IGNORE INTO student_x_class" + "(student_id,student_name, class_id, classname)" + "VALUES (?, ?, ?, ?)";
              PreparedStatement pStmt = con.prepareStatement(student_classJoin);
              pStmt.setString(1, user_entered_student_id);
              pStmt.setString(2, userEnterId);
              pStmt.setString(3, rs3.getString("class_id"));
              pStmt.setString(4, rs3.getString("classname"));
              pStmt.executeUpdate();
              System.out.println("Would you like to enroll " + userEnterId + " into another class? (Y/N)");
              String additionalClass = input.nextLine();
              if(additionalClass.equals("Y") || additionalClass.equals("y")){
                  signUp();
              }
            }
          }
        } catch (java.sql.SQLException SQL) {
          SQL.printStackTrace();
        } catch (Exception EXC) {
          EXC.printStackTrace();
        }

      }

这段代码混乱。 但是,让我们退后一步,看一些代码,它可以表示您正在寻找的结构类型。

让我们从执行的操作开始。 像这样:

studentID = prompt("enter a student ID");
student = get_from_data(studentID);
courseID = prompt("enter a course ID");
course = get_from_data(courseID);
insert_in_data(studentID, courseID);

这些细节是非常特定于实现的,但是总的来说,您的主要逻辑方法在语义上应该与此非常相似。 实际上,将代码提取到小的单个方法中通常是一个很好的主意 ,其中方法名称描述了要执行的操作。 然后,整个步骤的序列就像描述业务流程的简短故事一样。

现在,您想重复这种结构吗? 好吧,这就是循环的目的。 像这样:

while(!someTerminatingCondition) {
    // the steps above
}

现在我们只需要定义该条件。 它基于用户输入,对吗? 所以像这样:

shouldContinue = true;
while(shouldContinue) {
    // the steps above
    shouldContinue = prompt("continue?");
}

为了给您一些Google服务,您所描述的内容通常称为“游戏循环”。 这个想法是整个过程应该反复进行,直到满足某些特定条件为止。 (在游戏中,这种情况是获胜者的决定。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM