더북(TheBook)

클래스 리팩토링

의존 관계에서 가장 아래에 있는 성적부터 클래스로 옮겨보자. 이렇게 간단한 정보를 담기에 클래스는 너무 무거워 보인다. 성적은 변하지 않으니 튜플을 사용하는 게 더 적절해 보인다. 다음 코드에서는 리스트 안에 성적을 기록하려고 (score, weight) 튜플을 사용한다.

grades = []

grades.append((95, 0.45))

# ...

total = sum(score * weight for score, weight in grades)

total_weight = sum(weight for _, weight in grades)

average_grade = total / total_weight

 

문제는 일반 튜플은 위치에 의존한다는 점이다. 성적에 선생님의 의견 같은 더 많은 정보를 연관지으려면 이제 튜플을 사용하는 곳을 모두 찾아서 아이템 두 개가 아니라 세 개를 쓰도록 수정해야 한다. 다음 코드에서는 튜플에 있는 세 번째 값을 _로 받아서 그냥 무시하도록 했다(파이썬에서는 관례적으로 사용하지 않을 변수에 밑줄 변수 이름을 쓴다).

grades = []

grades.append((95, 0.45, ‘Great job’))

# ...

total = sum(score * weight for score, weight, _ in grades)

total_weight = sum(weight for _, weight, _ in grades)

average_grade = total / total_weight

 

튜플을 점점 더 길게 확장하는 패턴은 딕셔너리의 계층을 깊게 두는 방식과 비슷하다. 튜플의 아이템이 두 개를 넘어가면 다른 방법을 고려해야 한다.

collections 모듈의 namedtuple 타입이 정확히 이런 요구에 부합한다. namedtuple을 이용하면 작은 불변 데이터 클래스(immutable data class)를 쉽게 정의할 수 있다.

import collections

Grade = collections.namedtuple(‘Grade’, (‘score’, ‘weight’))

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.