본문 바로가기

전체 글57

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.
3장 - 긴 코드 조각내기 for 메서드 다섯 줄 제한(FIVE LINES) 메서드 다섯 줄 제한(FIVE LINES)을 지키위 위한 리팩터링 패턴 3가지 1. 메서드 추출(EXTRACT METHOD) 2. 호출 또는 전달, 한 가지만 할 것(EITHER CALL OR PASS) 3. if 문은 메서드의 시작에만 배치 예제 코드 : https://github.com/wikibook/five-lines 1. 메서드 추출(EXTRACT METHOD) function draw() { let canvas = document.getElementById("GameCanvas") as HTMLCanvasElement; let g = canvas.getContext("2d"); g.clearRect(0, 0, canvas.width, canvas.height); // 맵 그리기 for (let.. 2024. 1. 31.
2장 - 리팩터링 깊게 들여다보기 리팩터링? -> 기능을 변경하지 않고 코드의 가독성과 유지보수가 쉽도록 코드를 변경하는 것 가독성 : 의도를 전달하기 위한 코드의 성질 코드에서 의도를 전달하는 방법 - 컨벤션, 주석, 변수, 메서드, 클래스 및 파일 이름, 공백 사용 등 유지보수성 : 버그를 고치거나 기능을 추가하기 위해 코드를 수정할 후보가 얼마나 많은지 나타냄 시스템이 취약하다 = 시스템에서 A를 수정했는데 B에도 영향이 가는 경우 이때, 취약성의 근원은 일반적으로 전역상태(global state) 때문! 전역상태(global state) : 프로그램이 실행되는 동안 변경될 수 있는 모든 것. ex) 모든 변수, DB의 데이터, 하드디스크 안의 파일 등 특히, 불변속성(invariant) 변수로 인해 시스템의 취약성이 증가한다 불변.. 2024. 1. 29.