의사결정
1. DRY (Don’t Repeat Your self)
•
반복하지 마라
•
중복코드 배제
2. 할리우드 법칙 : TDA (Tell Don’t Ask)
•
물어보지 말고 그냥 시켜라.
•
어떤 객체로부터 정보를 가져와서 판단하지 말고 그 객체가 판단하도록 시키자.
3. 디미터 법칙
•
객체의 내부 구조에 강하게 결합되지 않도록 협력 경로를 제한하는 것.
•
열차 중복 사고 방지.
•
예외 : this, props, (map, filter)등의 JS의 고차함수, 자료구조
4. Macro 2 Micro (입력에서 출력으로)
•
입력에서 출력으로 코딩. 호스트코드의 도출
•
호스트코드 : 실제 그 업무를 처리하는 책임을 지는 코드. 호스트코드가 처리해야할 문제를 개별적인 객체에게 위임한다.
•
호스트코드 역할 : 로직은 오직 책임져야하는 작은 범위만, 실제 코드는 위임할 객체와 그 객체와의 통신(메소드 호출등)만 기술. 즉, 본인의 문제를 역할변 객체에게 위임하여 해결하는 것.
•
호스트코드와 객체간의 관계 : 호스트코드는 객체에게 위임할 때, 실제로 실행이 잘되는지 작동이 잘되는지 알 필요가 없다.
•
추가사항 : ( YAGNI - You Ain’t Gonna Need it ) 정말 필요할 때까지 그 기능을 만들지 말라. 미리 함수나 코드를 작성하지말고 지금 필요한 기능만 추가해야한다.
5. 객체 컨텍스트 (undefined, null 사용X)
•
데이터의 Type : undefined, null 사용 X ( 이유 : 모든 함수마다 undefined, null을 체크해주어야 한다. )
•
EMPTY 로 null 체크를 대체한다.
6. 계약기반 프로그래밍 (Contract Programming)
•
pre-condition(선행조건) : 로직이 실행되기 전 보장해야 할 조건.
◦
False값이나 코드가 비교적으로 더 짧은 조건을 preCondition으로 체크
// 예) 언어 Typescript
function sum(num1: number, num2: number): number { // num1에 대한 검증
if (typeof num1 !== 'number' || Number.isNaN(num1)) {
throw new Error('invalid num1')
} // num2에 대한 검증
if (typeof num2 !== 'number' || Number.isNaN(num2)) {
throw new Error('invalid num2')
}
return num1 + num2
}
sum(1, 'aa'); // error - invalid num2
sum(NaN, 1); // error - invalid num1sun(1, 2) // 3
TypeScript
복사
◦
post-condition(후행조건) : 로직 실행 이후 로직이 보장해야 할 조건.
// 예) 언어 Typescript
function divide(num1: number, num2: number): number {
const result = num1 / num2 // result에 대한 검증
if (result > num1) {
throw new Error('invalid result')
}
return result
}
divide(1, 0.5) // error - invalid resultdivide(10, 2) // 5
TypeScript
복사
•
invariants(불변식) : 호출자의 입장에서 볼 때는 이 조건이 언제나 참이라고 클래스가 보장. 로직 내부 처리 중에는 불변식이 참이 아닐 수도 있지만, 로직이 종료하고 호출자로 제어권이 반환되는 때에는 불변식이 참이 되어야 한다.
// 예) 언어 Typescript
export class CustomDate {
static EMPTY = new CustomDate(new Date());
constructor(date: Date) {
this.date = date;
}
...
toString(): string {
if (this === CustomDate.EMPTY) throw new Exception('CustomDate is Empty'); // invariants
return this.date.toString();
}
...
}
TypeScript
복사