CleanCode TIL (2022.02.24)

Henry Choยท2022๋…„ 2์›” 24์ผ
0

๋…ธ๊ฐœ๋ถ

๋ชฉ๋ก ๋ณด๊ธฐ
30/31

DAY 31

๐Ÿ”–ย ์˜ค๋Š˜ ์ฝ์€ ๋ฒ”์œ„ : 15. JUnit ๋“ค์—ฌ๋‹ค๋ณด๊ธฐ(324~334p)


๐Ÿค“ย ์ฑ…์—์„œ ๊ธฐ์–ตํ•˜๊ณ  ์‹ถ์€ ๋‚ด์šฉ

JUnit ํ”„๋ ˆ์ž„์›Œํฌ

  • ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ๊ฐ€์žฅ ์œ ๋ช…ํ•œ JUnit์˜ ์‹ค์ œ ๋‚ด๋ถ€ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์™€ ํ‰๊ฐ€ํ•ด๋ณด์ž
package junit.framework;
public class ComparisonCompactor {
    private static final String ELLIPSIS = "...";
    private static final String DELTA_END = "]";
    private static final String DELTA_START = "[";
    private int fContextLength;
    private String fExpected;
    private String fActual;
    private int fPrefix;
    private int fSuffix;
    public ComparisonCompactor(int contextLength, String expected, String actual) {
        fContextLength = contextLength;
        fExpected = expected;
        fActual = actual;
    }
    public String compact(String message) {
        if (fExpected == null || fActual == null || areStringsEqual()) return Assert.format(message, fExpected, fActual);
        findCommonPrefix();
        findCommonSuffix();
        String expected = compactString(fExpected);
        String actual = compactString(fActual);
        return Assert.format(message, expected, actual);
    }
    private String compactString(String source) {
        String result = DELTA_START +
            source.substring(fPrefix, source.length()โ€“ fSuffix + 1) + DELTA_END;
        if (fPrefix > 0)
            result = computeCommonPrefix() + result;
        if (fSuffix > 0)
            result = result + computeCommonSuffix();
        return result;
    }
    private void findCommonPrefix() {
        fPrefix = 0;
        int end = Math.min(fExpected.length(), fActual.length());
        for (; fPrefix < end; fPrefix++) {
            if (fExpected.charAt(fPrefix) != fActual.charAt(fPrefix))
                break;
        }
    }
    private void findCommonSuffix() {
        int expectedSuffix = fExpected.length() - 1;
        int actualSuffix = fActual.length() - 1;
        for (; actualSuffix >= fPrefix && expectedSuffix >= fPrefix; actualSuffix--, expectedSuffix--) {
            if (fExpected.charAt(expectedSuffix) != fActual.charAt(actualSuffix)) break;
        }
        fSuffix = fExpected.length() - expectedSuffix;
    }
    private String computeCommonPrefix() {
        return (fPrefix > fContextLength ? ELLIPSIS : "") + fExpected.substring(Math.max(0, fPrefix - fContextLength),
            fPrefix);
        private String computeCommonSuffix() {
            int end = Math.min(fExpected.length() - fSuffix + 1 + fContextLength,
                fExpected.length());
            return fExpected.substring(fExpected.length() - fSuffix + 1, end) +
                (fExpected.length() - fSuffix + 1 < fExpected.length()โ€“ fContextLength ? ELLIPSIS : "");
        }
        private boolean areStringsEqual() {
            return fExpected.equals(fActual);
        }
    }
}
  • ๋ณด์ด์Šค์นด์šฐํŠธ ๊ทœ์น™์— ๋”ฐ๋ผ ์ฒ˜์Œ ์™”์„๋•Œ ๋ณด๋‹ค ๋” ๊นจ๋—ํ•˜๊ฒŒ ํ•ด๋†“๊ณ  ๋– ๋‚˜์•ผ ํ•œ๋‹ค
  1. ๋ฉค๋ฒ„ ๋ณ€์ˆ˜ ์•ž์— ๋ถ™์ธ ์ ‘๋‘์–ด f โ†’ ๋ชจ๋‘ ์ œ๊ฑฐ

    • ์˜ค๋Š˜๋‚  ํ™˜๊ฒฝ์—์„œ๋Š” ๋ณ€์ˆ˜์ด๋ฆ„์— ๋ฒ”์œ„๋ฅผ ๋ช…์‹œํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค
  2. compact ํ•จ์ˆ˜ ์‹œ์ž‘๋ถ€์— ์บก์Šํ™” ๋˜์ง€์•Š์€ ์กฐ๊ฑด๋ฌธ

    • ์˜๋„๋ฅผ ๋ช…ํ™•ํžˆ ํ‘œํ˜„ํ•˜๋ ค๋ฉด ์กฐ๊ฑด๋ฌธ์„ ์บก์Šํ™” โ†’ ๋ฉ”์„œ๋“œ๋กœ ๋ถ„๋ฆฌ
    public String compact(String message) {
        if (shouldNotCompact())
            return Assert.format(message, expected, actual);
        findCommonPrefix();
        findCommonSuffix();
        String expected = compactString(this.expected);
        String actual = compactString(this.actual);
        return Assert.format(message, expected, actual);
    }
    private boolean shouldNotCompact() {
        return expected == null || actual == null || areStringsEqual();
    }
  3. compact ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” this.expected, this.actual

    • ํ•จ์ˆ˜์— ์ด๋ฏธ expected ๋ผ๋Š” local var ์žˆ๋Š”๋ฐ fExpected์—์„œ f ๋นผ๋ฉด์„œ ์ค‘๋ณต ๋ฌธ์ œ ๋ฐœ์ƒ
    • ํ•จ์ˆ˜์—์„œ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์™€ ์ด๋ฆ„์ด ๋˜‘๊ฐ™์€ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ โ†’ ์„œ๋กœ ๋‹ค๋ฅธ์˜๋ฏธ์ž„
      String compactExpected = compactString(expected); 
      String compactActual = compactString(actual);
  4. ๋ถ€์ •๋ฌธ์€ ๊ธ์ •๋ฌธ๋ณด๋‹ค ์ดํ•ดํ•˜๊ธฐ ์•ฝ๊ฐ„ ๋” ์–ด๋ ต๋‹ค

    • ์ฒซ if ๋ฌธ์„ ๊ธ์ •์œผ๋กœ ๋งŒ๋“ค์–ด ์กฐ๊ฑด๋ฌธ์„ ๋ฐ˜์ „
    public String compact(String message) {
        if (canBeCompacted()) {
            findCommonPrefix();
            findCommonSuffix();
            String compactExpected = compactString(expected);
            String compactActual = compactString(actual);
            return Assert.format(message, compactExpected, compactActual);
        } else {
            return Assert.format(message, expected, actual);
        }
    }
    private boolean canBeCompacted() {
        return expected != null && actual != null && !areStringsEqual();
    }
  5. ํ•จ์ˆ˜ ์ด๋ฆ„์ด ์ด์ƒํ•˜๋‹ค

    • compact ๋ผ๋Š”์ด๋ฆ„? canBeCompated ๊ฐ€ false ์ด๋ฉด ์••์ถ•ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์˜ค๋ฅ˜ ์ ๊ฒ€์ด๋ผ๋Š” ๋ถ€๊ฐ€ ๋‹จ๊ณ„๊ฐ€ ์ˆจ๊ฒจ์ง„๋‹ค
    • ๋˜ํ•œ ํ•จ์ˆ˜๋Š” ๋‹จ์ˆœํžˆ ์••์ถ•๋œ ๋ฌธ์ž์—ด์ด ์•„๋‹Œ ํ˜•์‹์ด ๊ฐ–์ถฐ์ง„ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜
    • formatCompactedComparison ์ด๋ผ๋Š” ์ด๋ฆ„์ด ์ ํ•ฉ
  6. if ๋ฌธ ์•ˆ์—์„œ๋Š” ์˜ˆ์ƒ ๋ฌธ์ž์—ด๊ณผ ์‹ค์ œ ๋ฌธ์ž์—ด์„ ์ง„์งœ๋กœ ์••์ถ•

    • ํ•ด๋‹น ๋ถ€๋ถ„์„ ๋นผ๋‚ด compactExpectedAndActual ์ด๋ผ๋Š” ๋ฉ”์„œ๋“œ๋กœ ๋ถ„๋ฆฌ, ์••์ถ•๋งŒ ์ˆ˜ํ–‰
    • ํ˜•์‹ ๋งž์ถ”๋Š” ์ž‘์—…์€ formatCompactedComparison์— ๋งก๊น€
    ...
    private String compactExpected;
    private String compactActual;
    ...
    public String formatCompactedComparison(String message) {
        if (canBeCompacted()) {
            compactExpectedAndActual();
            return Assert.format(message, compactExpected, compactActual);
        } else {
            return Assert.format(message, expected, actual);
        }
    }
    private void compactExpectedAndActual() {
        findCommonPrefix();
        findCommonSuffix();
        compactExpected = compactString(expected);
        compactActual = compactString(actual);
    }
    • compactExpected์™€ compactActual์ด ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋กœ ์Šน๊ฒฉํ–ˆ๋‹ค
      • ๋ฉค๋ฒ„๋ณ€์ˆ˜๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ˜•์‹์„ ๋งž์ถ”๊ธฐ์œ„ํ•ด findCommonPrefix,Suffix๋กœ ๋ฆฌํ„ด๊ฐ’์„ ๋งŒ๋“ค์–ด์ค€๋‹ค
    private void compactExpectedAndActual() {
        prefixIndex = findCommonPrefix();
        suffixIndex = findCommonSuffix();
        compactExpected = compactString(expected);
        compactActual = compactString(actual);
    }
    
    private int findCommonPrefix() {
        int prefixIndex = 0;
        int end = Math.min(expected.length(), actual.length());
        for (; prefixIndex < end; prefixIndex++) {
            if (expected.charAt(prefixIndex) != actual.charAt(prefixIndex)) break;
        }
        return prefixIndex;
    }
    
    private int findCommonSuffix() {
        int expectedSuffix = expected.length() - 1;
        int actualSuffix = actual.length() - 1;
        for (; actualSuffix >= prefixIndex && expectedSuffix >= prefixIndex; actualSuffix--, expectedSuffix--) {
            if (expected.charAt(expectedSuffix) != actual.charAt(actualSuffix))
                break;
        }
        return expected.length() - expectedSuffix;
    }
    

