삽질의 현장/- ETC

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

shovelman 2019. 3. 23. 19:33


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

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

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

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


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

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


Chaptor 03. 일체식

  • 명명된 추상화가 없다.
  • 라이브러리를 전혀 또는 거의 사용하지 않는다.

저수준 프로그래밍 언어를 사용하고 비교적 프로그램 규모가 작았던 컴퓨터 프로그래밍 초기에 사용한 형식

일체식은 응용 프로그램에서 해야 할 모든 것을 처리하는 단일 구성 요소를 나타낸다.

시스템을 모듈식 하위 구성요소로 분리하고, 특정 기능 조각을 담당하는 것과 대조적이다.

추상화를 추가하지 않고 라이브러리에서 제공하는 것도 사용하지 않으면서 코드를 하나로 구성한다.

#-*- coding: utf-8-*-
#!/usr/bin/env python

import sys, string
# [단어, 빈도] 쌍으로 구성된 전역 리스트
word_freqs = []
# 의미 없는 단어 목록
with open('../stop_words.txt') as f:
    stop_words = f.read().split(',')
stop_words.extend(list(string.ascii_lowercase))

# 전체 파일을 한 번에 한 줄씩 순회한다
for line in open(sys.argv[1]):
    start_char = None
    i = 0
    for c in line:
        if start_char == None:
            if c.isalnum():
                # 단어 시작을 찾을 경우
                start_char = i
        else:
            if not c.isalnum():
                # 단어 끝을 찾았을 경우
                found = False
                word = line[start_char:i].lower()
                # 의미 없는 단어를 무시한다.
                if word not in stop_words:
                    pair_index = 0
                    # 이미 존재하는지 확인하자
                    for pair in word_freqs:
                        if word == pair[0]:
                            pair[1] += 1
                            found = True
                            found_at = pair_index
                            break
                        pair_index += 1
                    if not found:
                        word_freqs.append([word, 1])
                    elif len(word_freqs) > 1:
                        # 재배열 해야 한다.
                        for n in reversed(range(pair_index)):
                            if word_freqs[pair_index][1] > word_freqs[n][1]:
                                #교환 한다
                                word_freqs[n], word_freqs[
                                    pair_index] = word_freqs[
                                    pair_index], word_freqs[n]
                                pair_index = n
                # 초기화
                start_char = None
    i += 1

for tf in word_freqs[0:25]:
    print (tf[0], ' -' , tf[1])


맺으며

"어떤 상황에서는 프로그램 작업에 내재된 복잡도를 독자에게 명확하게 제시하기 위해 긴 프로그램 본문이 필요할 수도 있다.

십중팔구는 그리 자주 필요하진 않겠지만 말이다." → 공감 100%


일체형임을 인식하고 그렇게 만든 이유를 이해하려고 노력하는 것이 중요하다. → 왜 그렇게 작성했니!?