2025-08-29

1일 1아티클

라인 테크

코드 품질 개선 방식

관계에서 숲을 보기

  • 예시 코드 : 중첩된 루프로 인한 가독성 저하

    
     class Page(val index: UInt, val chunk: List<Item>, val hasNext: Boolean)
    
     fun saveAllItemMetadata() {
        var index = 0u
        while (true) {
           val page = requestPage(index) ?: return
           for (item in page.chunk) {
                 val itemMetadata = calculateItemMetadata(item)
                 repository.saveMetadata(item.id, itemMetadata)
           }
           if (!page.hasNext) {
                 return
           }
           index = page.index + 1u
        }
     }
    
    
  • 잘못된 리팩토링 : 내부 루프를 private 함수로 추출
    • 가독성 개선이 이루어지지 않은 이유 : 함수의 경계와 의미 단위의 경계의 불일치
    • 모든 Item 조회 코드가 두 군데로 나뉨
    
     fun saveAllItemMetadata() {
        var index = 0u
        while (true) {
           val page = requestPage(index) ?: return
           saveMetadataInPage(page)
           if (!page.hasNext) {
                 return
           }
           index = page.index + 1u
        }
     }
    
     private fun saveMetadataInPage(page: Page) {
        for (item in page.chunk) {
           val itemMetadata = calculateItemMetadata(item)
           repository.saveMetadata(item.id, itemMetadata)
        }
     }
    
    
  • 함수 수행하는 일 분석
    • 모든 Item 조회
    • 해당 Item 의 메타데이터 저장
    • 리팩토링의 핵심 : 추출의 용이성 (X), ‘코드가 무엇을 하는지’ 의미 단위 (O)
  • 좋은 리팩토링 : Item 의 열을 조회하는 함수로 추출

    
     fun saveAllItemMetadata() {
        for (item in requestItemSequence()) {
           val itemMetadata = calculateItemMetadata(item)
           repository.saveMetadata(item.id, itemMetadata)
        }
     }
    
     fun requestItemSequence(): Sequence<Item> = sequence {
        var page: Page? = requestPage(0u)
        while (page != null) {
           yieldAll(page.chunk)
           page = if (page.hasNext) requestPage(page.index + 1u) else null
        }
     }
    
    

리팩토링할 때 코드가 무엇을 하는지 그 의미 단위에 주의를 기울이자.

오늘 배운 것

  1. 알고리즘
    • swea 1249 보급로
    • 다익스트라

내일 할 일

  1. 상담 피드백 바탕으로 포트폴리오 수정 (다음주 주말까지는 완료)

참고자료

results matching ""

    No results matching ""