요약 None을 반환하면 조건문에서 0, "", [] 같은 것들을 반환할 때와 동일하게 판단되므로 실수하기 쉬워짐. None을 반환한다면 다음 형태로 처리하는 것이 좋음. 명시적으로 None 체크하기 (is None) → 타입체커랑 사용하기 좋음. (연산 성공, 결과)를 튜플 형식으로 반환하기 → 사용자가 무시하기 쉬움. 명시적으로 예외를 던지고 Try / except / else를 사용하기 사용자가 문서를 읽지 않으면 런타임 에러에 대응하지 못할 수 있음. 그러나 빠른 실패라는 관점에서 좀 더 단단한 어플리케이션이 될 수도 있음. Item 20. None을 반환하기보다는 예외를 발생시켜라 if None: print('false' if 0: print('false') if []: print('false'..
요약 엔티티는 식별키를 기준으로 동일성이 판단되는 가변객체다. 특정 속성이 변하더라도 같은 객체로 판단해야하는 객체를 표현할 때 사용된다. (사람이 나이가 먹어도 같은 사람이다) 엔티티는 가변객체지만, 프로그램의 안정성을 위해서 필요한 부분만 가변으로 바꾸는 것이 좋다. 즉, 엔티티도 가능한 불변 객체로 남겨두는 것이 낫다. 같은 엔티티인지 확인하기 위해 equals()는 식별키를 비교하도록 구현해야한다. 도메인 객체를 엔티티로 사용하는 기준은 생애주기를 가지는지 여부가 크다 환경에 따라 엔티티도 될 수 있고, 값객체도 될 수 있다. 도메인 객체를 선언했을 때 장점 도메인 객체 자체가 도메인 모델을 설명해 줌. (도메인 규칙을 도메인 클래스만 보고 이해할 수 있게 됨.) 도메인 모델의 변경점을 도메인 객..
요약 DDD에서 이야기하는 값 객체는 '시스템 특유의 값'을 나타내는 객체임. (String으로 표현하기 보다, FullName 클래스를 만드는게 더 좋음) 값객체는 '값'의 특성을 지켜서 만들어야 함. 불변해야함. (Setter 제공 X) 교환가능해야함. (대입식으로 처리 가능해야함) 비교 가능해야함. (equals 구현) 값 객체가 되기 위한 기준 도메인으로 사용되는 객체일 때 분리해서 사용되거나, 특정 규칙이 있을 때 값 객체의 장점 표현력이 좋아짐. (필드로 각각이 무엇을 하는 것인지 명확하게 표현해 줌.) 무결성이 좋아짐. (특정 필드에 대한 제약조건을 확인해야 할 때, 값객체 내에 모아둘 수 있음) 잘못된 대입 방지. (Primitive 타입을 이용하면, 잘못된 값을 대입해도 컴파일러가 잡아주..
요약 def 문에서 *args를 사용하면 함수가 가변 위치 기반 인자를 받을 수 있다. * 연산자를 사용하면 가변 인자를 받는 함수에게 시퀀스(리스트) 내의 원소를 전달할 수 있음. (언패킹 한 후 튜플로 만들어 전달함.) 제네레이터에 * 연산자를 사용해 가변인수에 넘기면, 메모리를 소진하고 중단할 수 있음. 가변인수 메서드에 위치 기반 인자를 추가하면 찾기 어려운 버그가 발생할 수 있음. 인자를 추가해야 하는 경우 키워드 기반 인자를 추가하자. 가변 인수 사용의 장점. def log(message, values): if not values: print(message) else: value_str = ', '.join(str(x) for x in values) print(f'{message}: {valu..
들어가기 전 이 글은 이펙티브 파이썬 아이템 19를 공부하며 작성한 글입니다. 요약 반환값이 많아지면 가독성이 떨어지며, 실수할 여지가 많아진다. 언패킹을 이용하거나, 언패킹 해야할 값이 너무 많아지면 데이터 클래스등으로 묶어서 반환해라. Item 19. 함수가 여러 값을 반환하는 경우 절대로 네 값 이상을 언패킹하지 마라. # 슬라이싱보다는 언패킹을 이용하라. lengths = [1, 2, 3, 4] def get_avg_ratio(numbers: list[int]) -> list[num]: average = sum(numbers) / len(numbers) scaled = [x / average for x in numbers] scaled.sort(reverse=True) return scaled #..