簡體   English   中英

如何改進重復代碼

[英]How to Improve a repetitive Code

我正在嘗試以3種顏色組合打開和關閉20個燈的設置

組合變成紅色綠色白色

RGW RGW RGW RGW RGW RGW RG

目前,我已經為重復序列進行了硬編碼,但是想知道如何改進它。 (PS開始學習JAVA的旅程)。

我想知道為了縮短這段代碼我可以學習使用什么方法或實踐。

     if ( Num == 1){
        System.out.println("RED is On");//1
        TimeUnit.MILLISECONDS.sleep(500);
        System.out.println("Red is Off");

        System.out.println("Green is On");//2
        TimeUnit.MILLISECONDS.sleep(500);
        System.out.println("Green is Off");

        System.out.println("White is On");//3
        TimeUnit.MILLISECONDS.sleep(500);
        System.out.println("White is OFF");

        System.out.println("RED is On");//4
        TimeUnit.MILLISECONDS.sleep(500);
        System.out.println("Red is Off");

        System.out.println("Green is On");//5
        TimeUnit.MILLISECONDS.sleep(500);
        System.out.println("Green is Off");

        System.out.println("White is On");//6
        TimeUnit.MILLISECONDS.sleep(500);
        System.out.println("White is OFF");

        System.out.println("RED is On");//7
        TimeUnit.MILLISECONDS.sleep(500);
        System.out.println("Red is Off");

        System.out.println("Green is On");//8
        TimeUnit.MILLISECONDS.sleep(500);
        System.out.println("Green is Off");

        System.out.println("White is On");//9
        TimeUnit.MILLISECONDS.sleep(500);
        System.out.println("White is OFF");

        System.out.println("RED is On");//10
        TimeUnit.MILLISECONDS.sleep(500);
        System.out.println("Red is Off");

        System.out.println("Green is On");//11
        TimeUnit.MILLISECONDS.sleep(500);
        System.out.println("Green is Off");

        System.out.println("White is On");//12
        TimeUnit.MILLISECONDS.sleep(500);
        System.out.println("White is OFF");

        System.out.println("RED is On");//13
        TimeUnit.MILLISECONDS.sleep(500);
        System.out.println("Red is Off");

        System.out.println("Green is On");//14
        TimeUnit.MILLISECONDS.sleep(500);
        System.out.println("Green is Off");

        System.out.println("White is On");//15
        TimeUnit.MILLISECONDS.sleep(500);
        System.out.println("White is OFF");

        System.out.println("RED is On");//16
        TimeUnit.MILLISECONDS.sleep(500);
        System.out.println("Red is Off");

        System.out.println("Green is On");//17
        TimeUnit.MILLISECONDS.sleep(500);
        System.out.println("Green is Off");

        System.out.println("White is On");//18
        TimeUnit.MILLISECONDS.sleep(500);
        System.out.println("White is OFF");

        System.out.println("RED is On");//19
        TimeUnit.MILLISECONDS.sleep(500);
        System.out.println("Red is Off");

        System.out.println("Green is On");//20
        TimeUnit.MILLISECONDS.sleep(500);
        System.out.println("Green is Off");

    } 

這是在無限循環中執行此操作的眾多可能性之一:

String[] color = new String[]{"Red", "Green", "White"};
int counter = 0;
while (true) {
    System.out.println(color[counter] + " is On");
    TimeUnit.MILLISECONDS.sleep(500);
    System.out.println(color[counter] + " is Off");

    counter++;

    if (counter > 2) {
        counter = 0;
    }
}

這里有兩種重復性:

  1. 您重復幾乎相同的代碼,但有一點改動(顏色)
  2. 后來你重復的代碼塊准確 ,一遍又一遍

(1)的解決方案是將重復的代碼提取到一個方法中,並將更改的元素作為參數傳入:

 private void flash(String color) {
    System.out.println(color + " is On");
    TimeUnit.MILLISECONDS.sleep(500);
    System.out.println(color + " is Off");
 }

然后根據需要調用它:

 flash("Green");
 flash("RED");
 flash("White");
 // etc.

(2)的解決方案是使用循環來表達重復。

您的代碼似乎重復紅綠白,因此您可以在for循環中調用flash()

 for(int i=0; i<5; i++) {   // 5 picked arbitrarily
     flash("RED");
     flash("Green");
     flash("White");
 }

您甚至可以將循環放入循環中:

 List<String> colors = Arrays.asList("RED", "Green", White");
 for(int i=0; i<5; i++) {   // 5 picked arbitrarily
     for(String color : colors) {
         flash(color);
     }
 }

您可以將字符串“ colors”作為參數傳遞給blinker(),以使其可重用。 根據代碼頂部的條件,我假設您將有多個模式可以閃爍。 在這種情況下,請為每個模式定義一個單獨的字符串“ colors”,並在請求該模式后將其饋送到blinker()。 您的代碼既可讀又易於維護。

public void blinker() {


    String colors = "GWB GWB GWB GW GW GWWWW GWBB BWG";


    for (char c : colors.toCharArray()) {
        String colorName;
        switch (c) {
            case 'G':
                colorName = "GREEN";
                break;
            case 'W':
                colorName = "WHITE";
                break;
            case 'B':
                colorName = "BLUE";
                break;
            case ' ':
                continue;
            default:
                System.err.println("Unknown color: " + c);
                continue;
        }
        try {
            doBlink(colorName, 500);
        } catch (Exception ignore) {}
    }

}

public void doBlink(String color, long duration) throws InterruptedException {
    System.out.println(String.format("%s is On", color));
    TimeUnit.MILLISECONDS.sleep(duration);
    System.out.println(String.format("%s is Off", color));
}

輸出看起來像:

GREEN is On
GREEN is Off
WHITE is On
WHITE is Off
BLUE is On
BLUE is Off
GREEN is On
...

只是添加一個:

import java.util.concurrent.TimeUnit;
import java.util.stream.IntStream;

public class Test{
    public static void main(String [] args){        
        IntStream.rangeClosed(1, 20).forEach(i->{
            try {
                onOff(i);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
        });        
    }

    private static void onOff(int i) throws InterruptedException {
        String color = getColor(i);
        System.out.println(color+" is On");
        TimeUnit.MILLISECONDS.sleep(500);
        System.out.println(color+" is Off");
    }

    private static String getColor(int i) {
        return i%3 == 1? "RED": i%3 == 2? "Green" : "White";
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM