🖤

OOP 의사결정

의사결정

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
복사