๐Ÿค”ย ๋– ์˜ค๋ฅด๋Š” ์ƒ๊ฐ

๐Ÿ”Žย ์งˆ๋ฌธ

๐Ÿ“ย ์†Œ๊ฐ 3์ค„ ์š”์•ฝ

  • ์˜๋„๋ฅผ ๋ช…ํ™•ํžˆ ํ‘œํ˜„ํ•˜๋ ค๋ฉด ์กฐ๊ฑด๋ฌธ์„ ์บก์Šํ™” โ†’ ๋ฉ”์„œ๋“œ๋กœ ๋ถ„๋ฆฌ
  • ๋ถ€์ •๋ฌธ์€ ๊ธ์ •๋ฌธ๋ณด๋‹ค ์ดํ•ดํ•˜๊ธฐ ์•ฝ๊ฐ„ ๋” ์–ด๋ ต๋‹ค
  • ํ•จ์ˆ˜๋ช…์ด ๋‚ด์šฉ์„ ๋ชจ๋‘ ๊ธฐ์ˆ ํ•˜์ง€ ๋ชปํ•˜๋ฉด ์ด๋ฆ„์„ ๋ฐ”๊พธ๊ณ  ๊ทธ๋ž˜๋„ ๋ถ€์กฑํ•˜๋ฉด ์—ญํ•  ๋ถ„๋ฆฌ
profile
Full stack tech visionary

0๊ฐœ์˜ ๋Œ“๊ธ€