CleanCode TIL (2022.02.17)

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

๋…ธ๊ฐœ๋ถ

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

DAY 25

๐Ÿ”–ย ์˜ค๋Š˜ ์ฝ์€ ๋ฒ”์œ„ : 12. ์ฐฝ๋ฐœ์„ฑ(216~223p)


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

์ฐฝ๋ฐœ์  ์„ค๊ณ„๋กœ ๊น”๋”ํ•œ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์ž

๋‹จ์ˆœํ•œ ์„ค๊ณ„ ๊ทœ์น™ 1: ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ผ

  • ์„ค๊ณ„๋Š” ์˜๋„ํ•œ ๋Œ€๋กœ ๋Œ์•„๊ฐ€๋Š” ์‹œ์Šคํ…œ์„ ๋‚ด๋†“์•„์•ผ ํ•œ๋‹ค
  • SRP๋ฅผ ์ค€์ˆ˜ํ•˜๋Š” ํด๋ž˜์Šค๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ํ›จ์”ฌ ๋” ์‰ฝ๋‹ค
  • DIP, DI, ์ธํ„ฐํŽ˜์ด์Šค, ์ถ”์ƒํ™” ๋ฅผ ์‚ฌ์šฉํ•ด ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถฐ์•ผ ํ…Œ์ŠคํŠธ๊ฐ€ ์‰ฝ๋‹ค
  • ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์žˆ์œผ๋‹ˆ๊นŒ ์ฝ”๋“œ๋ฅผ ์ •๋ฆฌ

๋‹จ์ˆœํ•œ ์„ค๊ณ„ ๊ทœ์น™ 2: ์ค‘๋ณต์„ ์—†์• ๋ผ

  • ๋น„์Šทํ•œ ์ฝ”๋“œ๋Š” ๋” ๋น„์Šทํ•˜๊ฒŒ ๊ณ ์ณ์ค€๋‹ค
  • ๊ตฌํ˜„์ค‘๋ณต์„ ์ค„์—ฌ๋ผ
    int size() {}
    boolean isEmpty() { 
    	return 0 == size();
    }
  • ๋‹จ ๋ช‡์ค„์ด๋ผ๋„ ์ค‘๋ณต ์ œ๊ฑฐ
    public void scaleToOneDimension(
        float desiredDimension, float imageDimension) {
        if (Math.abs(desiredDimension - imageDimension) < errorThreshold) return;
        float scalingFactor = desiredDimension / imageDimension;
        scalingFactor = (float)(Math.floor(scalingFactor * 100) * 0.01 f);
        RenderedOp newImage = ImageUtilities.getScaledImage(image, scalingFactor, scalingFactor);
        image.dispose();
        System.gc();
        image = newImage;
    }
    
    public synchronized void rotate(int degrees) {
        RenderedOp newImage = ImageUtilities.getRotatedImage(image, degrees);
        image.dispose();
        System.gc();
        image = newImage;
    }
    • scaleToOneDimension ๋ฉ”์„œ๋“œ์™€ rotate ๋ฉ”์„œ๋“œ๊ฐ€ ์ผ๋ถ€ ์ค‘๋ณต

      public void scaleToOneDimension(
          float desiredDimension, float imageDimension) {
          if (Math.abs(desiredDimension - imageDimension) < errorThreshold) return;
          float scalingFactor = desiredDimension / imageDimension;
          scalingFactor = (float)(Math.floor(scalingFactor * 100) * 0.01 f);
          replaceImage(ImageUtilities.getScaledImage(image, scalingFactor, scalingFactor));
      }
      public synchronized void rotate(int degrees) {
          replaceImage(ImageUtilities.getRotatedImage(image, degrees));
      }
      private void replaceImage(RenderedOp newImage) {
          image.dispose();
          System.gc();
          image = newImage;
      }

Template method ํŒจํ„ด

  • ๊ณ ์ฐจ์› ์ค‘๋ณต์„ ์ œ๊ฑฐํ•  ๋ชฉ์ ์œผ๋กœ ์ž์ฃผ ์‚ฌ์šฉ
