Study/object

[엘레강트 오브젝트] 2-7장 문서를 작성하는 대신 테스트를 만드세요

에디개발자 2021. 9. 1. 07:00
반응형

나를 닮았다고 한다...

이 글은 엘레강트 오브젝트 새로운 관점에서 바라본 객체지향 도서를 보며 스터디한 글입니다.

책에서 주장하는 내용을 정리하였으며 예제들은 모두 코틀린 코드로 변환하여 작성하였습니다.

 

목차

  1. 문서를 작성할 수 밖에 없는 이유
  2. 코드는 깔끔하게 작성하라
  3. 단위 테스트를 추가하라
  4. 주관적인 생각

1. 문서를 작성할 수 밖에 없는 이유

코드를 이해하는 데 있어 추리(?)를 하게 되거나 복잡하게 작성했을 때 반드시 문서를 작성하게 됩니다. 

문서를 작성해야만 하는 코드

class Study {
    // study를 시작한다.
    fun a() {}
    
    // study를 종료한다.
    fun b() {}
}

위 코드에서 주석이 없다면 a(), b() 메서드가 하는 역할을 알아내려면 모든 로직을 분석해야합니다. 유지보수 최악!!

 

2. 코드는 깔끔하게 작성하라

좋은 클래스는 목적이 명확하게 작고 설계가 우아합니다. 즉, 코드를 깔끔하게 작성해야합니다. 

문서가 필요없는 코드

class WebPage(
    private var content: String
) {
    fun content(): String =
        this.content

    fun update(content: String) {
        this.content = content
    }
}

메서드 명만으로 어떤 역할을 하는지 명확하게 알 수 있다. 

 

3. 단위 테스트를 추가하라

잘 만들어진 단위 테스트가 문서보다 가치가 있습니다. 

단위 테스트 가치

  • 코드 파악 쉬움
  • 유지보수 향상
  • 코드 수정 시 빠른 피드백
필자는 과거에 블록체인 개발자였습니다. 
블록체인의 종류 중 Hyperlegder Fabric을 설치하는 플랫폼을 개발하던 중 Fabric-SDK에서 제공하는 단위 테스트에서 많은 도움을 받았습니다.
블록체인은 그 때 당시엔 너무 낯설었기 때문에 문서로만은 쉽게 이해가 되지 않았습니다. 그리하여 단위 테스트를 디버깅모드로 돌려보며 데이터의 흐름을 파악하며 분석하였습니다. 
internal class WebPageTest {

    @Test
    fun `check content`() {
        // Given
        val content = "꾸준히 성장하자."

        // When
        val webPage = WebPage(content)

        // Then
        assertThat(webPage.content()).isEqualTo(content)
    }

    @Test
    fun `update content`() {
        // Given
        val content = "꾸준히 성장하자."
        val webPage = WebPage(content)

        val updateContent = "천천히 꾸준히 성장하자."
        // When
        webPage.update(updateContent)

        // Then
        assertThat(webPage.content()).isEqualTo(updateContent)
    }
}

단위 테스트에서 살펴봐야할 점

  • 메서드 명만으로 어떤 테스트를 하는 지 추측이 가능합니다. 
  • 객체의 메서드가 어떤 동작을 하는지 알 수 있다.
  • 객체의 메서드에서 어떤 행위가 완료된 후 결과값을 확인 할 수 있다.

4. 주관적인 생각

모두 동의하는 내용입니다. 하지만 문서를 절대 작성하지 말라는 내용은 아닙니다.

클래스에 대한 상세한 기능은 단위테스트에 맡기고 프로젝트의 큰 그림은 문서로 작성하는 것을 권장합니다.

반응형