본문 바로가기

전체 글59

항해플러스 수료 회고 작성중,, 2025. 3. 6.
항해플러스 할인 코드 : K2aSQG(20만원 할인) 추천 코드 : K2aSQG20만원 할인!! 2025. 1. 20.
6장 - 데이터 보호 getter & setter를 사용하지 말 것 OOP의 특징중 하나인 캡슐화를 배울 때 getter와 setter는 private 필드를 다루기 위한 메서드로 함께 배운다. but, 객체의 필드에 대한 getter가 존재하는 순간 캡슐화를 해제하고 불변속성을 전역적으로 만들게 된다. -> 객체를 얻은 어느 곳에서나 getter와 setter를 호출할 수 있게되며 예상치 못한 에러를 발생시킬 수 있다. pull-based 아키텍쳐 - 데이터를 한 곳으로 가져와 연산을 함 push-based 아키텍쳐 - 데아터를 가져오는 대신 인자로 데이터를 전달함 pull-based 아키텍쳐 예제 class Website { constructor(private url: string) {} getUrl() { return .. 2024. 2. 26.
5장 - 유사한 코드 융합하기 유사 클래스 통합 상수 메서드를 공통으로 가진 두 개 이상의 클래스에서 각 클래스에 따라 다른 값을 반환하는 패턴이 보인다면 하나의 클래스로 통합할 수 있다. 아래 코드는 세 개의 신호등 클래스를 나타내고 있다. function nextColor(t: TrafficColor) { if (t.color() === "green") return new Green(); else if (t.color() === "yellow") return new Yellow(); else if (t.color() === "red") return new Red(); } class Red implements TrafficColor { color(): string { return "red"; } check(car: Car): voi.. 2024. 2. 17.
4장 - 타입 코드 처리하기 [긴 if 문 리팩터링] 긴 if 문 리팩터링 drawMap 메서드는 '다섯줄 제한 규칙'과 '함수 시작에만 if 문 배치' 규칙을 위반한다. function drawMap(g: CanvasRenderingContext2D) { for (let y = 0; y < map.length; y++) { for (let x = 0; x < map[y].length; x++) { if (map[y][x] === Tile.FLUX) g.fillStyle = "#ccffcc"; else if (map[y][x] === Tile.UNBREAKABLE) g.fillStyle = "#999999"; else if (map[y][x] === Tile.STONE || map[y][x] === Tile.FALLING_STONE) g.fillStyle .. 2024. 2. 5.
4장 - 타입 코드 처리하기 [간단한 if 문 리팩터링] if 문에서 else를 사용하지 말 것 if 문에서 else를 사용하지 말라는 이유는 다음과 같다. 1. if-else를 사용하면 코드에서 결정이 내려지는 지점을 고정하게 된다 -> 기능 추가에 있어서 코드의 유연성이 떨어진다. 2. if-else는 하드코딩된 상수와 같다. 3. if-else는 이른 바인딩(early binding)이다. 이것의 반대는 늦은 바인딩(late binding)이고, 늦은 바인딩은 코드 추가를 통한 변경을 가능하게 한다. (클래스로 타입 코드 대체, 전략 패턴 도입) 이른 바인딩(early binding) : 컴파일 타임에 결정 늦은 바인딩(late binding) : 런타임에 결정 (이 책에서 바인딩의 의미는 2장에서 설명한 컴포지션을 설명하는 듯..) 숫자 배열에서 평균을.. 2024. 2. 3.