将大的Java方法分解为较小的方法

  • 本文关键字:方法 分解 Java java
  • 更新时间 :
  • 英文 :


我有一个混乱和混乱的方法,我想分解成更小的方法,但很难让变量从一种方法转移到另一个方法。 我想将其分解为getStudentId()方法和getCourseId()方法,但是user_Entered_student_Id导致了问题。 任何快速提示将不胜感激

      public void signUp(){
    System.out.println("nSign Up For a Classn");
    try{
      Scanner input = new Scanner(System.in);
      System.out.println("Enter Student ID: ");  
      String user_entered_student_id = input.nextLine();
      String userEnterId = "student_name" + (user_entered_student_id);
    System.out.println("Enter Class ID from Classes Listed Above to Join: ");
    String selectedClass = input.nextLine();
    student_x_class(selectedClass);
}
    catch (SQLException e) {
        e.printStackTrace();
    }
}

public void student_name(Scanner input,String user_entered_student_id, Statement myStmt, Connection con) {
    try{
    myStmt = con.createStatement();
    String query = ("SELECT student_name FROM ClassSelector.students WHERE student_id = " + user_entered_student_id);
    ResultSet rs;
    rs = myStmt.executeQuery(query);
    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.equalsIgnoreCase("Y")) {
             getClass();
         }
         else if (confirm.equalsIgnoreCase("N")) {
                System.out.println("Oops, let start over");
         }
         return;
         }
}
    catch (SQLException e) {
        e.printStackTrace();
    }
}
public void getClass(ResultSet rs, Statement myStmt){
        try{
            rs = myStmt.executeQuery("SELECT * FROM ClassSelector.classes");
            while (rs.next()) {
              String avlClasses = rs.getString("class_id") + "t" + rs.getString("classname") + "t" + rs.getString("description");
              System.out.println(avlClasses);
            }
          }
        catch (SQLException e) {
            e.printStackTrace();
        }
}
public void student_x_class(Scanner input,String selectedClass, String userEnterId, String user_entered_student_id, ResultSet rs, Statement myStmt, Connection con){
        try{
         rs = myStmt.executeQuery("SELECT * FROM ClassSelector.classes WHERE class_id = " + selectedClass);
          while (rs.next()) {
          String innerJoin = (userEnterId + " has been added to " + rs.getString("classname") + " " + rs.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, rs.getString("class_id"));
          pStmt.setString(4, rs.getString("classname"));
          pStmt.executeUpdate();
          System.out.println("Would you like to enroll " + userEnterId + " into another class? (Y/N)");
            String additionalClass = input.nextLine();
            if(additionalClass.equalsIgnoreCase("Y")){
                signUp();
            }
        }
    }
        catch (SQLException e) {
            e.printStackTrace();
        }
}

在 Eclipse 中,你可以选择一堆代码并执行以下操作:

  • 右边的
  • 重构
  • 提取方法...

这是非常有帮助的。但首先确保只在使用变量之前创建变量,而不是像在方法开头创建并在以后使用的语句那样。

也不要重用相同的变量对

不同的事情(我在这里没有看到问题,但我还没有全部阅读),也不要创建无用的变量,如"student_classJoin"或"extraalClass"。

首先,你觉得需要把它分解成更小、更易于管理的块,这是一件好事。知道某人何时需要重构是迈向成功的第一步。你可以为此祝贺自己,因为很多人没有达到这一点。

接下来你应该做的是思考该方法的作用,并在你的脑海中将其分解成具有单一责任的部分。(你不需要在脑海中做,你也可以用简单的英语写下来。

在您的情况下,您的细分将如下所示:

  • 选择学生
    • 索要学生证
    • 获取数据库的学生
    • 询问这是否是正确的学生,如果不是,请重新开始
  • 选择类
  • 向课程添加学生
  • 如果用户愿意,请重复所有这些操作。

现在,您可以为每个步骤创建一个方法(只是空的方法声明,仅此而已),并考虑如何将这些步骤组合在一起。您需要作为参数传递什么,该方法应该返回什么。

完成此操作后,您可以填写方法的主体。作为奖励技巧,您可以先用虚拟实现填充方法,然后可以逐个实现它们。所以你可以有这样的东西:

public String askForStudentId() {
    return "1";
}

然后,您可以编写代码的其余部分,并在某个时候返回到此代码并将其替换为:

public String askForStudentId() {
    Scanner input = new Scanner(System.in);
    System.out.println("Enter Student ID: ");
    return input.nextLine();
}

您需要检查 Java 面向对象的概念。 尤其是封装。我重构了您的代码,但没有要测试的表和数据,但您将大致了解如何创建不同的函数。带有参数和返回类型。代码中需要更多的更正和重构,但我重写了您的代码,让您了解如何将代码拆分为不同的函数,您也可以稍后使用它们。一件事不要在 execute 方法中编写整个查询,将查询保存在字符串变量中,然后将其传递给 execute 方法,这是一种更优雅的代码编写方式。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
public class NewClass
{
ResultSet rs;
PrepareStatement stmt;
Connection conn;
conn  = DriverManager.getConnection("jdbc:mysql://localhost:3306/ClassSelector?autoReconnect=true&useSSL=false", "root", "Volks91!");
public void signUp()
{
    System.out.println("nSign Up For a Classn");
    try
    {
        // getting user input. 
        Scanner input = new Scanner(System.in);
        System.out.println("Enter Student ID: ");
        String user_entered_student_id = input.nextLine();
        /*
         Calling private methid in the class
         @param user_enter_student_id
         @return String userEnterID
         */
        String userEnterId = student_name(user_entered_student_id);
        // getting user input
        System.out.println("Enter Class ID from Classes Listed Above to Join: ");
        String selectedClass = input.nextLine();
        //calling method
        student_x_class(selectedClass);
    } catch (java.sql.SQLException SQL)
    {
        SQL.printStackTrace();
    }
}
private string student_name(String user_entered_student_id)
{
    stmt = con.createStatement();
    String query = "SELECT student_name FROM ClassSelector.students WHERE student_id = " + user_entered_student_id;
    rs = stmt.executeQuery(query);
    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.equalsIgnoreCase("Y"))
        {
            getClass();
        } else if (confirm.equalsIgnoreCase("N"))
        {
            System.out.println("Oops, let start over");
            return;
        }
    }
    return userEnterId;
}
private void getClass()
{
    rs = stmt.executeQuery("SELECT * FROM ClassSelector.classes");
    while (rs2.next())
    {
        String avlClasses = rs.getString("class_id") + "t" + rs.getString("classname") + "t" + rs.getString("description");
        System.out.println(avlClasses);
    }
}
private void student_x_class(String selectedClass)
{
    rs = stmt.executeQuery("SELECT * FROM ClassSelector.classes WHERE class_id = " + selectedClass);
    while (rs.next())
    {
        String innerJoin = (userEnterId + " has been added to " + rs.getString("classname") + " " + rs.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 = conn.prepareStatement(student_classJoin);
        Stmt.setString(1, user_entered_student_id);
        Stmt.setString(2, userEnterId);
        Stmt.setString(3, rs.getString("class_id"));
        Stmt.setString(4, rs.getString("classname"));
        Stmt.executeUpdate();
        System.out.println("Would you like to enroll " + userEnterId + " into another class? (Y/N)");
        String additionalClass = input.nextLine();
        if (additionalClass.equalsIgnoreCase("Y"))
        {
            signUp();
        }
    }
}

}

最新更新