풀스택 웹🌐 개발자 지망생 🧑🏽‍💻
➕ 인공지능 관심 🤖


Categories


Recent views

  • 1
  • 2
  • 3
  • 4
  • 5

어떻게 코딩할 것인가-세계 설계

  1. 세계 설계 과정

세계 설계

🗣️ quote

Edx 강의 How to Code 시리즈를 정리한 내용입니다.

이곳에서의 세계는 곧 프로그램, 예시로 반응성 프로그램을 의미하는듯 하다.
하지만 세계 설계를 다른 프로그램에 적용하여 사용할 수 있다.

빅뱅 함수 ?
상태를 읽어 프로그램을 동작시키는 함수
변화될 세계 상태와 세계 상태를 바꾸고 상호작용할 핸들러 함수들을 인수로 받아 해당 세계 상태 시 해당 함수들을 실행하게 하는 함수

  • 세계 상태의 예시 : 시간(tick)
  • 행해질 옵션 함수 예시 : 화면 표시, 세계 상태 변경, 키 입력 시 행동

세계 설계 과정

세계 설계는 두 가지 단계로 이루어져 있다.

  1. 도메인 분석 단계 : 다이어그램 등으로 설계할 세계에 대한 분석을 통해 모델을 형성하는 단계
    1. 프로그램 시나리오 작성
    2. 상수 정보 식별
    3. 변수 정보 식별
    4. 빅뱅 함수 정의
  2. 프로그램 구현 단계: 실제 설계와 구현이 이루어 지는 단계
    1. 상수 정보 입력
    2. 데이터 정의
    3. 함수 정의
      1. 메인 함수 정의(빅뱅 함수 정의)
      2. 메인 함수 인자인 위시리스트 항목 정의
    4. 위시리스트 항목 디버깅 및 테스트

도메인 분석 단계


1. 프로그램 시나리오 작성 : 고양이가 시간이 지나며 화면을 가로지르는 프로그램
2. 상수 정보 식별 : 고양이 사진, 화면 크기, 고양이 사진 y 위치 등은 바뀌지 않음
3. 변수 정보 식별 및 정의: 고양이 사진 x 위치는 시간이 지나며 바뀜
4. 빅뱅 함수 정의 : 시간을 세계 상태로 받아 고양이 사진을 적절한 위치에 맞게 배치하는 옵션 함수 이용

프로그램 구현 단계

템플릿?
함수, 프로그램을 구체적으로 작성하기 이전에 불변할 기본적인 구조와 알고리즘, 정보 등을 표시한 것

  • 템플릿을 이용해 디자인 과정을 여러 처리 과정으로 나누며 이러한 여러 처리 과정을 각 함수마다 실행하게 하여 큰 문제를 잘게 쪼갤 수 있게 한다.
🧾️ 세계 설계 템플릿

추적성 : 도메인 분석 단계에서 분석했던 모델 정보가 반영되도록 템플릿을 설계하자.

  • 사람들이 사용하는 프로그램은 언제나 변화를 필요로 하므로 문서화와 좋은 추적성을 가진 코드가 중요
  • 상수명 등을 일치시키자.
# import libraries
{: #import-libraries}

# My world program  (make this more specific)
{: #my-world-program-make-this-more-specific}
# =================
{: #}
# Constants:
{: #constants}


# =================
{: #}
# Data definitions:
{: #data-definitions}

# WS is ... (give WS a better name)
{: #ws-is-give-ws-a-better-name}
# interp. the last x-coordinate of the mouse 
{: #interp-the-last-x-coordinate-of-the-mouse}
# (define WS1 100)
{: #define-ws1-100}
# (define WS2 4)
{: #define-ws2-4}
#(define (fn-for-ws ws)
#  (... ws))
{: #ws}


# =================
{: #}
# Functions:
{: #functions}

# WS -> WS
{: #ws-ws}
# start the world with ...
{: #start-the-world-with}
# 
def main(ws):
	return BigBang(
		ws, # ws
		onTick=tock, # WS -> WS
		toDraw=render, # WS -> Image
		# stopWhen=..., # WS -> Boolean
		# onMouse=..., # WS Integer Integer MouseEvent -> WS
		# onKey=... # WS KeyEvent -> WS
	)
# WS -> WS
{: #ws-ws}
# produce the next ...
{: #produce-the-next}
# !!!
{: #}
def tock(ws):
	#...
	pass

# WS -> Image
{: #ws-image}
# render ... 
{: #render}
# !!!
{: #}
def render(ws)
	#...
	pass
🧾️ 세계 설계 템플릿 예시
import Image
import BigBang

# 고양이가 스크린을 가로지르는 프로그램
{: #고양이가-스크린을-가로지르는-프로그램}
# - 추적성을 고려하여 도메인 분석 단계를 참조하여 작성하기
{: #추적성을-고려하여-도메인-분석-단계를-참조하여-작성하기}
# =================
{: #}
# Constants: 
{: #constants}# 상수 정보 입력 단계
WIDTH = 600
HEIGHT = 400

# 단일 지점 제어(single point of control)
{: #단일-지점-제어-single-point-of-control}
# ex) HEIGHT가 바뀌면 자동으로 CTR-Y도 바뀌게 HEIGHT를 이용해 상수 정의
{: #ex-height가-바뀌면-자동으로-ctr-y도-바뀌게-height를-이용해-상수-정의}
CTR_Y = HEIGHT/2 
MTS = Image(WIDTH, HEIGHT)
CAT = Image("Cat")
# =================
{: #}
# Data definitions: 
{: #data-definitions}# 데이터 정의 단계

# Cat is Number
{: #cat-is-number}
# interp. x position of the cat in screen coordinates
{: #interp-x-position-of-the-cat-in-screen-coordinates}
C1 = 0 # left edge
C2 = WIDTH/2 # middle
C3 = WIDTH # right edge

# Template
{: #template}
# def fnForCat(c):
{: #def-fnforcat-c}
# 	
{: #	}# ...c
# 	pass
{: #	pass}

# Template rules used:
{: #template-rules-used}
# - atomic non-distinct: Number
{: #atomic-non-distinct-number}

# =================
{: #}
# Functions: 
{: #functions}# 함수 정의 단계

# CAT -> CAT
{: #cat-cat}
# start the world with (main 0)
{: #start-the-world-with-main-0}
# 
def main(c):
	return BigBang(
		c, # ws
		onTick=advanceCat, # CAT -> CAT
		toDraw=render # CAT -> Image
	)

# 핸들러 함수 정의
{: #핸들러-함수-정의}
# CAT -> CAT
{: #cat-cat}
# produce the next cat, by advancing it 1 pixel to right
{: #produce-the-next-cat-by-advancing-it-1-pixel-to-right}
# !!!
{: #}
def advanceCat(c):
	return 0

# CAT -> Image
{: #cat-image}
# render the cat image at appropriate place on MTS
{: #render-the-cat-image-at-appropriate-place-on-mts}
# !!!
{: #}
def render(c):
	return MTS
# 위시리스트 구현은 아래 참조
{: #위시리스트-구현은-아래-참조}

프로그램 수정

보통 프로그램들은 간단한 모델을 만든 뒤, 프로그램 구현 후, 부족한 점이나 보완할 점을 수정하며 복잡한 시스템으로 발전시키는 방식으로 만드므로, 프로그램 수정은 아주 중요하다.

도메인 분석 단계의 모델을 수정 후, 다른 단계들 또한 다시 수정하면 된다.

  • ex) 고양이 SPEED 조정 기능 추가 -> Constant SPEED 추가 후, 위시리스트 재구성 뒤 함수 구현