public class VacationPolicy {
    public void accrueUSDivisionVacation() {
        // ์ง€๊ธˆ๊นŒ์ง€ ๊ทผ๋ฌดํ•œ ์‹œ๊ฐ„์„ ๋ฐ”ํƒ•์œผ๋กœ ํœด๊ฐ€ ์ผ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ์ฝ”๋“œ // ...
        // ํœด๊ฐ€ ์ผ์ˆ˜๊ฐ€ ๋ฏธ๊ตญ ์ตœ์†Œ ๋ฒ•์ • ์ผ์ˆ˜๋ฅผ ๋งŒ์กฑํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์ฝ”๋“œ // ...
        // ํœด๊ฐ€ ์ผ์ˆ˜๋ฅผ ๊ธ‰์—ฌ ๋Œ€์žฅ์— ์ ์šฉํ•˜๋Š” ์ฝ”๋“œ
        // ... }
        public void accrueEUDivisionVacation() {
            // ์ง€๊ธˆ๊นŒ์ง€ ๊ทผ๋ฌดํ•œ ์‹œ๊ฐ„์„ ๋ฐ”ํƒ•์œผ๋กœ ํœด๊ฐ€ ์ผ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ์ฝ”๋“œ
            // ...
            // ํœด๊ฐ€ ์ผ์ˆ˜๊ฐ€ ์œ ๋Ÿฝ์—ฐํ•ฉ ์ตœ์†Œ ๋ฒ•์ • ์ผ์ˆ˜๋ฅผ ๋งŒ์กฑํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์ฝ”๋“œ // ...
            // ํœด๊ฐ€ ์ผ์ˆ˜๋ฅผ ๊ธ‰์—ฌ ๋Œ€์žฅ์— ์ ์šฉํ•˜๋Š” ์ฝ”๋“œ
            // ...
        }
    }
}
  • ์ตœ์†Œ ๋ฒ•์ • ์ผ์ˆ˜ ๊ณ„์‚ฐํ•˜๋Š” ์ฝ”๋“œ ์ œ์™ธํ•˜๋ฉด ๊ฑฐ์˜ ๋™์ผ
abstract public class VacationPolicy {
    public void accrueVacation() {
        calculateBaseVacationHours();
        alterForLegalMinimums();
        applyToPayroll();
    }
    private void calculateBaseVacationHours() { /* ... */ };
    abstract protected void alterForLegalMinimums();
    private void applyToPayroll() { /* ... */ };
}

public class USVacationPolicy extends VacationPolicy {
    @Override protected void alterForLegalMinimums() {
        // ๋ฏธ๊ตญ ์ตœ์†Œ ๋ฒ•์ • ์ผ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. }
    }
    public class EUVacationPolicy extends VacationPolicy {
        @Override protected void alterForLegalMinimums() {
            // ์œ ๋Ÿฝ์—ฐํ•ฉ ์ตœ์†Œ ๋ฒ•์ • ์ผ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. }
        }
    }
}
  • Template method ๋กœ ์ค‘๋ณต ์ œ๊ฑฐํ•˜๊ณ  ํ•˜์œ„ ํด๋ž˜์Šค๋Š” ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด accrueVacation ์•Œ๊ณ ๋ฆฌ๋“ฌ์—์„œ ๋น ์ง„ ๊ตฌ๋ฉ์„ ๋ฉ”์›€

๋‹จ์ˆœํ•œ ์„ค๊ณ„ ๊ทœ์น™ 3: ํ‘œํ˜„ํ•˜๋ผ

  1. ์ข‹์€ ์ด๋ฆ„์„ ์„ ํƒ
  2. ํ•จ์ˆ˜์™€ ํด๋ž˜์Šค ํฌ๊ธฐ๋ฅผ ๊ฐ€๋Šฅํ•œ ์ค„์ž„
  3. ํ‘œ์ค€ ๋ช…์นญ์„ ์‚ฌ์šฉ
  4. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๊ผผ๊ผผํžˆ ์ž‘์„ฑ
  5. ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ฐฉ๋ฒ•์€ ๊พธ์ค€ํ•œ ๋…ธ๋ ฅ, ๋‚˜์ค‘์— ์ฝ”๋“œ๋ฅผ ์ฝ์„ ์‚ฌ๋žŒ์€ ๋ฐ”๋กœ ์ž์‹ ์ด๋‹ค

