150 likes | 377 Views
Design Constraints in Data Implementation. data abstraction (abstraction barrier) is good. the performance of the users of the data depends on the implementation/representation of the data. Data Abstraction Example 3: Set. set 만드는 방법 emptyset: set add-elmt: * set -> set set 사용하는 방법
E N D
Design Constraints in Data Implementation • data abstraction (abstraction barrier) is good. • the performance of the users of the data depends on the implementation/representation of the data.
Data Abstraction Example 3:Set • set 만드는 방법 • emptyset: set • add-elmt: * set -> set • set 사용하는 방법 • emptyset?: set -> bool • get-elmt: set -> * set • member?: * set -> bool • union: set * set -> set • intersection: set * set -> set • exclusion: set * set -> set
Implementation Choices for Set • choice 1: unordered list • choice 2: ordered list • choice 3: binary search tree • implementation choice can determine the performance
데이터에 꼬리표 붙이기 Tagged data 꼬리표가 붙은 데이터 = • 데이타마다 “소속”정보가 매달려 있다. • 데이터를 이용할 때는 그 소속을 확인하고 그 소속에 맞는 작업을 한다.
데이터에 꼬리표 붙이기: 왜? • 하나의 data type을 만드는 다양한 방법이 있다. • tree인 경우: leaf, node • list인 경우: nil, link • symbolic expression인 경우: const, var, sum, product • 주어진 data가 어떤 경우인가? 를 알수 있게 하려면? 꼬리표를 덧붙인다. • leaf tree인가? node tree인가? • nil list인가? link list인가? • const expr인가? var expr인가? sum expr인가? product expr인가?
tree data • tree 만들기 • leaf : -> tree • node : tree list -> tree • tree 사용하기 • leaf-val : tree -> • is-leaf? : tree -> bool • is-empty-tree? : tree -> bool • nth-subtree : tree * nat -> tree
(define leaf-tag ‘l) (define node-tag ‘n) (define (leaf v) (cons leaf-tag v)) (define (node lst) (cons node-tag lst)) (define (is-empty-tree? tree) (and (equal? (car tree) node-tag) (null? (cdr tree)) ) ) (define (is-leaf? tree) (equal? (car tree) leaf-tag) )
boolean circuit data • boolean circuit 만들기 • one: circuit • zero: circuit • not : circuit -> circuit • and : circuit * circuit -> circuit • or : circuit * circuit -> circuit • boolean circuit 사용하기 • is-one? : circuit -> bool • is-zero? : circuit -> bool • is-not? : circuit -> bool • is-and? : circuit -> bool • is-or? : circuit -> bool • nth-circuit : circuit * nat -> circuit
(define one-tag ‘one) (define zero-tag ‘zero) (define not-tag ‘not) (define and-tag ‘and) (define or-tag ‘or) (define one one-tag) (define zero zero-tag) (define (not circuit) (cons not-tag circuit)) (define (and c1 c2) (cons and-tag (cons c1 c2))) (define (or c1 c2) (cons or-tag (cons c1 c2))) (define (is-one c) (equal? one-tag c)) (define (is-zero c) (equal? zero-tag c)) (define (is-and c) (equal? and-tag (car c))) (define (is-or c) (equal? or-tag (car c)))
symbolic expression data • 식 만들기 • const : int -> expr • var : string -> expr • sum : expr * expr -> expr • product : expr * expr -> expr • 식 사용하기 • is-const? : expr -> bool • is-var? : expr -> bool • is-sum? : expr -> bool • is-product? : expr -> bool • const-val: expr -> int • var-name: expr -> string • addend: expr -> expr • augend: expr -> expr • multiplier: expr -> expr • multiplicand: expr -> expr
(define const-tag ‘c) (define var-tag ‘v) (define sum-tag ‘+) (define prod-tag ‘*) (define (const n) (cons const-tag n)) (define (var x) (cons var-tag x)) (define (sum e1 e2) (cons sum-tag (cons e1 e2))) (define (product e1 e2) (cons prod-tag (cons e1 e2))) (define (is-const? e) (equal? (car e) const-tag)) (define (is-var? e) (equal? (car e) var-tag)) (define (is-sum? e) (equal? (car e) sum-tag)) (define (is-product? e) (equal (car e ) prod-tag))
꼬리표를 붙이면 또 어떤 잇점이? • 안전한 프로그래밍 defensive programming • 함수들이 주어진 데이터가 적절한지 첵크하기 좋다: sanity check, type check • 중요: 최대한 빨리 오류를 감지하기. • 데이타가 주도하는 프로그래밍 data-directed programming • 함수들이 주어진 데이터의 소속에 따라서 하는 일을 정한다.
안전한 프로그래밍 defensive programming • dynamic type checking: • 함수의 인자가 그 함수가 예상하는 타입의 인자인가? • 그러하면, 그 중에서 어떤 경우인가? (define (nth-child tree n) (cond ((is-leaf? tree) (error)) ((is-empty-tree? tree) (error)) ((< n 0) (error)) (else …) ) )
안전한 프로그래밍defensive programming • 안전수칙 0: 함수를 정의할 때, 함수 타입에 맞는 데이터를 받는지 확인한다. 꼬리표+기타 방식으로. • 안전수칙 1: 함수를 정의할 때, 타입에 맞는 데이터 중에서 원하는 경우의 데이터인지를 확인한다. 꼬리표를 가지고. • 안전불감증 vs 안전집착: • 불감 보다는 집착이 좋다. • 실행중에 “옳지않은” 값이 나도 모르게 흘러다니는 것 보다는 그럴 경우 바로 중단시키는 것이 좋다.
안전수칙을 지키고 있는가? (define (nth-child tree n) (cond ((is-leaf? tree) (error)) ((is-empty-tree? tree) (error)) ((< n 0) (error)) (else …) ) ) 어떻게되나? (nth-child (cons 1 2) 1) (nth-child a-node-tree (fac 10))