표현이 아니라 인터페이스로 만든다.
생성자와 선택자를 사용하면 프로그램 곳곳에 순서쌍 표현 방식을 퍼뜨리지 않고 유리수를 사용할 수 있습니다.
생각해 볼 질문
추상화 장벽은 어떤 변경에서 우리를 보호해 줄까요?
- 추상 값과 그 표현을 구분하기
- 생성자와 선택자만 경계로 사용하기
- 추상화 안쪽으로 직접 들어가는 코드 알아보기
make-rat은 유리수 값을 만들고 numer와 denom은 그 부분을 꺼냅니다. add-rat은 car나 cdr, 또는 순서쌍에 두 항목을 넣은 순서를 직접 알 필요 없이 세 프로시저에만 의존합니다.
순서쌍은 유용한 구현 장치이지만 공개해야 할 생각 그 자체는 아닙니다. 표현 방식에 대한 지식을 작은 인터페이스 뒤에 두면 나중의 변경이 다른 코드까지 퍼지지 않습니다.
(begin
(define (make-rat n d) (cons n d))
(define (numer x) (car x))
(define (denom x) (cdr x))
(define (add-rat x y)
(make-rat (+ (* (numer x) (denom y))
(* (numer y) (denom x)))
(* (denom x) (denom y))))
(let ((answer (add-rat (make-rat 1 2) (make-rat 1 3))))
(/ (numer answer) (denom answer))))리스펙스 학습용 런타임리스펙스 SICP 프로필 1.0.0
리스펙스 SICP 런타임 불러오는 중
리스펙스 · SICP 코드UTF-8 346 / 1,048,576바이트
예제
결과—
- 출력
- —
- 값
- —
- 진단
- —
보이는 실행 흐름0 / 0 개의 실행 이벤트
첫 프로그램은 정확한 유리수 값 5/6을 반환합니다.
make-rat과 numer와 denom 호출을 따라가세요. add-rat은 순서쌍 연산을 직접 쓰지 않으므로 저장 순서를 실행 과정에 드러내지 않습니다. 이 실행 흐름은 한 번의 실행을 보는 제한된 학습 화면이며 리스펙스 바우치나 권한이 아닙니다.
힌트를 보기 전에 프로그램을 바꿔 보세요.
make-rat에서 분모를 먼저 저장하세요. numer와 denom만 바꾼 다음 add-rat이 여전히 5/6을 반환하는지 확인하세요.
힌트 하나 보기
add-rat까지 바꿔야 한다면 표현 방식에 대한 지식이 추상화 장벽을 넘어온 것입니다.