ํด๋ž˜์Šค์™€ ๋ฉ”์„œ๋“œ ์ˆ˜๋ฅผ ์ตœ์†Œ๋กœ ์ค„์—ฌ๋ผ

  • ์ค‘๋ณต์ œ๊ฑฐ, ์˜๋„ํ‘œํ˜„, SRP ์ค€์ˆ˜๋ฅผ ๋„ˆ๋ฌด ๊ณผํ•˜๊ฒŒ ํ•˜๋ฉด ํด๋ž˜์Šค, ๋ฉ”์„œ๋“œ ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚˜ ๋ฒ„๋ฆฐ๋‹ค
  • ์‹œ์Šคํ…œ ํฌ๊ธฐ๋ฅผ ์ž‘๊ฒŒ ์œ ์ง€ํ•˜๋Š”๊ฒŒ ์ตœ์ข… ๋ชฉํ‘œ์ด๋ฏ€๋กœ ๊ฐ€๋Šฅํ•œ ํ•œ ํด๋ž˜์Šค, ๋ฉ”์„œ๋“œ ์ˆ˜๋ฅผ ์ค„์ธ๋‹ค
  • ํ•˜์ง€๋งŒ ์•ž์˜ 1,2,3 ์ด ๋” ์ค‘์š”ํ•˜๊ณ  ๊ฐ€๋Šฅํ•˜๋ฉด ๋„ค๋ฒˆ์งธ๋กœ ์ˆ˜ํ–‰

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

  • ์ฐฝ๋ฐœ์„ฑ์ด ๋ญ”๊ฐ€ ์ƒˆ๋กœ์šด ๋ฐœ๊ฒฌ์„ ๋œปํ•˜๋Š” ๋‹จ์–ด์ธ๊ฒƒ ๊ฐ™์€๋ฐ ์›์„œ์—์„œ ๋‹จ์–ด๋Š” emergence ์ด๋‹ค. ๊ณ ๋‚œ ์—ญ๊ฒฝ์—์„œ์˜ ํƒˆ์ถœ ํ˜น์€ ๊ณค์ถฉ์˜ ์šฐํ™” ๊ฐ€ ์ข€ ๋” ์™€๋‹ฟ๋Š” ๋œป์ธ๊ฒƒ ๊ฐ™๋‹ค. ๋‚ด ๋”๋Ÿฌ์šด ์ฝ”๋“œ๋ฅผ โ€˜์šฐํ™”โ€™ ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž˜ ์ž‘์„ฑํ•˜๊ณ  ์ค‘๋ณต ์ œ๊ฑฐํ•˜๊ณ  ํ‘œํ˜„์„ ์ž˜ ํ•˜์ž.

๐Ÿ”Žย ์งˆ๋ฌธ

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

  • ์„ค๊ณ„๊ฐ€ ์˜๋„ํ•œ ๋Œ€๋กœ ์ˆ˜ํ–‰ ๋˜๋„๋ก ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰
  • ๋น„์Šทํ•œ ์ฝ”๋“œ๋Š” ๋” ๋น„์Šทํ•˜๊ฒŒ ๊ณ ์ณ ์ค‘๋ณต ์ œ๊ฑฐ
  • ํ‘œํ˜„์„ ์ž˜ ํ•˜๋„๋ก ๊พธ์ค€ํžˆ ๋„๋ก ํ•˜์ž. ๋‚˜์ค‘์— ์ฝ”๋“œ๋ฅผ ์ฝ์„ ์‚ฌ๋žŒ์€ ๋ฐ”๋กœ ์ž์‹ ์ด๋‹ค
profile
Full stack tech visionary

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