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 } }
리팩토링할 때 코드가 무엇을 하는지 그 의미 단위에 주의를 기울이자.
오늘 배운 것
- 알고리즘
- swea 1249 보급로
- 다익스트라
내일 할 일
- 상담 피드백 바탕으로 포트폴리오 수정 (다음주 주말까지는 완료)