【问题标题】:No errors just simplifying code没有错误只是简化代码
【发布时间】:2015-12-08 12:42:03
【问题描述】:
if (user.substring(0, 1).equals("1")) 
{
    if(FirstInt.substring(0,1).equals("0"))
        permissionFor0=permissionFor0+"-";
    else if (FirstInt.substring(0,1).equals("1"))
        permissionFor0=permissionFor0+"r";
    if(FirstInt.substring(1,2).equals("0"))
        permissionFor0=permissionFor0+"-";
    else if (FirstInt.substring(1,2).equals("1"))
        permissionFor0=permissionFor0+"w";
    if(FirstInt.substring(2,3).equals("0"))
        permissionFor0=permissionFor0+"-";
    else if (FirstInt.substring(2,3).equals("1"))
        permissionFor0=permissionFor0+"s";
    System.out.print (permissionFor0+" ");
    if(SecondInt.substring(0,1).equals("0"))
        permissionFor1=permissionFor1+"-";
    else if (SecondInt.substring(0,1).equals("1"))
        permissionFor1=permissionFor1+"r";
    if(SecondInt.substring(1,2).equals("0"))
        permissionFor1=permissionFor1+"-";
    else if (SecondInt.substring(1,2).equals("1"))
        permissionFor1=permissionFor1+"w";
    if(SecondInt.substring(2,3).equals("0"))
        permissionFor1=permissionFor1+"-";
    else if (SecondInt.substring(2,3).equals("1"))
        permissionFor1=permissionFor1+"x";
    System.out.print (permissionFor1+" ");
    if(ThirdInt.substring(0,1).equals("0"))
        permissionFor2=permissionFor2+"-";
    else if (ThirdInt.substring(0,1).equals("1"))
        permissionFor2=permissionFor2+"r";
    if(ThirdInt.substring(1,2).equals("0"))
        permissionFor2=permissionFor2+"-";
    else if (ThirdInt.substring(1,2).equals("1"))
        permissionFor2=permissionFor2+"w";
    if(ThirdInt.substring(2,3).equals("0"))
        permissionFor2=permissionFor2+"-\n";
    else if (ThirdInt.substring(2,3).equals("1"))
        permissionFor2=permissionFor2+"x";
    System.out.print (permissionFor2+"\n");
}

谁能帮我简化这段代码,让它不那么大。我知道它看起来像是硬编码的。这是我的代码的一部分,我不得不复制和粘贴四次,它使代码看起来很庞大而且不是很好。我试图看看是否可以将它放入一些 for 循环中,但我没有想出什么特别的东西。

【问题讨论】:

  • 应该以命名约定开头。
  • 使用循环,并将其放入迭代中。使用 index 和 index+1 作为值,而不是 (0.1),(1.2), ...
  • @Stultuske 但是我怎样才能让字母在循环中发生变化?
  • @AustinClark 为什么这种逻辑会改变?
  • 这个问题可能更适合Code Review Community of Stack Exchange

标签: java


【解决方案1】:

就像Stultuske 已经说过的,你可以简单地把它放在一个循环中。我的建议是将这些变量中的大部分放入数组(或列表,这就是它对您的工作方式):

String[] theInt = new String[]{"", "", ""};
String[] permissionFor = new String[]{"", "", ""};
String[] permissions = new String[]{"r", "w", "x"};

然后你可以像这样简单地使用它们:

    if (user.substring(0, 1).equals("1")) {
        for ( int n = 0; n < theInt.length; n++ ) {
            for (int i = 0; i <= 3; i++) {
                if (theInt[n].substring(i, i + 1).equals("0")) {
                    permissionFor[n] += "-";
                } else if (FirstInt.substring(i, i + 1).equals("1")) {
                    permissionFor[n] += permissions[i];
                }
            }
            System.out.println(permissionFor[n] + " ");
        }
    }

或者您甚至可以使用switch 代替if else 以获得更好的可读性:

switch (theInt[n].substring(i, i + 1)) {
    case "0": permissionFor[n] += "-"; break;
    case "1": permissionFor[n] += permissions[i];break;
}

【讨论】:

    【解决方案2】:

    我应该这样写一个转换方法:

    public String convert(String iPermission, String mask, char falseCharacter){
        String res = "";
            for(int i = 0; i < iPermission.length(); i++)
                if(iPermission.charAt(i) == '1')
                    res += mask.charAt(i);
                else if(iPermission.charAt(i) == '0')
                    res += falseCharacter;
        return res;
    }
    

    那么你可以这样使用它:

    if(user.substring(0, 1).equals("1"))
    {
        permissionFor0 = convert(FirstInt, "rws", '-');
        permissionFor1 = convert(SecondInt, "rwx", '-');
        permissionFor2 = convert(ThirdInt, "rwx", '-');
    
        System.out.println(permissionFor0 + " "
            + permissionFor1 + " " + permissionFor2);
    }     
    

    【讨论】:

      【解决方案3】:

      你可以重写这个:

          FirstInt.substring(0,1).equals("0")
      

      作为

          FirstInt.charAt(0) == '0'
      

      然后你可以重写

          permissionFor0=permissionFor0+"-";
      

      作为

          permissionFor0 += "-";
      

      然后你可以识别出一些清晰的重复;例如你有一个看起来像 FirstIntSecondIntThirdInt 的块。你可以像这样声明一个整数数组。

          String[] ints = new String[] {FirstInt, SecondInt, ThirdInt};
      

      然后使用for (i = 0; i &lt; 3; i++) 循环替换剪切和粘贴重复。或者使循环体成为您以FirstIntSecondIntThirdInt 作为参数调用的方法。

      等等。


      如果您(小心地)对您的代码进行一系列重写,每一次都应用一些简单的重构“转换”,这并不难。

      【讨论】:

        【解决方案4】:

        我会使用类似的东西:

        function getPermissions(s, permissions) {
            var i, r = '';
            for (i = 0; i < 3; i++) {
                if (s[i] === '0') {
                    r += '-';
                    continue;
                }
                if (s[i] === '1') {
                    r += permissions[i];
                }
            }
            return r;
        }
        
        // call
        getPermissions('001', 'rws')
        

        如果数据库可以更好地呈现,也许可以写得更短一些。例如,如果我们可以跳过'0',只使用'1'

        function getPermissions(s, permissions) {
            var i, r = '';
            for (i = 0; i < 3; i++) {
                r += s[i] === '1' ? permissions[i] : '-';
            }
            return r;
        }
        
        // call
        getPermissions('111', 'rwx')
        

        或者更短一点:

        function getPermissions(s, permissions) {
            return permissions.split('').map(function (a, i) {
                return s[i] === '1' ? a : '-';
            }).join('');
        }
        
        // call
        document.write(getPermissions('001', 'rwx'));

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-20
          • 1970-01-01
          • 2020-11-10
          • 1970-01-01
          • 2019-04-03
          • 1970-01-01
          • 2014-04-01
          • 1970-01-01
          相关资源
          最近更新 更多