삽질의 현장/- ETC

프로그램을 작성하는 33가지 방법 - Chaptor 05정리

shovelman 2019. 3. 23. 19:38

최근 '프로그래밍 패턴 (프로그램을 작성하는 33가지 방법)' 을 읽기 시작했다.

한 가지의 기능을 Chaptor 마다 각각 다른 패턴으로 구현하여 설명한 책이다.

모두 비슷하게 동작하지만 환경과 상황이라는 제약 조건 안에서 탄생된 패턴을 직접 코드로 보여주고 있어직접 코딩을 하며 이해하고 있는 중이다.

책에서 소개하는 한 가지 기능은 '텍스트 파일을 읽어 단어 빈도 출력' 하는 프로그램이다.


가장 빈도가 높은 단어 순으로 그에 해당하는 빈도를 내림차순으로 출력하는 기능을 구현하고 있다.

이전 Chaptor 보기 :프로그램을 작성하는 33가지 방법 - Chaptor 04 정리

Chaptor 05. 파이프라인

  • 규모가 큰 문제를 함수형(functional) 추상화를 사용해 분해한다. 함수는 입력을 취해 출력을 만들어 낸다.
  • 함수는 상태를 서로 공유하지 않는다.
  • 수학적 함수 합성의 결과를 신뢰할 수 있는 것 처럼 규모가 큰 문제는 함수를 차례차례 파이프라인으로 합성해 해결한다.

이 프로그래밍 형식은 1960 년대 리스프(LISP)에서 나타났다.

파이프라인 형식은 공장 파이프라인 모델을 본뜬 것이다.

각 위치 또는 상자에서는 그것을 지나는 데이터를 맡아 특정 작업을 수행한다.

파이프라인 프로그래밍 형식에서는 모든 것을 입력 집합 하나를 출력 집합 하나에 매핑하는 연관 관계로 바라봄으로써 수학적 순수성을 달성하려 한다.

즉, 순수 파이프라인 형식에서는 시작할 때 계산에 대한 입력원과 마지막에 출력을 받는 곳 외에 상자화된 함수 외부의 세계는 존재하지 않는다.

입력값 하나를 취하고 출력 값 하나를 만들어내는 함수로 구성한다.


def read_file(path_to_file):
    with open(path_to_file) as f:
        data = f.read()
    return data

요리책 형식 (Chaptor 04) 에서는 프로시저가 입력을 취하거나 뭔가를 반환하지도 않으며 단순히 상태를 변경할 뿐이었다.

또한 멱등성을 보장하지 않았다. 파이프라인 프로그래밍 패턴은 입력에 대해 항상 동일한 출력을 만들어 낸다.

파이프 프로그래밍 패턴은 구성 요소가 어떤 형태로든 상태를 유지하지 않으면서 그 상태를 변경하는 시스템이다. 

이 아이디어를 사용한 가장 오래되고 잘 알려진 응용 프로그램 중 하나는 '유닉스 셸 파이프'다.


ps - ax | grep http

'|' 문자를 이용해 한 명령의 출력 다음 명령의 입력과 결합해 순차화할 수 있다.

파이프라인 형식은 해당 문제의 특성이 파이프라인으로 모델링할 수 있는 문제에 적합하다. 

문제에 대한 적합성 외에도 단위 테스트를 하기 매우 쉽다는 장점과 동기화 및 공유 상태에 대해 걱정하지 않고도 

이를 여러 프로세서에 간단하게 분배할 수 있는 병행성이라는 장점을 가지고 있다.