본문 바로가기

전체 글

Fluent Python (챕터 6) 일급 함수 디자인 패턴 디자인 패턴은 어떤 언어를 사용하는가에 따라 적용될 수도, 그렇지 않을 수도 있다. 특히 일급 함수를 지원하는 언어에서는 여러 패턴에 대해 다시 생각해 볼 수 있다. 패턴에 참여하는 일부 클래스의 객체를 간단한 함수로 교체하면 획일적으로 반복되는 코드의 상당 부분을 줄일 수 있다는 것이다. 이 장에서는 함수 객체를 이용해서 전략 패턴을 리팩토링하고, 비슷한 방법으로 명령 패턴을 단순화하는 방법에 대해 알아본다. 먼저 전략 패턴이 어떤 것인지 알아본다. 전략패턴이란? 일련의 알고리즘을 정의하고 각각을 하나의 클래스 안에 넣어서 교체하기 쉽게 만든다. 전략을 이용하면 사용하는 클라이언트에 따라 알고리즘을 독립적으로 변경할 수 있다. 즉, 특정한 기능(콘텍스트)에 대하여 클라이언트(객체.. 더보기
Architecture Patterns with Python(3장) 결합과 추상화 앞서 본 저장소 패턴은 저장소에 대한 추상화다. B 컴포넌트가 깨지는 게 두려워서 A 컴포넌트를 변경할 수 없는 경우를 이 두 컴포넌트가 서로 결합되어 있다고 한다. 지역적인 결합은 좋다. 코드가 서로 함께 동작하고, 한 컴포넌트가 다른 컴포넌트를 지원하며 시계 나사처럼 서로 맞물려 돌아간다. 그러나 전역적인 결합은 성가신 존재일 수 있다. 코드를 변경하는 데 드는 비용을 증가시키며, 결합이 커지면 아예 코드를 변경할 수 없는 지경에 이르기도 한다. 추상화를 통해 세부 사항을 감추면 시스템 내의 결합 정도를 줄일 수 있다. 추상화는 보통 단순화 하는 것이므로, 어떠한 시스템 사이에 추상화가 들어감으로써 의존하는 의존성의 종류가 줄어든다. 예를 들어, 원본(source)과 사본(destina.. 더보기
Fluent Python (챕터 5) 일급함수 파이썬의 함수는 일급 객체다. 프로그래밍 언어 이론가들은 다음과 같은 작업을 수행할 수 있는 프로그램 개체를 일급 객체로 정의한다. 런타임에 생성할 수 있다. 데이터 구조체의 변수나 요소에 할당할 수 있다. 함수 인수로 전달할 수 있다. 함수 결과로 반환할 수 있다. 정수, 문자열, 딕셔너리도 파이썬의 일급 객체다. 일급 객체로서의 함수인 일급 함수에 대해 알아본다. 인수를 하나 받는 함수는 모두 key 인수로 사용할 수 있다. def reverse(word): return word[::-1] fruits = ['apple', 'banana', 'fig', 'raspberry', 'cherry', 'strawberry'] print(sorted(fruits, key=reverse)) > ['ba.. 더보기
Architecture Patterns with Python(2장) 저장소 패턴 저장소 패턴은 데이터 저장소를 더 간단히 추상화한 것으로 이 패턴을 사용하면 모델 계층과 데이터 계층을 분리할 수 있다. 애자일 방식으로 작업할 때는 최소 기능 제품(MVP:Minimum Viable Product) 을 만드는 것이 우선이다. 1장에서 만든 도메인 모델을 API 로 만든다고 하면, API 가 MVP 가 된다. 장고의 MVC(모델-뷰-컨트롤러) 구조처럼 표현 계층 -> 비즈니스 로직 -> 데이터베이스 계층으로 구성된 계층 아키텍처가 존재한다. 각 계층이 자신의 바로 아래 계층에만 의존하게 만드는 것이 이 계층 아키텍처의 목표다. 하지만 도메인 모델에는 그 어떤 의존성도 없어야 한다. 즉, 하부 구조와 관련된 문제가 도메인 모델에 지속적으로 영향을 끼치면 안된다. 대신 모델을 마.. 더보기
Fluent Python (챕터 4) 텍스트와 바이트 현재 문자를 가장 잘 정의한 것은 유니코드 문자다. 유니코드 표준은 문자의 단위 원소와 특정 바이트 표현을 명확히 구분한다. 문자의 단위 원소(코드 포인트)는 10진수 0에서 1,114,111까지의 숫자이며, 유니코드 표준에서는 U+ 접두사를 붙여 4자리에서 6자리 사이의 16진수로 표현한다. 문자를 표현하는 실제 바이트는 사용하는 인코딩에 따라 달라진다. 인코딩은 코드 포인트를 바이트 시퀀스로 변환하는 알고리즘이다. s = 'café' print(len(s)) > 4 b = s.encode('utf8') print(b, len(b)) > b'caf\xc3\xa9' 5 print(b.decode('utf8')) > café café 문자열은 네 개의 유니코드 문자를 갖고 있다. UTF-8.. 더보기
Fluent Python (챕터 3) 딕셔너리와 집합 dict 형은 애플리케이션에서 뿐만 아니라, 파이썬 구현의 핵심 부분이기도 하다. 모듈 네임스페이스, 클래스 및 인스턴스 속성, 함수의 키워드 인수 등 핵심 부분에 딕셔너리가 사용되고 있다. 내장 함수들은 __builtins__.__dict__에 들어 있다. 파이썬 dict 클래스는 상당히 최적화되어 있는데, 이는 해시 테이블이라는 엔진 덕분이다. dict 의 키는 해시 가능해야 한다. 수명 주기 동안 절대 변하지 않는 해시값을 갖고 있고(__hash__() 메서드 필요) 다른 객체와 비교할 수 있으면(__eq__()메서드) 객체를 해시 가능하다고 한다. 동일하다고 판단되는 객체는 반드시 해시값이 동일해야 한다. 불변 내장 객체는 모두 해시 가능하다고 하는 경우도 있는데, 튜플은 내부에 .. 더보기
Architecture Patterns with Python(1장) 도메인 모델링 대부분 시스템을 설계할 때, 데이터베이스 스키마를 그리기 시작하고 그 다음 객체 모델을 생각한다. 여기서부터 모든 것이 잘못되기 시작한다. 먼저 행동하고 저장에 대한 요구 사항은 행동에 맞춰 정해져야 한다. 고객들은 데이터 모델에 대해 신경쓰지 않는다. 시스템이 어떤 일을 하는지만 신경 쓴다. 이 책에서는 4가지 핵심 설계 패턴을 보여준다. 저장소 패턴은 영속적인 저장소에 대한 추상화이다. 서비스 계층 패턴은 usecase의 시작과 끝을 명확하게 정의하기 위한 패턴이다. 작업 단위 패턴은 원자적 연산을 제공한다. 애그리게이트 패턴은 데이터 정합성을 강화하기 위한 패턴이다. 챕터 1에서는 비즈니스 프로세스를 코드로 모델링하는 방법을 배운다. 이 때 TDD와 호환이 잘 되는 방식을 살펴본다. .. 더보기
Fluent Python (챕터 2) 시퀀스 문자열, 리스트, 바이트 시퀀스, 배열, XML요소, 데이터베이스 결과에는 모두 반복, 슬라이싱, 정렬, 연결 등 공통된 연산을 적용할 수 있다. 파이썬 표준 라이브러리는 C로 구현된 다음과 같은 시퀀스형을 제공한다. 컨테이너 시퀀스 서로 다른 자료성의 항목들을 담을 수 있는 list, tuple, collections.duque 형 균일 시퀀스 단 하나의 자료형만 담을 수 있는 str, bytes, bytearray, memoryview, array.array 형 균일 시퀀스가 메모리를 더 적게 사용지만 문자, 바이트, 숫자 등 기본적인 자료형만 저장할 수 있다. 시퀀스형은 가변성에 따라서도 구분할 수 있다. 가변 시퀀스 list, bytearray, array.array, collections.. 더보기