본문 바로가기

Book Review/clean code

[Day2] 2장. 의미 있는 이름

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