공개 생성자? (Domenic Revealing Constructor Pattern)
일반적인 디자인 패턴 아님, JS 독자적임
https://blog.domenic.me/the-revealing-constructor-pattern/
The Revealing Constructor Pattern
I want to document an interesting pattern we’ve seen emerge in some recent web platform specs, including promises and streams. I’m calling it the revealing constructor pattern. The Promises Example Let’s take the case of promis...
blog.domenic.me
이거 참고해서 보면 될듯
"객체가 생성되는 순간에만 객체의 내부적인 기능의 일부를 노출"
객체의 내부가 생성 단계에서만 조작 허용
- 생성 시에만 수정할 수 있는 객체
- 생성 시에만 사용자 정의 동작을 정의
- 생성 시 한번만 초기화
const object = new SomeClass(function executer(revealedMembers) {
// 멤버 변수 조작 코드 ...
});
세가지 기본 구성으로 이뤄짐
- 생성시 호출되는 함수 실행자 (executer)
- 위의 실행자를 입력으로 받는 생성자 (someClass)
- 함수에 전달되는 객체 내부의 필요 변수들, 공개 멤버 변수들 (revealedMembers)
객체 생성 이후 객체의 사용자가 공개된 함수에 접근 할 수 없어야 한다.
1. 변경 불가능한 버퍼 만들기 (immutable)
변경 불가능한 객체와 데이터 구조는 이상적인 속성 가짐
함수로 전달하기 전에 원본변조 방지를 위해 복사본을 만들 필요가 없음
제어할 수 없는 코드로 전달되어도 수정되지 않음을 보장
변경 불가능한 객체를 수정하는것은 새로운 복사본을 통해서만 가능
값의 변경 이유를 명확히 하여 코드의 유지보수를 쉽게 함
변경을 효율적으로 감지
완전 항등 연산자(===)로 변경 감지
생성시에만 변경하고 그 이후 변경 조작이 불가능한 버퍼,
Buffer 컴포넌트를 공개생성자로 만들어볼거임
const MODIFIER_NAMES = ['swap', 'write', 'fill'];
export class ImmutableBuffer {
constructor (size, executer) {
const buffer = Buffer.alloc(size);
// buffer 을 변경 할 수있는 함수들을 보관하는 객체 리터럴 생성
const modifiers = {};
for (const prop in buffer) {
// 버퍼 수정 함수 판단
if (typeof buffer[prop] !== 'function') {
continue;
}
if (MODIFIER_NAMES.some(m => prop.startWith(m))) {
modifiers[prop] = buffer[prop].bind(buffer);
} else {
// 아니면 현재 인스턴스에 추가
this[prop] = buffer[prop].bind(buffer);
}
}
executer(modifiers);
}
}
실제로 ImmutableBuffer는 사용자와 내부 buffer 객체 사이에 프록시 역할을 함
일부함수는 인터페이스를 통해 직접 호출되는 반면 다른 함수들은 실행함수(modifiers 내 함수)에 전달
예제 구현
// Sample.js
import { ImmutableBuffer } from './immutableBuffer.js';
const hello = 'hello!';
const immutable = new ImmutableBuffer(hello.length,
({write}) => {
write(hello);
})
console.log(String.fromCharCode(immutable.readInt8(0)));
// 다음과 같은 에러 발생
// "TypeError: immutable.write is not a function"
// immuatable.write("hello?");
버퍼를 변경하지 않는 함수는 공개, 변경하면 노출 안되지 않도록 만들어짐
Summary
매우 강력한 보장을 제공
완벽한 캡술화를 제공해야 할 경우 사용
고정된 인터페이스로 업격한 캡슐화를 제공해야 하는 컴포넌트일 경우 완벽한 예제가 됨
안정성을 높이고 다른 팀과의 코드 공유를 단순화 가능
=> 제 3자가 객체를 더 안전하게 사용 가능
공개 생성자의 대표적인 프로그램은 JS Promise 클래스
내부 상태 변경 resolve(), reject() 함수를 인자로 하는 실행함수를 입력으로 받음
return new Promise((resolve, reject) => {
// ...
})
일단 생성되면 Promise 의 상태를 변경하는 방법이 없음
사용자가 할 수 있는 일은 이행값이나 거부 이유를 수신하는 것 뿐
'Javascript > Node.js' 카테고리의 다른 글
Wiring Pattern - 생성자 디자인 패턴 (0) | 2022.02.03 |
---|---|
Singleton Pattern - 생성자 디자인 패턴 (0) | 2022.02.03 |
Builder Pattern - 생성자 디자인 패턴 (0) | 2022.02.03 |
Factory Pattern - 생성자 디자인 패턴 (0) | 2022.02.03 |
디자인 패턴 (0) | 2022.02.03 |
댓글