我有一个混乱和混乱的方法,我想分解成更小的方法,但很难让变量从一种方法转移到另一个方法。 我想将其分解为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();
}
}
}
}