CleanCode TIL (2022.02.07)

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

๋…ธ๊ฐœ๋ถ

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

DAY 18

๐Ÿ”–ย ์˜ค๋Š˜ ์ฝ์€ ๋ฒ”์œ„ : 9. ๋‹จ์œ„ํ…Œ์ŠคํŠธ(164~168p)


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

ํ…Œ์ŠคํŠธ๋‹น assert ํ•˜๋‚˜

  • ํ•จ์ˆ˜๋งˆ๋‹ค assert๋ฌธ์„ ๋‹จ ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค โ†’ ๊ฒฐ๋ก ์ด ํ•˜๋‚˜์ด๋ฏ€๋กœ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ  ๋น ๋ฅด๋‹ค
  • ๊ฒฐ๋ก ์ด ๋‘ ๊ฐœ ์ด์ƒ์ด๋ฉด? โ†’ ํ…Œ์ŠคํŠธ๋ฅผ ๋‘๊ฐœ๋กœ ์ชผ๊ฐ ๋‹ค
    public void testGetPageHierarchyAsXml() throws Exception {
        givenPages("PageOne", "PageOne.ChildOne", "PageTwo");
        whenRequestIsIssued("root", "type:pages");
        thenResponseShouldBeXML();
    }
    public void testGetPageHierarchyHasRightTags() throws Exception {
        givenPages("PageOne", "PageOne.ChildOne", "PageTwo");
        whenRequestIsIssued("root", "type:pages");
        thenResponseShouldContain(
            "<name>PageOne</name>", "<name>PageTwo</name>", "<name>ChildOne</name>"
        );
    }
    • ๋‹จ ํ…Œ์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉด ์ค‘๋ณต๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋งŽ์•„์ง„๋‹ค
  • Template Method ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์ค‘๋ณต ์ œ๊ฑฐ
    • given/when ๋ถ€๋ถ„์„ ๋ถ€๋ชจ ํด๋ž˜์Šค์— ๋‘๊ณ  then ๋ถ€๋ถ„์„ ์ž์‹ ํด๋ž˜์Šค์— ๋‘”๋‹ค
    • ํ˜น์€ @Before ํ•จ์ˆ˜์— given/when ๋ถ€๋ถ„์„ ๋„ฃ๊ณ  @Test ํ•จ์ˆ˜์— then ๋ถ€๋ถ„์„ ๋„ฃ๋Š”๋‹ค

ํ…Œ์ŠคํŠธ๋‹น ๊ฐœ๋… ํ•˜๋‚˜

  • ์—ฌ๋Ÿฌ ๊ฐœ๋…์„ ํ•œ ํ•จ์ˆ˜๋กœ ๋ชฐ์•„๋„ฃ์œผ๋ฉด ๋…์ž๊ฐ€ ๊ฐ๊ฐ ๊ฐœ๋…์„ ๋ชจ๋‘ ์ดํ•ดํ•ด์•ผ๋งŒํ•œ๋‹ค
  • ์•„๋ž˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ 3๊ฐœ๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด..
/* addMonths() ๋ฉ”์„œ๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ์žฅํ™ฉํ•œ ์ฝ”๋“œ */
public void testAddMonths() {
    SerialDate d1 = SerialDate.createInstance(31, 5, 2004);
    SerialDate d2 = SerialDate.addMonths(1, d1);
    assertEquals(30, d2.getDayOfMonth());
    assertEquals(6, d2.getMonth());
    assertEquals(2004, d2.getYYYY());
    SerialDate d3 = SerialDate.addMonths(2, d1);
    assertEquals(31, d3.getDayOfMonth());
    assertEquals(7, d3.getMonth());
    assertEquals(2004, d3.getYYYY());
    SerialDate d4 = SerialDate.addMonths(1, SerialDate.addMonths(1, d1));
    assertEquals(30, d4.getDayOfMonth());
    assertEquals(7, d4.getMonth());
    assertEquals(2004, d4.getYYYY());
}
  • 31์ผ๋กœ ๋๋‚˜๋Š” ๋‹ฌ์˜ ๋งˆ์ง€๋ง‰ ๋‚ ์ž๊ฐ€ ์ฃผ์–ด์ง€๋Š” ๊ฒฝ์šฐ
    1. 30์ผ๋กœ ๋๋‚˜๋Š” ํ•œ ๋‹ฌ์„ ๋”ํ•˜๋ฉด ๋‚ ์งœ๋Š” 30์ผ์ด ๋˜์–ด์•ผํ•œ๋‹ค (31์ผ์ด ๋˜๋ฉด ์•ˆ๋œ๋‹ค)
    2. ๋‘ ๋‹ฌ์„ ๋”ํ•˜๋ฉด, ๋‘ ๋ฒˆ์งธ ๋‹ฌ์ด 31์ผ๋กœ ๋๋‚˜๋ฉด ๋‚ ์งœ๋Š” 31์ผ์ด ๋˜์–ด์•ผ ํ•œ๋‹ค.
  • 30์ผ๋กœ ๋๋‚˜๋Š ใ„ด๋‹ฌ์˜ ๋งˆ์ง€๋ง‰ ๋‚ ์ž๊ฐ€ ์ฃผ์–ด์ง€๋Š” ๊ฒฝ์šฐ
    1. 31์ผ๋กœ ๋๋‚˜๋Š” ํ•œ ๋‹ฌ์„ ๋”ํ•˜๋ฉด ๋‚ ์งœ๋Š” 30์ผ์ด ๋˜์–ด์•ผํ•œ๋‹ค (31์ผ์ด ๋˜๋ฉด ์•ˆ๋œ๋‹ค)
  • 3๊ฐœ ์ผ€์ด์Šค๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  ๋ณด๋‹ˆ 2์›” 28์ผ์ด ๋น ์กŒ๋‹ค๋Š” ๊ฒƒ ์ธ์‹ ๊ฐ€๋Šฅ โ†’ 4๋ฒˆ์งธ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ถ”๊ฐ€ ํ•„์š”
  • ๊ฐœ๋… ๋‹น assert๋ฌธ ์ˆ˜๋ฅผ ์ตœ์†Œ๋กœ ์ค„์—ฌ์•ผ ํ•œ๋‹ค
  • ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜ ํ•˜๋‚˜๋Š” ๊ฐœ๋… ํ•˜๋‚˜๋งŒ ํ…Œ์ŠคํŠธ ํ•˜๋ผ

