: 객체지향의 가장 중요한 요소 중 하나인 상속에 관련된 리팩터링들. 대부분의 경우 상속을 잘못 사용하기 쉽다. 1. 메서드 올리기 : 두 서브클래스의 메서드가 같은 일을 수행한다면 슈퍼클래스의 공통된 메서드로 올려 중복을 제거한다. 보통 함수 매개변수화(리터럴을 매개변수로 받기)를 수행한 후에 수행이 가능하기도 하다. 서브클래스의 ...
리팩터링 11장. API 리팩터링
: 모듈간 통신이나 함수간 호출에서 연결부 역할을 하는 것이 API이다. 인터페이스가 복잡할 때 이 장의 리팩터링을 적용하면 전반적인 API가 이해하기 쉬워진다. 1. 질의 함수와 변경 함수 분리하기 : 질의(값 반환)하는 부분과 상태를 변경하는 부분을 분리한다. side effect 없이 값 반환만 해주는 함수를 추구할수록 언제 호출해...
리팩터링 10장. 조건부 로직 간소화
: 조건부 로직은 필연적인 요소이지만, 쉽게 프로그램을 복잡해보이게 만든다. 이 장의 리팩터링을 적용하면 이러한 로직들을 보다 이해하기 쉬운 코드로 바꿀 수 있다. 1. 조건문 분해하기 : 복잡한 조건절은 해당 코드의 목적이 무엇인지 파악하기 어렵게 만든다. 조건절과 작업들을 함수로 추출해주면 코드 의도가 확실히 전달된다. 2. 조건식 통...
리팩터링 9장. 데이터 조직화
: 데이터 구조에 집중한 리팩터링들. 1. 변수 쪼개기 : 한 변수는 하나의 역할만 수행하도록 한다. 한 변수에 두번 이상 대입이 이뤄진다면 해당 변수는 여러 가지 역할을 수행한다는 신호이다. 2. 필드 이름 바꾸기 제일 중요한 부분. 무슨 데이터로 구성되는지를 보면 프로그램을 이해하는데 도움이 된다. 넓은 범위로 참조되고 있다...
리팩터링 8장. 기능 이동
: 어떠한 요소를 다른 컨텍스트(클래스, 모듈 혹은 코드 라인)로 옮기는 방식의 리팩터링. 1. 함수 옮기기 모듈성을 높이기 위해 연관된 요소들끼리 묶는다. -> 모듈을 잘 분리하면 응집도가 높은 코드가 되고 캡슐화가 좋아진다. 프로그램 언어마다 모듈화 수단이 다르다. 자바의 경우 객체지향의 패러다임을 가지며, 따...
리팩터링 7장. 캡슐화
: 캡슐화가 잘 되어있을수록 모듈 각각은 내부가 다른 모듈에게 노출되지 않는다. 이 때 캡슐화의 단위는 클래스, 모듈, 심지어 함수도 될 수가 있다. 이 장의 리팩터링을 적용하면 많은 경우 캡슐화를 개선할 수 있다. 1. 레코드 캡슐화하기 무엇이 저장된 값이고, 무엇이 계산된 값인지 바깥에서 알 필요가 없고, 데이터를 더 의미있는...
변수 네이밍
고민? String name; int age; boolean isMale; List<String> names; // A List<String> nameList; // B 이름만 보고도 타입을 유추할 수 있는 변수가 있는가하면, 리스트의 경우 A, B 둘다 괜찮아보이긴 하다. 기존 코드가 B로 작성되어있다. 일관...
리팩터링 6장. 기본적인 리팩터링
: 가장 기본적이고, 제일 많이 사용되는 리팩터링 기법들. 1. 함수 추출하기 무슨 일을 하는지 파악이 어렵다고 판단된다면 함수로 추출하고, 무슨 일을 수행하는지 적절히 네이밍한다. 값을 변경하는 경우 값을 반환하도록 하거나 적절히 문장 슬라이드 등을 이용해본다. Call stack과 같은 성능적인 부...
리팩터링 4장. 테스트 구축하기
테스트의 가치(자가 테스트, 자동화 테스트) : 직관만으로 테스트의 가치를 체감하긴 어렵다. 그러나, 컴파일때마다 테스트하는 것을 습관화하면 마지막 테스트 이후 현재 변경 부분에 대한 버그임을 명확하게 알 수 있고 결국 생산성이 향상된다. 핵심은 가장 작은 단위인 유닛 테스트이다. 아키텍처 평가 기준으로 Testability(테스트 용...
리팩터링 3장. 코드에서 나는 악취
1. 기이한 이름 : 가장 어려운 부분 중 하나. 네이밍이 좋을수록 세부내용을 볼 필요성이 줄어들 수 있다. 2. 중복 코드 : 같은 코드가 여러군데서 반복된다면 하나의 메서드로 추출할 수 있다. 이렇게 하면 항상 그 메서드는 일관된 동작을 할 것을 보장한다. 3. 긴 함수 함수가 길수록 이해하기 어렵기 때문에 메서드 추출을 ...