삽질의 현장/- ETC

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

shovelman 2019. 3. 23. 19:36

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

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

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

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


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

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


Chaptor 04. 요리책

  • 절차적 추상화를 이용해 규모가 큰 문제를 더 작은 단위로 분할함으로써 제어 흐름 복잡도를 완화한다. 프로시저는 입력을 취할 수 있는 기능 조각이지만 해당 문제와 관련 있는 출력을 반드시 만들어 내야하는 것은 아니다.
  • 프로시저는 상태를 전역 변수 형태로 공유할 수 있다
  • 규모가 큰 문제는 공유한 상태를 변경하거나 그 상태를 더 추가하는 프로시저를 차례로 적용해 해결한다.

큰 문제를 작은 하위 문제로 분할하고 각각을 명명한 프로시저로 다룬다. 주 프로그램에서는 프로시저 명령을 순차적으로 호출하는데 이는 복잡한 요리법을 따를 떄와 비슷하다. 그 프로시저 각각에서는 차례로, 우리가 요리법에 따라 재료의 상태를 변경하는 것과 마찬가지로 공유 변수의 상태를 변경한다.


이 형식은 외부 데이터를 내내 누적하며, 데이터에 따라 그러한 행위가 달라지는 계산 작업에 적합하다.

규모가 큰 문제를 각각 한 가지 일을 하는 하위 유닛 (프로시저)으로 분할한다

def read_file(path_to_file):
def filter_chars_and_normalize():
def scan():
def remove_stop_words():
def frequencies():
def sort():


프로시저 사이에 데이터를 공유하는 것이 일반적이다. 상태 변화는 해당 변수의 이전 값에 의존할 수 있다.

프로시저에서는 이 공유 데이터에 부수 효과(side effect)를 일으킨다.

def read_file(path_to_file):
    global data
		... (생략) ...

def scan():
    global data
    global words
		... (생략) ...

내내 상태를 변경할 수 있다는 것은 (즉, 변경 가능한 상태라면) 프로시저가 멱등(idempotent)이 아닐 수 있다는 점이다.

프로시저를 두 번 호출하면 전체 상태가 완전히 달라질 수 있고 프로그램 출력도 완전히 달라질 수 있다.

멱등성 부족은 프로그래밍 오류의 원인 중 많은 부분을 차지한다.


맺으며

1960년대 개발 프로그램 규모가 커지며 이러한 구조적 프로그래밍 시대의 막이 올랐다고 한다.