F.I.R.S.T

Fast

  • ํ…Œ์ŠคํŠธ๊ฐ€ ๋Š๋ฆฌ๋ฉด ์ž์ฃผ ๋Œ๋ฆด ์—„๋‘๋ฅผ ๋ชป ๋‚ธ๋‹ค.

Independent

  • ๊ฐ ํ…Œ์ŠคํŠธ๋Š” ์„œ๋กœ ์˜์กดํ•˜๋ฉด ์•ˆ๋œ๋‹ค
  • ์–ด๋–ค ์ˆœ์„œ๋กœ ์‹คํ–‰ํ•ด๋„ ๊ดœ์ฐฎ์•„์•ผ ํ•œ๋‹ค

Repeatable

  • ์–ด๋–ค ํ™˜๊ฒฝ์—์„œ๋„ ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค.

Self-Validating

  • ํ…Œ์ŠคํŠธ๋Š” bool ๋กœ์„œ ์„ฑ๊ณต ํ•˜๋‹ˆ๋ฉด ์‹คํŒจ๋ฅผ ์•Œ๋ ค์•ผํ•œ๋‹ค.
  • ๋ถ€์ˆ˜์ ์œผ๋กœ ๋กœ๊ทธ๋ฅผ ์ฝ๋Š” ์‹œ๊ฐ„์„ ๋“ค์ด๊ฒŒ ํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.

Timely

  • ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋Š” ํ…Œ์ŠคํŠธํ•˜๋ ค๋Š” ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์ง์ „์— ๊ตฌํ˜„ํ•œ๋‹ค.
  • ์‹ค์ œ ์ฝ”๋“œ ๊ตฌํ˜„ ์ดํ›„์— ํ…Œ์ŠคํŠธ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๋ฉด ํ…Œ์ŠคํŠธ๊ฐ€ ์–ด๋ ต๋‹ค๋ฉฐ ๋ฏธ๋ฃจ๊ฒŒ ๋Œ

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

  • ํ˜‘์—…๋ณด๋‹ค๋Š” ๊ฐœ์ธ ๊ฐœ๋ฐœ์˜ ๋น„์ค‘์ด ๋†’๋‹ค๋ณด๋”” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋ฏธ๋ฃจ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ํ•œ ๋ฒˆ ๋ฏธ๋ฃจ๊ณ  ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜๋ฉด ๋‚˜์ค‘์—๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์งค ์ผ์ด ๊ฑฐ์˜ ์—†๊ฒŒ ๋œ๋‹ค. ํ•ญ์ƒ ํŒ€ ํ”„๋กœ์ ํŠธ ๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜๋Š” ์Šต๊ด€์„ ๋“ค์ด์ž

๐Ÿ”Žย ์งˆ๋ฌธ

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

  • ๊ฐœ๋… ๋‹น assert๋ฌธ ์ˆ˜๋ฅผ ์ตœ์†Œ๋กœ ์ค„์ด์ž
  • ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜ ํ•˜๋‚˜๋Š” ๊ฐœ๋… ํ•˜๋‚˜๋งŒ ํ…Œ์ŠคํŠธ
  • ํ…Œ์ŠคํŠธ๋Š” Fast, Independent, Repeatable, Self-Validating, Timely ํ•ด์•ผํ•œ๋‹ค
profile
Full stack tech visionary

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