이번 장에서는 시야를 넓혀 리팩터링 전반에 적용되는 원칙 몇 가지를 이야기하는 시간을 가져보자. 2.1 리팩터링 정의 리팩터링 : [명사] 소프트웨어의 겉보기 동작은 그대로 유지한 채, 코드를 이해하고 수정하기 쉽도록 내부 구조를 변경하는 기법 리팩터링(하다) : [동사] 소프트웨어의 겉보기 동작은 그대로 유지한 채, 여러 가지 리팩터링 기법을 적용해서 소프트웨어를 재구성하다 수많은 사람이 코드를 정리하는 작업을 모조리 리팩터링이라고 표현하고 있는데, 앞에서 제시한 정의한 방식에 따라 코드를 정리하는 것만이 리팩터링이다. 리팩터링을 동작을 보존하는 작은 단계들을 거쳐 코드를 수정하고, 이러한 단계 들을 순차적으로 연결하여 큰 변화를 만들어내는 일이다. 개별 리팩터링은 아주 작을 수도 있고, 작은 단계 여..
1장은 리팩터링의 진행 절차에 대한 구체적인 예시를 보여주는 리팩터링 맛보기 장이다. 하지만 1장의 읽어보고 내용을 요약하는 게 무의미하다고 보여서 과감히 생략하고... 책을 읽는데 앞서 중요하다고 보이는 서문의 내용 일부를 대신 정리했다. 리팩터링이란 - 리팩터링은 겉으로 드러나는 코드의 기능(겉보기 동작)은 바꾸지 않으면서 내부 구조를 개선하는 방식으로 소프트웨어를 수정하는 과정이다. - 버그가 생길 가능성을 최소로 줄이면서 코드를 정리하는 정제된 방법으로 코드를 작성하고 난 뒤에 설계를 개선하는 일이다. - 예전부터 따르던 소프트웨어 개발 방법은 설계부터 하고 코드를 작성하는 순서다. 하지만 시간이 흐르면서 코드는 수정되고 시스템의 설계에 맞춘 구조는 점차 뒤죽박죽이 되어간다. 공학에 가깝던 코딩 ..
리팩터링 적용 방법을 아는 것과 제때 적용할 줄 아는 것은 다르다. 리팩터링을 언제 시작하고 언제 그만할지를 판단하는 일은 리팩터링의 작동 원리를 아는 것 만큼 중요하다. 그리고 우리는 리팩터링이 필요한 코드들에 일정한 패턴이 있다는 사실을 발견했다. 이를 설명하는데 냄새(악취)란 표현을 사용했다. 하지만 리팩터링을 언제 멈춰야 하는지를 판단하는 정확한 기준을 제시하지 않을 것이다. 우리 경험에 따르면 숙련된 사람의 직관만큼 정확한 기준은 없다. 종료 기준보다는 리팩터링하면 해결할 수 있는 문제의 징후를 제시하겠다. 3.1 기이한 이름 (Mysterious Name) 코드를 명료하게 표현하는데 가장 중요한 요소 하나는 바로 '이름'이다. 함수, 모듈, 변수, 클래스 등은 그 이름만 보고도 각각이 무슨 일..
마지막 장이다. 이번 장에서는 객체 지향 프로그래밍에서 가장 유명한 특성인 상속을 다룬다. 이는 아주 유용한 동시에 오용하기 쉽다. 더욱이 상속은 발등에 불이 떨어져서야 잘못 됐음을 알아차리는 경우가 많다. 특정 기능을 상속계층구조의 위나 아래로 옮길 때 12.1 메서드 올리기 12.2 필드 올리기 12.3 생성자 본문 올리기 12.4 메서드 내리기 12.5 필드 내리기 계층 사이에 클래스를 추가하거나 제거하는 12.8 슈퍼클래스 추출하기 12.7 서브클래스 제거하기 12.9 계층 합치기 필드값에 따라 동작이 달라지는 코드의 경우 필드를 서브클래스로 대체하고 싶을 때 12.6 타입 코드를 서브클래스로 바꾸기 상속이 잘못된 곳에서 사용되거나 나중에 환경이 변해 문제가 생길 경우 12.10 서브클래스를 위임..
모듈과 함수는 소프트웨어를 구성하는 빌딩 블록이며, API 는 블록들을 끼워 맞추는 연결부다. 이런 API 를 이해하고 사용하기 쉽게 만드는 일은 중요한 동시에 어렵다. 그래서 API를 개선하는 방법을 새로 깨달을 때마다 그에 맞게 리팩터링을해야 한다. 데이터 갱신과 조회가 섞여 있다면 11.1 질의 함수와 변경 함수 분리하기 값 하나 때문에 여러개로 나뉜 함수들은 11.2 함수 매개변수화하기 매개변수가 그저 함수의 동작 모드를 전환하는 용도로만 쓰이면 11.3 프래그 인수 제거하기 데이터 구조가 함수 사이를 건너다니면서 필요 이상으로 분해될 떄 11.4 객체 통째로 넘기기 무언가를 매개변수로 건네 피호출 함수와 호출 함수 중 어디서 판단할지에 관해서는 불변의 진리는 없으니 상황이 바뀔때마다 11.5 질..
조건부 로직은 프로그램을 복잡하게 만드는 주요 원흉이다. 따라서, 이해하기 쉽게 바꾸는 리팩터링이 필요하다. 복잡한 조건문은 10.1 조건문 분해하기 논리적 조합을 명확하게 다듬는 10.2 중복 조건식 통합하기 핵심 로직에 앞서 무언가를 검사해야 할 때 10.3 중첩 조건문을 보호 구문으로 바꾸기 똑같은 분기 로직이 여러 곳에 등장한다면 10.4 조건부 로직을 다형성으로 바꾸기 null 과 같은 특이 케이스의 처리 로직이 거의 똑같다면 10.5 특이 케이스 추가하기 (널 객체 추가하기) 특정 조건일때만 제대로 동작하는 코드가 있는 경우 10.6 어서션 추가하기 제어 플래그를 이용해 코드 동작 흐름을 변경하는 코드는 10.7 제어 플래그를 탈출문으로 바꾸기 10.1 조건문 분해하기 (Decompose Co..
데이터 구조는 프로그램에서 중요할 역할을 수행한다. 따라서, 데이터 구조에만 집중한 리팩터링만 한 묶음 따로 준비한 장이다. 하나의 값이 여러 목적으로 사용된다면 9.1 변수 쪼개기 변수 자체를 없애는게 가장 좋은 해결책일 때 9.3 파생 변수를 질의함수로 바꾸기 레코드나 클래스의 이름을 바꾸고 싶은 경우 9.2 필드 이름 바꾸기 참조인지 값인지 햇갈려 문제가 되는 경우 9.4 참조를 값으로 바꾸기 9.5 값을 참조로 바꾸기 의미를 알기 어려운 리터럴이 보이면 9.6 매직 리터럴 바꾸기 9.1 변수 쪼개기 (Split Variable) 개요 여러 번 대입하는 용도의 수집 변수가 아닌 이상 역할이 둘 이상인 변수가 있다면 쪼개야 한다 여러 용도로 쓰인 변수는 코드를 읽을때 커다란 혼란을 주고 버그를 낳는다..
지금까지는 프로그램 요소를 생성/제거하거나 이름은 변경하는 리팩터링을 다뤘다. 여기에 더해 요소를 다른 컨텍스트(클래스나 모듈 등)로 옮기는 일 역시 리팩터링의 중요한 축이다. 다른 클래스나 모듈로 함수나 필드를 옮길 때 8.1 함수 옮기기 8.2 필드 옮기기 문장을 함수 안이나 바깥으로 옮길 때 8.3 문장을 함수로 옮기기 8.4 문장을 호출한 곳으로 옮기기 같은 함수 안에서 옮길 때는 8.6 문장 슬라이드 하기 한 덩어리의 문장들이 기존 함수와 같은 일을 할 때 8.5 인라인 코드를 함수 호출로 바꾸기 반복문이 단 하나의 일만 수행하도록 보장하는 8.7 반복문 쪼개기 반복문을 완전히 없애 버리는 8.8 반복문을 파이프라인으로 바꾸기 8.1 함수 옮기기 (Move Function) 개요 좋은 소프트웨어..
- Total
- Today
- Yesterday
- 그림으로 공부하는 IT 인프라 구조
- amazon vpc
- Debug
- Debugging
- 리팩토링
- 매개변수화
- 제어플래그
- 변경함수
- 위임
- 박소연
- amazon aurora
- 리팩터링이란
- 디버깅
- 마틴파울러
- 질의함수
- 코드스멜
- 조건부 로직
- 안심 첫 문장
- 일 잘하는 사람은 단순하게 말합니다
- 코드악취
- AWS
- 지시의 언어
- Refactoring
- 일잘러
- 그림으로 배우는 HTTP & Network
- aws fargate
- SSL
- https
- Debug It! 실용주의 디버깅
- HTTP
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |