본문 바로가기

개발/책읽기11

Refactoring - Replace Function with Command Martin Fowler - Refactoring을 읽고 정리한 글입니다.(337~343p) // Before function score(candidate, medicalExam, scoringGuide) { let result = 0; let healthLevel = 0; // long body code } // After class Scrorer { constructor(candidate, medicatExam, scroingGuide) { this._candidate = candidate; this._medicalExam = medicalExam; this._scoringGuide = scoringGuide; } execute() { this._result = 0; this._healthLevel .. 2020. 1. 2.
Refactoring - Introduce Assertion Martin Fowler - Refactoring을 읽고 정리한 글입니다.(302~304p) // Before if (this.discountRate) base = base - (this.discountRate * base); // After assert(this.discountRate >= 0); // assert 추가 if (this.discountRate) base = base - (this.discountRate * base); 예제는 할인하는 코드. 만약에 discountRate가 0이면 할인이 안됨. Motivation 특정 조건을 만족시켜야 동작하는 코드가 있을 때 추론하기보다는 어썰션이 있으면 좋다. 어썰션은 항상 참일 것을로 추정되는 컨디셔널 스테이트먼트다. 실패하면 에러를 일으킨다. 어.. 2019. 12. 31.
Refactoring - Decompose Conditional Martin Fowler - Refactoring을 읽고 정리한 글입니다.(260~262p) // Before if (!aDate.isBefore(plan.summerStart) && !aDate.isAfter(plan.summerEnd)) charge = quantity * plan.summerRate; else charge = quantity * plan.regularRate + plan.regularServiceCharge; // After if (summer()) charge = summerCharge(); else charge = regularCharge() 조건문 분해. 프로그램의 복잡도를 올리는 가장 흔한 요소는 조건부 로직이다. 다양한 조건의 코드를 쓰면 함수는 길어져도 빨리 끝낼 수 있다.. 2019. 12. 31.
Refactoring - Split Variable Martin Fowler - Refactoring을 읽고 정리한 글입니다.(240~243p) 예제 // Before let temp = 2 * (height + width); temp = height * width; // After const perimeter = 2 * (hieght + width); // perimeter : 주변, 외곽 const area = height * width; temp라는 변수를 let으로 선언하고 수정하고 있는데 밑에는 보면 두 개의 const로 선언해서 쓰고있다. 이렇게 변수를 나누는것. Motivation 변수는 다양하게 쓰인다. 그 결과 변수의 값이 여러번 할당되기도 한다. for문에서 쓰는 index[i]같은 변수는 실행될때마다 바뀐다. 변수는 값을 메서드가 진행.. 2019. 12. 31.
Refactoring - Move Statesments into Function Martin Fowler - Refactoring을 읽고 정리한 글입니다.(213~216p) Move Statesments to Callers의 반대 케이스. 예제 // Before result.push(`title: ${person.photo.title}`); // 이 라인을 result.concat(photoData(person.photo)); function photoData(aPhoto) { return [ `location : ${aPhoto.location}`, `date : ${aPhoto.date.toDateString()}`, ]; } // After result.concat(photoData(person.photo)); function photoData(aPhoto) { return [.. 2019. 12. 31.
Refactoring - Inline Class Martin Fowler - Refactoring을 읽고 정리한 글입니다.(186~188p) extract class의 반대케이스. 클래스를 더이상 줄일 수 없을때 할 수 있다. 리팩토링의 결과물이기도 하다. 기능이 서로 다른 클래스 두 개가 있을 때 하면 좋다. // Before class Person { get officeAreaCode() {return this._telephoneNumber.areaCode;} get officeNumber() {return this._telephoneNumber.number;} } class TelephoneNumber { get areaCode() {return this._areaCode;} get number() {return this._number;} } /.. 2019. 12. 31.
Refactoring - Encapsulate Collection Martin Fowler - Refactoring을 읽고 정리한 글입니다.(170~173p) 저자는 캡슐화를 좋아한다. 캡슐화하면 데이터가 언제 어떻게 수정되는지 파악하기 쉽고 구조 수정하기도 쉽기 때문이다. 객체지향 개발자들은 장려하지만 콜렉션 쓰는 개발자는 이렇게 게터가 콜렉션 다 넘겨주면 좋지 않다. 그래서 콜렉션을 수정하는 메서드를 만들어서 쓴다. 기존 모듈 밖에서 콜렉션 수정안하는 팀이라면 (게터세터)메서드만 제공해도 충분할지 모르지만, 아니라면 원본 컬랙션에 직접 접근 못하게 해야된다. 절대 콜랙션 값에 접근하지 못하게 해라. aCustomer.orders.size 대신 aCustomer.numberOfOrders 쓰게해라. 아니면 리드온리로 접근할 수 있게 제공해라. 아니면 사본을 제공해라... 2019. 12. 31.
Refactoring - Introduce Parameter Object Martin Fowler - Refactoring을 읽고 정리한 글입니다.(140~143p) 요약 자연스럽게 같이 다녀야 하는 파라미터들을 객체화한다. Motivation 함수에 함수를 거쳐 다니는 데이터아이템이 종종 있는데, 저자는 이 데이터덩어리를 하나의 데이터구조로 수정하는것을 좋아함. 데이터를 구조적으로 그룹핑하는건 데이터 항목 간의 관계를 위해 새로운 크기의 매개변수 목록을 사용하도록 명시하기 때문에 가치있다. 이렇게하면 새로운 구조를 사용하는 어떤 함수라도 파라미터 리스트의 크기가 줄어든다. 모든 함수에서 그 구조의 엘리먼트를 얻기 위해 같은 이름을 사용할 수 있어서, 일관성을 유지하게 해준다.. 그러나 이 리팩터링의 진정한 힘은 어떻게 그것이 코드를 더 깊게 변화시킬 수 있느냐 하는 것이다... 2019. 12. 31.
Refactoring - Rename Variable Martin Fowler - Refactoring을 읽고 정리한 글입니다.(137~139p) Motivation 네이밍을 잘하는 것은 clear programming의 핵심이다. 이름을 잘 지은 변수들은 아주 많은 것을 설명할 수 있다. 하지만 종종 변수이름을 잘못 짓는다. 충분히 생각하지 않았을 수 있다. 내가 더 배울수록 문제에 대한 이해가 깊어지기 때문에 잘 지을 수 있다. 유저의 니즈에 의해서 프로그램의 용도가 변경된 경우. 심지어 대부분의 프로그램 요소들보다도, 이름의 중요성은 그것이 얼마나 널리 사용되느냐에 달려있다. one-line lambda expression에 사용되는 변수는 대개 따라가기(이해하기) 쉽다. Users.map((u)=>u.id) 이렇게 용도가 확실한 경우에는 한글자짜리 .. 2019. 12. 31.