重构很多if语句

时间:2014-10-28 02:06:04

标签: java if-statement refactoring

所以我有一个项目来创建一个随机名称生成器,目前我选择了前缀和后缀: A)该人的名字中的字母数量,以及 B)他们名字的第一个和最后一个字母。

代码目前按预期运行,我只想改进代码并希望删除数百行包含数千条if语句的行。

import java.util.*;
public class ranName 
{
    public static void main(String[] args)
    {
        String input, firstName, lastName;
        String firstPre, firstSuff, lastPre, lastSuff, lSuffMean, lPreMean, fLastLet, fFirstLet, lLastLet, lFirstLet;

        Scanner sc = new Scanner(System.in);

        System.out.println("Welcome to the Lord Of The Rings Elf name Generator!");
        System.out.println("------------------------------------------------");
        System.out.println("");
        System.out.print("First Name: ");
        firstName = sc.nextLine();

        while (true)
        {   
            System.out.println("------------------------------------------------");
            System.out.println("You inserted " + firstName);
            System.out.println("Are you sure?");
            System.out.print("Y/N: ");
            input = sc.nextLine();
            System.out.println("------------------------------------------------");
            if (input.equalsIgnoreCase("Y"))
            {
                break;
            }    
            else if (input.equalsIgnoreCase("N"))
            {
                System.out.print("First Name: ");
                firstName = sc.nextLine();
            }
            else
            { 
                System.out.println("Oh well, you tried. Here's another go at it."); 
            }
        }

        System.out.print("Last Name: ");
        lastName = sc.nextLine();

        while (true)
        {   
            System.out.println("------------------------------------------------");
            System.out.println("You inserted " + lastName);
            System.out.println("Are you sure?");
            System.out.print("Y/N: ");
            input = sc.nextLine();
            System.out.println("------------------------------------------------");
            if (input.equalsIgnoreCase("Y"))
            {
                break;
            }    
            else if (input.equalsIgnoreCase("N"))
            {
                System.out.print("Last Name: ");
                lastName = sc.nextLine();
            }
            else
            { 
                System.out.println("Oh well, you tried. Here's another go at it."); 
            }
        }
        System.out.print("Your Elf Name: ");

        firstPre = preGet(firstName);
        firstSuff = suffGet(firstName);


        lastPre = housePreGet(lastName);
        lastSuff = houseSuffGet(lastName);

        lPreMean = preMean(lastPre);
        lSuffMean = suffMean(lastSuff);

        fLastLet = String.valueOf(firstPre.charAt(firstPre.length()-1));
        fFirstLet = String.valueOf(firstSuff.charAt(0));

        lLastLet = String.valueOf(lastPre.charAt(lastPre.length()-1));
        lFirstLet = String.valueOf(lastSuff.charAt(0));

        if (fFirstLet.equals(fLastLet))
        {
            firstSuff = (firstSuff.substring(1));
        }

        if (lFirstLet.equals(lLastLet))
        {
            lastSuff = (lastSuff.substring(1));
        }

        System.out.println(firstPre + firstSuff + " " + lastPre + lastSuff);
        System.out.println("");
        System.out.println("------------------------------------------------");
        System.out.println("The House Name (lastname) Translates to: " + lPreMean + " " + lSuffMean);
        System.out.println("------------------------------------------------");
    }

public static String preGet(String fN)
{
    String[] namePre;
    String fNN, fL;
    fNN = fN.trim();
    int fnCount = fNN.length();
    fL = String.valueOf(fNN.charAt(0));
    namePre = new String[53];
    namePre[0] = "PlaceHolder";
    namePre[1] = "Ael";
    namePre[2] = "Aer";
    namePre[3] = "Bael";  
    namePre[4] = "Bes";
    namePre[5] = "Cael";
    namePre[6] = "Cor";
    namePre[7] = "Dae";
    namePre[8] = "Dre";
    namePre[9] = "Eil";
    namePre[10] = "Ev";
    namePre[11] = "Fir";
    namePre[12] = "Fis";
    namePre[13] = "Gael";
    namePre[14] = "Gil";
    namePre[15] = "Ha";
    namePre[16] = "Hu";
    namePre[17] = "Ia";
    namePre[18] = "Il";
    namePre[19] = "Ja";
    namePre[20] = "Jar";
    namePre[21] = "Kan";
    namePre[22] = "Kor";
    namePre[23] = "La";
    namePre[24] = "Lue";
    namePre[25] = "Mai";
    namePre[26] = "Mara";
    namePre[27] = "Na";
    namePre[28] = "Nim";
    namePre[29] = "Ol";
    namePre[30] = "Onn";
    namePre[31] = "Py";
    namePre[32] = "Pael";
    namePre[33] = "Qu";
    namePre[34] = "Qi";
    namePre[35] = "Rum";
    namePre[36] = "Rua";
    namePre[37] = "Sae";
    namePre[38] = "Sha";
    namePre[39] = "Tahl";
    namePre[40] = "Thro";
    namePre[41] = "Ul";
    namePre[42] = "Uon";
    namePre[43] = "Ver";
    namePre[44] = "Vil";
    namePre[45] = "Wuo";
    namePre[46] = "Waal";
    namePre[47] = "Xae";
    namePre[48] = "Xen";
    namePre[49] = "Ya";
    namePre[50] = "Yae"; 
    namePre[51] = "Za";
    namePre[52] = "Zy";

    if (fnCount % 2 == 0)
    {
        if (fL.equalsIgnoreCase("A"))
        {
            return namePre[1];
        }
        else if (fL.equalsIgnoreCase("B"))
        {
            return namePre[3];
        }
        else if (fL.equalsIgnoreCase("C"))
        {
            return namePre[5];  
        }
        else if (fL.equalsIgnoreCase("D"))
        {
            return namePre[7];
        }
        else if (fL.equalsIgnoreCase("E"))
        {
            return namePre[9];
        }
        else if (fL.equalsIgnoreCase("F"))
        {
            return namePre[11];
        }
        else if (fL.equalsIgnoreCase("G"))
        {
            return namePre[13];
        }
        else if (fL.equalsIgnoreCase("H"))
        {
            return namePre[15];
        }
        else if (fL.equalsIgnoreCase("I"))
        {
            return namePre[17];
        }
        else if (fL.equalsIgnoreCase("J"))
        {
            return namePre[19];
        }
        else if (fL.equalsIgnoreCase("K"))
        {
            return namePre[21];
        }
        else if (fL.equalsIgnoreCase("L"))
        {
            return namePre[23];
        }
        else if (fL.equalsIgnoreCase("M"))
        {
            return namePre[25];
        }
        else if (fL.equalsIgnoreCase("N"))
        {
            return namePre[27];
        }
        else if (fL.equalsIgnoreCase("O"))
        {
            return namePre[29];
        }
        else if (fL.equalsIgnoreCase("P"))
        {
            return namePre[31];
        }
        else if (fL.equalsIgnoreCase("Q"))
        {
            return namePre[33];
        }
        else if (fL.equalsIgnoreCase("R"))
        {
            return namePre[35];
        }
        else if (fL.equalsIgnoreCase("S"))
        {
            return namePre[37];
        }
        else if (fL.equalsIgnoreCase("T"))
        {
            return namePre[39];
        }
        else if (fL.equalsIgnoreCase("U"))
        {
            return namePre[41];
        }
        else if (fL.equalsIgnoreCase("V"))
        {
            return namePre[43];
        }
        else if (fL.equalsIgnoreCase("W"))
        {
            return namePre[45];
        }
        else if (fL.equalsIgnoreCase("X"))
        {
            return namePre[47];
        }
        else if (fL.equalsIgnoreCase("Y"))
        {
            return namePre[49];
        }
        else if (fL.equalsIgnoreCase("Z"))
        {
            return namePre[51];
        }
    }
    else
    {
        if (fL.equalsIgnoreCase("A"))
        {
            return namePre[2];
        }
        else if (fL.equalsIgnoreCase("B"))
        {
            return namePre[4];
        }
        else if (fL.equalsIgnoreCase("C"))
        {
            return namePre[6];  
        }
        else if (fL.equalsIgnoreCase("D"))
        {
            return namePre[8];
        }
        else if (fL.equalsIgnoreCase("E"))
        {
            return namePre[10];
        }
        else if (fL.equalsIgnoreCase("F"))
        {
            return namePre[12];
        }
        else if (fL.equalsIgnoreCase("G"))
        {
            return namePre[14];
        }
        else if (fL.equalsIgnoreCase("H"))
        {
            return namePre[16];
        }
        else if (fL.equalsIgnoreCase("I"))
        {
            return namePre[18];
        }
        else if (fL.equalsIgnoreCase("J"))
        {
            return namePre[20];
        }
        else if (fL.equalsIgnoreCase("K"))
        {
            return namePre[22];
        }
        else if (fL.equalsIgnoreCase("L"))
        {
            return namePre[24];
        }
        else if (fL.equalsIgnoreCase("M"))
        {
            return namePre[26];
        }
        else if (fL.equalsIgnoreCase("N"))
        {
            return namePre[28];
        }
        else if (fL.equalsIgnoreCase("O"))
        {
            return namePre[30];
        }
        else if (fL.equalsIgnoreCase("P"))
        {
            return namePre[32];
        }
        else if (fL.equalsIgnoreCase("Q"))
        {
            return namePre[34];
        }
        else if (fL.equalsIgnoreCase("R"))
        {
            return namePre[36];
        }
        else if (fL.equalsIgnoreCase("S"))
        {
            return namePre[38];
        }
        else if (fL.equalsIgnoreCase("T"))
        {
            return namePre[40];
        }
        else if (fL.equalsIgnoreCase("U"))
        {
            return namePre[42];
        }
        else if (fL.equalsIgnoreCase("V"))
        {
            return namePre[44];
        }
        else if (fL.equalsIgnoreCase("W"))
        {
            return namePre[46];
        }
        else if (fL.equalsIgnoreCase("X"))
        {
            return namePre[48];
        }
        else if (fL.equalsIgnoreCase("Y"))
        {
            return namePre[50];
        }   
        else if (fL.equalsIgnoreCase("Z"))
        {
            return namePre[52];
        }  
    }
    return ""; 
}
public static String suffGet(String fN)
{
    String[] nameSuff;
    String fNN, fL;
    fNN = fN.trim();
    int fnCount = fNN.length();
    fL = String.valueOf(fNN.charAt(fNN.length()-1));
    nameSuff = new String[53];
    nameSuff[0] = "placeholder";
    nameSuff[1] = "ae";
    nameSuff[2] = "aith";
    nameSuff[3] = "brar";  
    nameSuff[4] = "bael";
    nameSuff[5] = "cael";
    nameSuff[6] = "con";
    nameSuff[7] = "drimme";
    nameSuff[8] = "dul";
    nameSuff[9] = "emar";
    nameSuff[10] = "evar";
    nameSuff[11] = "fel";
    nameSuff[12] = "faen";
    nameSuff[13] = "gael";
    nameSuff[14] = "gin";
    nameSuff[15] = "hal";
    nameSuff[16] = "har";
    nameSuff[17] = "ii";
    nameSuff[18] = "im";
    nameSuff[19] = "jin";
    nameSuff[20] = "jaal";
    nameSuff[21] = "ki";
    nameSuff[22] = "kas";
    nameSuff[23] = "lian";
    nameSuff[24] = "lihn";
    nameSuff[25] = "mah";
    nameSuff[26] = "'mek";
    nameSuff[27] = "nes";
    nameSuff[28] = "'nil";
    nameSuff[29] = "onna";
    nameSuff[30] = "oth";
    nameSuff[31] = "pae";
    nameSuff[32] = "pek";
    nameSuff[33] = "'que";
    nameSuff[34] = "quis";
    nameSuff[35] = "ruil";
    nameSuff[36] = "reth";
    nameSuff[37] = "san";
    nameSuff[38] = "sel";
    nameSuff[39] = "thal";
    nameSuff[40] = "thus";
    nameSuff[41] = "ual";
    nameSuff[42] = "uath";
    nameSuff[43] = "vain";
    nameSuff[44] = "vin";
    nameSuff[45] = "wyn";
    nameSuff[46] = "waal";
    nameSuff[47] = "'xe";
    nameSuff[48] = "'xol";
    nameSuff[49] = "yth";
    nameSuff[50] = "yl"; 
    nameSuff[51] = "zair";
    nameSuff[52] = "zara";

    if (fnCount % 2 != 0)
    {
        if (fL.equalsIgnoreCase("A"))
        {
            return nameSuff[1];
        }
        else if (fL.equalsIgnoreCase("B"))
        {
            return nameSuff[3];
        }
        else if (fL.equalsIgnoreCase("C"))
        {
            return nameSuff[5];  
        }
        else if (fL.equalsIgnoreCase("D"))
        {
            return nameSuff[7];
        }
        else if (fL.equalsIgnoreCase("E"))
        {
            return nameSuff[9];
        }
        else if (fL.equalsIgnoreCase("F"))
        {
            return nameSuff[11];
        }
        else if (fL.equalsIgnoreCase("G"))
        {
            return nameSuff[13];
        }
        else if (fL.equalsIgnoreCase("H"))
        {
            return nameSuff[15];
        }
        else if (fL.equalsIgnoreCase("I"))
        {
            return nameSuff[17];
        }
        else if (fL.equalsIgnoreCase("J"))
        {
            return nameSuff[19];
        }
        else if (fL.equalsIgnoreCase("K"))
        {
            return nameSuff[21];
        }
        else if (fL.equalsIgnoreCase("L"))
        {
            return nameSuff[23];
        }
        else if (fL.equalsIgnoreCase("M"))
        {
            return nameSuff[25];
        }
        else if (fL.equalsIgnoreCase("N"))
        {
            return nameSuff[27];
        }
        else if (fL.equalsIgnoreCase("O"))
        {
            return nameSuff[29];
        }
        else if (fL.equalsIgnoreCase("P"))
        {
            return nameSuff[31];
        }
        else if (fL.equalsIgnoreCase("Q"))
        {
            return nameSuff[33];
        }
        else if (fL.equalsIgnoreCase("R"))
        {
            return nameSuff[35];
        }
        else if (fL.equalsIgnoreCase("S"))
        {
            return nameSuff[37];
        }
        else if (fL.equalsIgnoreCase("T"))
        {
            return nameSuff[39];
        }
        else if (fL.equalsIgnoreCase("U"))
        {
            return nameSuff[41];
        }
        else if (fL.equalsIgnoreCase("V"))
        {
            return nameSuff[43];
        }
        else if (fL.equalsIgnoreCase("W"))
        {
            return nameSuff[45];
        }
        else if (fL.equalsIgnoreCase("X"))
        {
            return nameSuff[47];
        }
        else if (fL.equalsIgnoreCase("Y"))
        {
            return nameSuff[49];
        }
        else if (fL.equalsIgnoreCase("Z"))
        {
            return nameSuff[51];
        }
    }
    else
    {
        if (fL.equalsIgnoreCase("A"))
        {
            return nameSuff[2];
        }
        else if (fL.equalsIgnoreCase("B"))
        {
            return nameSuff[4];
        }
        else if (fL.equalsIgnoreCase("C"))
        {
            return nameSuff[6];  
        }
        else if (fL.equalsIgnoreCase("D"))
        {
            return nameSuff[8];
        }
        else if (fL.equalsIgnoreCase("E"))
        {
            return nameSuff[10];
        }
        else if (fL.equalsIgnoreCase("F"))
        {
            return nameSuff[12];
        }
        else if (fL.equalsIgnoreCase("G"))
        {
            return nameSuff[14];
        }
        else if (fL.equalsIgnoreCase("H"))
        {
            return nameSuff[16];
        }
        else if (fL.equalsIgnoreCase("I"))
        {
            return nameSuff[18];
        }
        else if (fL.equalsIgnoreCase("J"))
        {
            return nameSuff[20];
        }
        else if (fL.equalsIgnoreCase("K"))
        {
            return nameSuff[22];
        }
        else if (fL.equalsIgnoreCase("L"))
        {
            return nameSuff[24];
        }
        else if (fL.equalsIgnoreCase("M"))
        {
            return nameSuff[26];
        }
        else if (fL.equalsIgnoreCase("N"))
        {
            return nameSuff[28];
        }
        else if (fL.equalsIgnoreCase("O"))
        {
            return nameSuff[30];
        }
        else if (fL.equalsIgnoreCase("P"))
        {
            return nameSuff[32];
        }
        else if (fL.equalsIgnoreCase("Q"))
        {
            return nameSuff[34];
        }
        else if (fL.equalsIgnoreCase("R"))
        {
            return nameSuff[36];
        }
        else if (fL.equalsIgnoreCase("S"))
        {
            return nameSuff[38];
        }
        else if (fL.equalsIgnoreCase("T"))
        {
            return nameSuff[40];
        }
        else if (fL.equalsIgnoreCase("U"))
        {
            return nameSuff[42];
        }
        else if (fL.equalsIgnoreCase("V"))
        {
            return nameSuff[44];
        }
        else if (fL.equalsIgnoreCase("W"))
        {
            return nameSuff[46];
        }
        else if (fL.equalsIgnoreCase("X"))
        {
            return nameSuff[48];
        }
        else if (fL.equalsIgnoreCase("Y"))
        {
            return nameSuff[50];
        }
        else if (fL.equalsIgnoreCase("Z"))
        {
            return nameSuff[52];
        }  
        return "";
    }
    return "";
}

4 个答案:

答案 0 :(得分:1)

使用Map的实现。设键是字母表中的字母,值是您当前存储在namePre数组中的值。这种方法还可以让您省去阵列,因为您的Map可以作为存储和检索的一种手段。

以preGet方法为例。而不是编写所有这些条件,你可以以更紧凑的方式实现相同的目标,如下所示:

firstEvenPre = new HashMap<String, String>();

// some code to load up your prefixes

public static String preGet(String fN)
{
    String[] namePre;
    String fNN, fL;
    fNN = fN.trim();
    int fnCount = fNN.length();
    fL = String.valueOf(fNN.charAt(0));

    return (String)firstEvenPre.get(fL);
}

在尝试代码时使用一些自由裁量权,我没有测试它,我最近一直在写Ruby,所以我可能会有一些大脑迷雾。

答案 1 :(得分:0)

回顾答案后,每个人似乎都是对的,转换声明可能不是最佳解决方案,因为它会有所帮助。

但是你可以使用一个map,它基本上是一个采用键值对的数据结构。您可以将两组if语句和初始声明减少为:

public static String preGet(String fN)
{
    HashMap<String, String> namePre = new HashMap<String, String>();
    String fNN, fL;
    fNN = fN.trim();
    fL = String.valueOf(fNN.charAt(0));
    String[] names = {"Ael", "Aer", "Bael", "Bes", "Cael", "Cor", "Dae", "Dre", "Eil", "Ev", "Fir", "Fis", "Gael", "Gil", "Ha", "Hu", "Ia", "Il", "Ja", "Jar", "Kan", "Kor", "La", "Lue", "Mai", "Mara", "Na", "Nim", "Ol", "Onn", "Py", "Pael", "Qu", "Qi", "Rum", "Rua", "Sae", "Sha", "Tahl", "Thro", "Ul", "Uon", "Ver", "Vil", "Wuo", "Waal", "Xae", "Xen", "Ya", "Yae", "Za", "Zy"};

    for (int i=0; i <26; i++){
        namePre.put(String.valueof((char)((i+64))), names[i]);
    }
    if (namePre.count(fN)){
        return namePre.get(fN);
    }
    return "";
}

答案 2 :(得分:0)

巨大的if - else可以表示为

int translation = 2 * (fNN.toUpper().charAt(0) - 'A');

if (fnCount % 2 == 0) {
    return nameStuff[ 1 + translation ];
} else {
    return nameStuff[ 2 + translation ];
}

我的大脑的数学方面现在有点过分,所以让我知道这里是否有一些错误。但这应该可行。

虽然这是一个hacky和难以理解的代码(记得对这个代码进行评论),但我认为将50行代码减少到5代就可以了。

答案 3 :(得分:0)

String fNN, fL;
fNN = fN.trim();
int fnCount = fNN.length();
fL = String.valueOf(fNN.charAt(fNN.length()-1));

可以替换为

fN = fN.trim();
char fL = fN.charAt(fN.length()-1);

然后你可以使用字母的ASCII码来确定数组索引应该是什么

fN = fN.trim();
char fL = fN.charAt(fN.length()-1);

String[] suffixOdd = {"aith", "bael", "con", "dul", "evar", "faen", "gin", "har", "im", "jaal", "kas", "lihn", "'mek", "'nil", "oth", "pek", "quis", "reth", "sel", "thus", "uath", "vin", "waal", "'xol", "yl", "zara"};
String[] suffixEven = {"ae", "brar", "cael", "drimme", "emar", "fel", "gael", "hal", "ii", "jin", "ki", "lian", "mah", "nes", "onna", "pae", "'que", "ruil", "san", "thal", "ual", "vain", "wyn", "'xe", "yth", "zair"};

int suffixIndex = Character.toUpperCase(fL) - 'A';
if (fN.length() % 2 != 0)
{
    if(suffixIndex >= suffixOdd.length)
        return "";
    return suffixOdd[Character.toUpperCase(fL) - 'A'];
}
else
{
    if(suffixIndex >= suffixEven.length)
        return "";
    return suffixEven[Character.toUpperCase(fL) - 'A'];
}

在这种情况下,你的后缀偶数和奇数都是26长,因为我应该将长度检查放在每个相应的代码块中。

PS:我强烈建议您输入更多描述性变量名称fNfLlastPre等...是坏名字,我不知道他们是什么是。未来你会感谢你。