Exercises in Programming Style

Jinhan Choi
5 min readSep 13, 2020

--

  1. Historical
    Good old times
    주기억장치 용량이 제한적. 임의의 용량만큼만 데이터를 읽어서 처리하고 보조기억장치에 누적, 그리고 반복. 끝까지
    Big data 처리 방식과 흡사한 면이 많음

    Go Forth
    Stack만 사용하여 모든 연산을 처리하는 방식
    데이터를 읽어오는 동작 역시 스택에 push하고 pop해서 처리하고 결과를 다시 push하고 사용하는 식으로 동작을 이어간다.
    stack, heap 두 영역을 정의하고 사용함.
  2. Basic Styles
    Monolitic
    명명된 추상화 없다, 라이브러리를 전혀 또는 거의 사용하지 않고, 다 구현한다. 즉 한 코드 흐름에 모든걸 조건문과 반복문으로 순차적으로 처리한다.(control flow)
    CookBook
    Long jump가 없다 (프로시저로 절차를 분해, 추상화)
    부수효과 존재 : 프로시저는 상태를 전역 변수 형태로 공유
    Pipeline
    규모가 큰 문제를 함수로 추상화 하여 분해, 함수 = 입력 → 출력 , 부수효과 없음, 상태공유 안함
    함수의 호출의 파이프라인 shell | 과 같은 형태로 이어짐.
    Code Golf
    코드 줄 수를 가능한 적게
  3. Function Composition
    Infinite Mirror
    재귀를 사용한다.
    귀납법을 사용해 모델링 한다.
    기초사례에서 이어지는 규칙을 만들어서 정의
    Kick Forward
    파이프라인 형식의 변형
    각 함수에서 추가 매개변수를 받는데 다른 함수를 받음.
    현재 함수 처리의 마지막에 그 함수를 적용(apply), 호출
    현재 함수의 출력값을 그 함수의 입력값으로 사용.
    CPS(Continuation-passing style)
    연속성: 프로그램의 나머지를 나타내는 함수
    The One
    값이 변환될 대상인 추상화가 존재.
    이 추상화는 값을 감싸 그 값을 해당 추상화로 만들고,
    자신을 함수와 결합해 일련의 함수를 수립하며,
    최종 결과를 살펴볼 수 있도록 그 값을 풀어내는 연산을 제공
    Monad : 일련의 단계로 정의한 계산을 캡슐화한 구조. wrap, bind
  4. Objects and Object Interaction
    Things
    일반적으로 객체 지향의 class를 정의하는 행위와 같다.
    각 사물은 데이터의 캡슐, 나머지 세상에 프로시저를 노출한다.
    직접 접근 절대 안되고, 오직 프로시저를 통해서만 접근한다.
    캡슐은 다른 캡슐에서 정의한 프로시저를 사용 할 수 있다.
    LetterBox
    규모가 큰 문제를 문제 영역에 합당한 thing으로 분해한다.
    각 사물은 데이터 캡슐이며, 하나의 프로시저를 노출 한다.
    이 프로시저를 통해 메세지를 받고 처리(dispatch)할 수 있다.
    메세지 처리 결과를 다른 캡슐에 메세지로 보낼 수 있다.
    엑터 모델과 기본개념 같음
    Closed Maps
    javascript 의 프로토타입을 생각하면 쉬움.
    맵에서 어떤 key는 값을 나타내고, 어떤 key는 함수 자체를 나타낸다.
    Abstract Things
    추상클래스나 인터페이스를 이용한 일반적인 방식의 기본을 생각하면 됨
    Hollywood
    IOC:inversion of control
    개체는 다른 개체가 콜백을 등록 할 수있는 인터페이스 제공
    어떤 시점에 개체는 콜백에 등록된 다른 개체를 호출해 준다. push
    어떤 행동을 하기 위해 개체를 절대로 직접 호출 하지 않는다.
    Bulletin Board
    pub-sub
    이벤트를 발행하고 구독하는 기반 주고, 게시판이 존재한다.
    구독 하거나 발행 한다. 절대 직접 호출 하지 않는다.pull
  5. Reflection and Metaprogramming
    Introspective
    자기 자신을 살펴 본다. 수정하거나 고치지는 않고 살펴본 정보들을 이용하기만 한다. (변경안하고 접근만)
    Reflective
    내가 아는 리플렉션.
    리플렉션은 설계 시점에 프로그램의 변경 여부를 예측할 수 없을 때 필요하다.
    Aspect
    Plugins
  6. Adversity (재난)
    Constructivist (구성주의): 에러나면 빈 list를 리턴하는 것 처럼, 어느정도 보정을 해주고 프로그램이 계속 이어가도록
    Tantrum(발끈하기): 함수 단위로 exception 잡고 raise
    Passive Aggressive(수동공격): main function에서 try catch로 하나로 잡아서 처리
    Declared Intentions(선언한 의도): 인자의 타입이 안맞으면 오류 발생(기대한 것이 아니면 선언한 의도대로 뱉어버림)
    Quarantine(격리): IO같은 부수 효과는 반드시 순수함수와 분리되어야 한다.
  7. Data-Centric(데이터 중심)
    Persistent tables : Rdb를 쓰는 접근 방식(영속화 해서 처리하는)
    Spreadsheet: 값과 함수 쌍으로 스프레스 시트처럼 접근하는 방식
    Lazy Rivers(게으른강): 데이터는 한 덩어리가 아니라 스트림으로 사용 할 수 있다. 함수는 한 데이터스트림을 다른 것으로 바꾸는 필터/변환기 이다.
  8. Concurrency
    Actors
    Dataspaces: BlockingQueue에 값 넣고 처리하는 방식(공통 공유 공간)
    MapReduce
    Double Map Reduce: 하둡에서 차용한 방식, 위와 차이점은 리그룹핑이 있음
  9. Interactivity(쌍방향성)
    Trinity(삼위일체): mvc
    Restful

--

--

No responses yet