본문 바로가기

python

파이썬 클린 코드 - 9장 (일반적인 디자인 패턴) 1. 실전 속의 디자인 패턴 GoF 에서 소개하는 23개의 디자인 패턴을 기준으로 하며, 각 패턴은 생성(creational), 구조(structural), 행동(behavioral) 패턴 중의 하나로 분류된다. 일부 패턴은 파이썬 내부에서 자체적으로 구현되어 있으므로 보이지 않은 채로도 적용될 수 있다. 또한 모든 패턴이 똑같이 일반적이지는 않다. 몇 개는 매우 빈번하게 언급되는 반면 다른 것들은 특별한 상황에서만 사용되는 것도 있다. 애플리케이션의 솔루션에 강제로 디자인 패턴을 적용해서는 안되며, 패턴이 출현할 때까지는 솔루션을 진화시키고 리팩토링하고 개선해야 한다. 따라서 디자인 패턴은 발명되는 것이 아니라 발견되는 것이다. 코드에 반복적으로 같은 내용이 출현할 때 비로소 일반적이고 추상화된 클래스.. 더보기
파이썬 클린 코드 - 8장 (단위 테스트와 리팩토링) 1. 디자인 원칙과 단위 테스트 단위 테스트는 다른 코드의 일부분이 유효한지를 검사하는 코드이다. 단위 테스트는 소프트웨어의 핵심이 되는 필수적인 기능으로서 일반 비즈니스 로직과 동일한 수준으로 다루어져야 한다. 단위 테스트는 비즈니스 로직이 특정 조건을 보장하는지를 확인하기 위해 여러 시나리오를 검증하는 코드이다. 단위 테스트는 다음과 같은 특징이 있다. 격리 : 단위 테스트는 다른 외부 에이전트와 완전히 독립적이어야 하며 비즈니스 로직에만 집중해야 한다. 때문에 데이터베이스에 연결하지 않아야 하고 HTTP 요청도 하지 않아야 한다. 격리는 또한 테스트 자체가 독립적이라는 것을 의미한다. 테스트는 이전 상태와 관계없이 임의의 순서로 실행될 수 있어야 한다. 성능 : 단위 테스트는 신속하게 실행되어야 한.. 더보기
파이썬 클린 코드 - 7장 (제너레이터) 1. 제너레이터 만들기 제너레이터는 파이썬에서 고성능이면서도 메모리를 적게 사용하는 반복을 위한 방법이다. 제너레이터는 한 번에 하나씩 구성요소를 반환해주는 이터러블을 생성해주는 객체이다. 제너레이터를 사용하는 주요 목적은 메모리를 절약하는 것이다. 거대한 요소를 한꺼번에 메모리에 저장하는 대신 특정 요소를 어떻게 만드는지 아는 객체를 만들어서 필요할 때마다 하나씩 가져오는 것이다. 이 기능은 lazy computation 을 통해 가능하다. 1-1. 제너레이터 개요 대규모의 구매 정보에서 최저 판매가, 최고 판매가, 평균 판매가를 구하는 예제가 있다. 문제를 단순화하여 단 두 개의 필드만을 가진 csv 가 있다고 가정한다. , 모든 구매 정보를 받아 필요한 지표를 구해주는 객체를 만들어본다. class.. 더보기
파이썬 클린 코드 - 6장 (디스크립터로 더 멋진 객체 만들기) 1. 디스크립터 개요 1-1. 디스크립터 메커니즘 디스크립터를 구현하려면 최소 두 개의 클래스가 필요하다. 클라이언트 클래스는 디스크립터 구현의 기능을 활용할 도메인 모델로서 솔루션을 위해 생성한 일반적인 추상화 객체이다. 디스크립터 클래스는 디스크립터 로직의 구현체이다. 디스크립터는 단지 디스크립터 프로토콜을 구현한 클래스의 인스턴스다. 이 클래스는 다음 매직 메서드 중 최소 한 개 이상을 포함해야 한다. __get__ __set__ __delete__ __set_name__ 또한 다음과 같은 네이밍 컨벤션을 사용한다. 이름 의미 ClientClass 디스크립터 구현체의 기능을 활용할 도메인 추상화 객체. 디스크립터의 클라이언트이다. 클래스 속성으로 디스크립터를 갖는다. DescribtorClass 디.. 더보기
파이썬 클린 코드 - 5장 (데코레이터를 사용한 코드 개선) 1. 파이썬의 데코레이터 데코레이터는 PEP-318에서 함수와 메서드의 기능을 쉽게 수정하기 위한 수단으로 소개되었다. 데코레이터는 데코레이터 이후에 나오는 것을 데코레이터의 첫 번재 파라미터로 하고 데코레이터의 결과 값을 반환하게 하는 syntax sugar 일 뿐이다. syntax sugar 는 동일한 기능이지만 타이밍의 수고를 덜어주기 위해 또는 읽기 쉽게 하기 위해 다른 표현으로 코딩할 수 있게 해주는 기능을 의미한다. 1-1. 함수 데코레이터 파이썬에서 데코레이터를 사용하여 기능을 변경하는 가장 간단한 방법은 함수에 적용하는 것이다. 파라미터의 유효성 검사를 하거나 사전조건을 검사하거나, 기능 전체를 새롭게 정의할 수도 있다. 예를 들어 다음과 같이 도메인의 특정 예외에 대해서 특정 횟수만큼 재.. 더보기
파이썬 클린 코드 - 4장 (SOLID 원칙) SOLID 원칙을 파이썬스러운 방식으로 구현하는 방법을 설명한다. S : 단일 책임 원칙 O : 개방/폐쇄 원칙 L : 리스코프 치환 원칙 I : 인터페이스 분리 원칙 D : 의존성 역전 원칙 1. 단일 책임 원칙 단일 책임 원칙(Single Responsibility Principle - SRP) 은 소프트웨어 컴포넌트(일반적으로 클래스)가 단 하나의 책임을 져야 한다는 원칙이다. 클래스가 유일한 책임이 있다는 것은 하나의 구체적인 일을 담당한다는 것을 의미하며, 따라서 변화해야 할 이유는 단 하나뿐이다. 도메인의 문제가 변경되면 클래스를 업데이트 해야 한다. 다른 이유로 클래스를 수정한다면 추상화가 잘못되어 클래스에 너무 많은 책임이 있다는 것을 뜻한다. 필요 이상의 책임을 지거나 너무 많은 것을 알.. 더보기
파이썬 클린 코드 - 3장 (좋은 코드의 일반적인 특징) 1. 계약에 의한 디자인 소프트웨어는 사용자가 직접 호출하기도 하지만 코드의 다른 부분에서 호출하는 경우도 있다. 애플리케이션의 책임을 나눠 레이어나 컴포넌트로 분리한 경우가 그렇다. 컴포넌트는 기능을 숨겨 캡슐화하고 함수를 사용할 고객에게는 API(Application Programming Interface) 를 노출해야 한다. 컴포넌트의 함수, 클래스, 메서드는 특별한 유의사항에 따라 동작해야 하며, 그렇지 않을 경우 코드가 깨지게 된다. 예를 들어 정수를 파라미터로 사용하는 함수에 문자열을 파라미터로 전달하면 기대와 다르게 동작할 것이다. 물론 API 를 디자인할 때 예상되는 입력, 출력 및 부작용을 문서화해야 한다. 그러나 문서화가 런타임 시의 소프트웨어 동작을 강제할 수는 없다. 따라서 코드가 .. 더보기
파이썬 클린 코드 - 2장 (Pythonic code) 1. 인덱스와 슬라이스 >>> numbers = (1, 1, 2, 3, 5, 8, 12, 21) >>> my_numbers[1:7:2] 위와 같이 시퀀스에 간격을 전달할 때 실제로는 슬라이스를 전달하는 것과 같다. slice 는 파이썬 내장 객체로 직접 빌드하여 전달할 수도 있다. >>> interval = slice(1, 7, 2) >>> numbers[interval] (1, 3, 8) >>> interval = slice(None, 3) >>> numbers[interval] = numbers[:3] True slice 의 (시작, 중지, 간격) 중 하나를 지정하지 않은 경우 None 으로 간주한다. 튜플, 문자열, 리스트의 특정 요소를 가져오려고 한다면 for 루프를 돌며 수작업으로 요소를 선택하.. 더보기