목록전체 글 (56)
구어체로 설명하는 다이어리

필드 옮기기 class Customer { get plan() { return this._plan; } get discountRate() { return this._discountRate; }} ▼ class Customer { get plan() { return this._plan; } get discountRate() { return this.plan.discountRate; }} 배경프로그램의 상당 부분이 동작을 구현하는 코드로 이뤄지지만 프로그램의 진짜 힘은 데이터 구조에서 나온다. 주어진 문제에 적합한 데이터 구조를 활용하면 동작 코드는 자연스럽게 단순하고 직관적으로 짜여진다. 반면 데이터 구조를 잘못 선택하면 아귀가 맞지 않는 데이터를 다루기 위한 코드로..

함수 옮기기 class Account { get overdraftCharge() { ... }} ▼ class AccountType { get overdraftCharge() { ... }} 배경좋은 소프트웨어 설계의 핵심은 모듈화가 얼마나 잘 되어 있느냐를 뜻하는 모듈성modularity이다. 모듈성이란 프로그램의 어딘가를 수정하려 할 때 해당 기능과 깊이 관련된 작은 일부만 이해해도 가능하게 해주는 능력이다. 모듈성을 높이려면 서로 연관된 요소들을 함께 묶고, 요소 사이의 연결 관계를 쉽게 찾고 이해할 수 있도록 해야 한다. 하지만 프로그램을 얼마나 잘 이해했느냐에 따라 구체적인 방법이 달라질 수 있다. 보통은 이해도가 높아질수록 소프트웨어 요소들을 더 잘 묶는 새로운 방법을 깨..

지금까지는 프로그램 요소를 생성 혹은 제거하거나 이름을 변경하는 리팩터링을 다뤘다. 여기에 더해 요소를 다른 컨텍스트(클래스나 모듈 등)로 옮기는 일 역시 리팩터링의 중요한 축이다. 다른 클래스나 모듈로 함수를 옮길 때는 함수 옮기기를 사용한다. 필드 역시 필드 옮기기로 옮길 수 있다. 옮기기는 문장 단위에서도 이뤄진다. 문장을 함수 안이나 바깥으로 옮길 때는 문장을 함수로 옮기기나 문장을 호출한 곳으로 옮기기를 사용한다. 같은 함수 안에서 옮길 때는 문장 슬라이드하기를 사용한다. 때로는 한 덩어리의 문장들이 기존 함수와 같은 일을 할 때가 있다. 이럴 때는 인라인 코드를 함수 호출로 바꾸기를 적용해 중복을 제거한다. 반복문과 관련하여 자주 사용하는 리팩터링은 두 가지다. 첫 번째는 각각의 반복문이 단 ..