将代码保持为嵌套 if 语句或尝试转换为一个开关或多个开关会更容易吗

Would it be easier to keep code as nested if statements or to try and convert to a switch or multiple switches

我完成了 class 的编码作业,一位朋友给我的反馈是嵌套的 if 看起来比 switch 语句好得多

我尝试将其转换为开关,但如果不是更多的工作,它似乎大致相同。

//this is the absolute basic frame of the code created
if(arg){
    //code
    if(arg){
        //code
        if(arg){
            //code
        }
        else if(arg){
            //code
        }
    }
    else if(arg){
        //code
    }
else if(arg){
    //code
}

如果将它转换为 switch 语句,它会更容易、更好看吗?或者即使不是更糟,它也会一样吗?

编辑: 对于 ghostcat,这是我为问题简化的完整代码部分

while(loop == true){
        System.out.print("Do you have more students to enter (Y for yes, N for no): ");
        yn = input.nextLine();
        if(yn.equals("Y") || yn.equals("y")) {
            System.out.print("Undergraduate or Graduate? (U for undergraduate, G for graduate): ");
            ug = input.nextLine();
            if(ug.equals("U") || ug.equals("u")) {
                System.out.print("Student name: ");
                NAME = input.nextLine();
                System.out.print("Student ID: ");
                ID = input.nextInt();
                System.out.print("Student GPA: ");
                GPA = input.nextFloat();
                System.out.print("Is student a transfer student? (Y for yes, N for no): ");
                input.nextLine();
                transfer = input.nextLine();
                if(transfer.equals("Y") || transfer.equals("y")) {
                    ts = true;
                    students.add(new UndergradStudent(NAME, ID, GPA, ts));
                }
                else if(transfer.equals("N") || transfer.equals("n")) {
                    ts = false;
                    students.add(new UndergradStudent(NAME, ID, GPA, ts));
                }
            }
            else if(ug.equals("G") || ug.equals("g")) {
                System.out.print("Student name: ");
                NAME = input.nextLine();
                System.out.print("Student ID: ");
                ID = input.nextInt();
                System.out.print("Student GPA: ");
                GPA = input.nextFloat();
                System.out.print("What college did the student graduate from: ");
                input.nextLine();
                college = input.nextLine();
                students.add(new GradStudent(NAME, ID, GPA, college));
            }
        }
        else if(yn.equals("N") || yn.equals("n")) {
            loop = false;
        }
    }

无论哪种方式都可以争论 -- 如果它像这样适合你,我不会太担心它。 Switch 语句会使代码看起来像

switch(var1)
case 1:
{
//code
switch(var2)
  case 1: 
  {
   //code
  }
    switch(var3)
    case 1:
    {
        //code
        }
    case 2:
    {
        //code
        }
  }
  case 2:
  {
    //code
  }
case 2: {
//code
}

你绝对可以让它以任何一种方式工作

clean code 的角度来看,这两个选项(if/else 或开关)都不是可取的。但是在没有更多上下文的情况下解决这个问题是不可能的。

首先,真正的问题是您的示例代码周围的方法必须查看如此多的参数。

The ideal number of arguments for a function is zero (niladic). Next comes one (monadic), followed closely by two (dyadic). Three arguments (triadic) should be avoided where possible. More than three (polyadic) requires very special justification—and then shouldn’t be used anyway.

换句话说:您努力编写参数尽可能少的方法。因为每个参数都可能 添加 需要这样一个 如果或切换对比度。

当多个 switch 语句都适合您时,一个潜在的路径可能是转向多态性。 "correct" OOP 中的切换方式是有不同的类,并使用运行时多态性来确定在运行时实际调用哪个方法。

鉴于添加的上下文:

ug = input.nextLine();
if(ug.equals("U") || ug.equals("u")) {
...

干净的代码解决方案可以是这样的:

ug = input.nextLine();
if (ug.equalsIgnoreCase("u")) {
  fetchValuesForUndergraduate(); 
}

就是这样!您当前代码的真正问题是它在一个地方做了很多事情。 "clean code" 解决方案是 代码移动到不同的辅助方法中,这些方法有很好的名字,而且做的更少。