TIL/ 의미 있는 이름
Today I learned(22.02.20)
오늘 읽은 범위
2장 의미 있는 이름
책에서 기억하고 싶은 내용을 써보세요.
- 검색하기 쉬운 이름을 사용하라
- 일반 상수 5 vs WORK_DAYS_PER_YEAR → 검색 용이
- 의도를 분명하고 솔직하게 표현하라
- 불필요한 맥락은 없애자 (불분명한 불용어의 사용을 피하라)
- → Customer vs CustomerInfo 차이점은? (없다) 불필요한 맥락은 없애자
- 대충 훑어봐도 이해할 코드 작성이 목표다
오늘 읽은 소감은 ? 떠오르는 생각을 가볍게 적어보세요.
- 좋은 이름의 선택이 어려운 이유는 문화적인 배경이 모두 달라서다. 이러한 배경 차이를 배제하고 명료한 코드를 짜고 싶다.
찾아보고 싶었던 내용
- 다형메서드 개념 및 다형 메서드 사용 예제
- 정적 팩토리 메소드
실제 프로젝트를 하면서 해독하기 어려웠던 변수
- 의미 없는 변수명 → ex) a, b, c, d
- 단어를 줄여서 쓰는 경우 → target feature → t_f
- 잘 사용하지 않는 단어로 설정된 변수명 → 검색을 한번 더 해야함
잘하고 있던 내용
- 한 개념에 한 단어를 사용하라
- 일관성 있는 어휘는 코드를 사용할 프로그래머가 반갑게 여길 선물이다.
😀 예제 코드 파이썬으로 변경
맥락이 불분명한 변수
def print_guess_statics(candidate, count):
if count == 0:
number = 'no'
verb = 'are'
plural_modifier = 's'
elif count == 1:
number = '1'
verb = 'is'
plural_modifier = ''
else:
number = f'{count}'
verb = 'are'
plural_modifier = 's'
guess_message = f'There {verb} {number} {candidate}{plural_modifier}'
print(guess_message)
맥락이 분명한 변수
# 데이터 클래스 사용으로 보일러 플레이트 방지
@dataclass
class GuessStatics:
candidate: str
count: int
@staticmethod
def there_are_no_letters():
number = 'no'
verb = 'are'
plural_modifier = 's'
return number, verb, plural_modifier
@staticmethod
def there_is_one_letter():
number = '1'
verb = 'is'
plural_modifier = ''
return number, verb, plural_modifier
def there_are_many_letters(self):
number = f'{self.count}'
verb = 'are'
plural_modifier = 's'
return number, verb, plural_modifier
def __repr__(self):
# 클래스 출력 메세지 변경
if self.count == 0:
number, verb, plural_modifier = self.there_are_no_letters()
elif self.count == 1:
number, verb, plural_modifier = self.there_is_one_letter()
else:
number, verb, plural_modifier = self.there_are_many_letters()
return f'There {verb} {number} {self.candidate}{plural_modifier}'
메인 메소드
def main():
# 맥락이 불분명한 변수
candidates = ['sj', 'kr', 'hy']
counts = [0, 1, 2]
[print_guess_statics(candidate, count) for candidate, count in zip(candidates, counts)]
# 맥락이 분명한 변수
[print(GuessStatics(candidate, count)) for candidate, count in zip(candidates, counts)]
# 위 코드와 동일 코드
for candidate, count in zip(candidates, counts):
a = GuessStatics(candidate, count)
print(a)
위 코드를 실행해보면 맥락이 불분명한 변수와 맥락이 분명한 변수의 출력값이 같다는 것을 알 수 있다.
변수를 세개 받는 구조가 마음에 들지 않아 클래스로 분리해보았다.
메인 메소드는 동일하고 GuessStatics 구조만 변경 되었다.
성능상의 이점은 어느 코드가 더 좋은지는 모르겠다. 내일 파이썬의 메모리 구조를 공부해야겠다..!
@dataclass
class GuessStatics:
candidate: str
count: int
def __repr__(self):
if self.count == 0:
rating = NoLetters()
elif self.count == 1:
rating = OneLetters()
else:
rating = ManyLetters(self.count)
# 클래스 출력 메세지 변경
return f'There {rating.verb} {rating.number} {self.candidate}{rating.plural_modifier}'
class MessageElement:
number: str
verb: str
plural_modifier: str
class OneLetters(MessageElement):
def __init__(self):
self.number = '1'
self.verb = 'is'
self.plural_modifier = ''
class ManyLetters(MessageElement):
def __init__(self, count):
self.number = count
self.verb = 'are'
self.plural_modifier = 's'
class NoLetters(MessageElement):
def __init__(self):
self.number = 'no'
self.verb = 'are'
self.plural_modifier = 's'
'Book Review > clean code' 카테고리의 다른 글
DTO vs Vo (0) | 2022.03.01 |
---|