ALL

    5. 코드로 보는 객체의 자율적인 책임 | 객체지향의 사실과 오해 5장

    5. 코드로 보는 객체의 자율적인 책임 | 객체지향의 사실과 오해 5장

    1. 협력에 참여하는 객체의 책임이 자율적이어야 한다. 자율적인 책임이 설계의 품질을 좌우한다 객체지향 공동체를 구성하는 기본 단위는 '자율적'인 객체다. 자율적인 객체란 스스로 정한 원칙에 따라 판단하고 스스로의 의지를 기반으로 행동하는 객체다. 객체가 어떤 행동을 하는 유일한 이유는 다른 객체로 부터 요청을 수신했기 때문이다. 요청을 처리하기 위해 객체가 수행하는 행동이 책임이다. 즉 자율적인 객체란 스스로의 의지와 판단에 따라 각자 맡은 책임을 수행하는 객체다. 적절한 책임이 자율적인 객체를 낳고, 자율적인 객체들이 모여 유연하고 단순한 협력을 낳는다. 객체에게 할당되는 책임은 자율적이어야 한다. class King implements Judge { listenToTestimony(trialHelp..

    11. 타입 선언과 @types(2/2) | 이펙티브 타입스크립트 6장

    11. 타입 선언과 @types(2/2) | 이펙티브 타입스크립트 6장

    49. 콜백에서 this에 대한 타입 제공하기 let/const로 선언된 변수가 렉시컬 스코프인 반면, this는 다이나믹 스코프입니다. 다이나믹 스코프의 값은 정의된 방식이 아닌 호출된 방식에 따라 달라진다. this는 객체의 현재 인스턴스를 참조하는 클래스에서 가장 많이 쓰인다. class C { vals = [1, 2, 3]; logSquares() { for (const val of this.vals) { console.log(val * val); } } } const c = new C(); c.logSquares(); const method = c.logSquares(); method(); // undefined의 'vals' 속성을 읽을 수 없습니다. 내부 메서드를 외부 변수에 넣고 호출하면 ..

    10. 타입 선언과 @types(1/2) | 이펙티브 타입스크립트 6장

    10. 타입 선언과 @types(1/2) | 이펙티브 타입스크립트 6장

    45. devDependencies에 typescript와 @types 추가하기 npm은 세 가지 종류의 의존성을 구분해서 관리하며, 각각의 의존성은 package.json 파일 내 별도 영역에 들어 있다. dependencies 현재 프로젝트를 실행하는 데 필수적인 라이브러리들이 포함된다. lodash 같이 프로젝트의 런타임에 사용되는 라이브러리들이 포함되어야 한다. npm에 공개하여 다른 사용자가 설치할 경우, dependencies에 들어 있는 라이브러리도 함께 설치된다. (전이 의존성) devDependencies 현재 프로젝트를 개발하고 테스트하는 데 사용되지만, 런타임에는 필요 없는 라이브러리들이 포함된다. 트스트 프레임워크 같은 라이브러리들이 포함될 수 있다. npm에 공개하여 다른 사용자가..

    9. any 다루기(2/2) | 이펙티브 타입스크립트 5장

    9. any 다루기(2/2) | 이펙티브 타입스크립트 5장

    42. 모르는 타입의 값에는 any 대신 unknown을 사용하기 1. 함수의 반환값과 관련된 unknown 함수의 반환 타입으로 any를 사용하는 것은 좋지 않은 설계다. function parseYAML(yaml: string): any {} interface Book { name: string; author: string; } const book = parseYAML( `name: Jane Eyre author: CharlotteBronte` ); console.log(book.title); // 오류 없음. 런타임에 "undefined" 경고 book("read"); // 오류 없음. 런타임에 타입 에러 발생 대신 함수가 unknown 타입을 반환하게 만드는 것이 더 안전하다. function s..

    4. 코드로 보는 객체의 협력 관계 | 객체지향의 사실과 오해 4장

    4. 코드로 보는 객체의 협력 관계 | 객체지향의 사실과 오해 4장

    최후통첩 게임은 인간을 바라보는 두 가지 관점의 충돌을 잘 설명한다. 인간이 가지고 있는 본연의 특성이라는 관점에서 인간은 이기적으로 합리적인 존재다. 그러나 타인과 관계를 맺는 과정 속에서 인간은 본연의 특성을 배제하고 자신의 이익을 최소화하는 불합리한 선택을 하게 된다. 결론적으로 인간이 어떤 본질적인 특성을 지니고 있느냐가 아니라 어떤 상황에 처해 있느냐가 인간의 행동을 결정한다. 즉, 각 개인이 처해 있는 정황 또는 문맥이 인간의 행동 방식을 결정한다. 객체의 세계에서도 협렵이라는 컨텍스트가 객체의 행동 방식을 결정한다. 객별적인 객체의 행동이나 상태가 아니라 객체들 간의 협력에 집중하자. 1. 협력 협력의 본질은 요청과 응답으로 연결되는 네트워크다. 협력은 한 객체가 다른 객체에게 도움을 요청할..

    8. any 다루기(1/2) | 이펙티브 타입스크립트 5장

    8. any 다루기(1/2) | 이펙티브 타입스크립트 5장

    38. any 타입은 가능한 한 좁은 범위에서만 사용하기 function processBar(b: Bar) {} function expressionReturningFoo(): Foo {} function f() { const x = expressionReturningFoo(); processBar(x); // 'Foo' 형식의 인수는 'Bar' 형식의 매개변수에 할당될 수 없습니다. } x가 foo 타입과 Bar 타입에 동시에 할당 가능하다면, 오류를 제거하는 방법은 두 가지다. function f1() { const x: any = expressionReturningFoo(); // 나쁜 방법 processBar(x); } function g() { const foo = f1(); // 타입이 any ..

    7. 타입 설계(2/2) | 이펙티브 타입스크립트 4장

    7. 타입 설계(2/2) | 이펙티브 타입스크립트 4장

    33. string 타입보다 더 구체적인 타입 사용하기 문자열을 남발하여 선언된(stringly typed) 코드를 비하자. 모든 문자열을 할당할 수 있는 string보다 더 구체적인 타입을 사용하자. // 좋지 않은 예 interface Album { artist: string; title: string; releaseDate: string; recordingType: string; } // 개선한 코드 type RecordingType = "studio" | "live"; interface Album { artist: string; title: string; releaseDate: Date; recordingType: RecordingType; } 장점 1. 타입을 명시적으로 정의함으로써 다른 곳으로..

    6. 타입 설계(1/2) | 이펙티브 타입스크립트 4장

    6. 타입 설계(1/2) | 이펙티브 타입스크립트 4장

    28. 유효한 상태만 표현하는 타입을 지향하기 유효한 상태와 무효한 상태를 둘 다 표현하는 타입은 혼란을 초래하기 쉽고 오류를 유발하게 된다. interface State { pageText: string; isLoading: boolean; error?: string; } function renderPage(state: State) { if (state.error) { return "Error"; } else if (state.isLoading) { return "Loading"; } return "page"; } async function changePage(state: State, newPage: string) { state.isLoading = true; try { const response = ..