Refactoring 10

[ 리팩토링 by 마틴 파울러 ] Chapter12. 상속 다루기

12.1 메서드 올리기 12.2 필드 올리기 12.3 생성자 본문 올리기 생성자는 할수 있는 일과 호출순서에 제약이 있음 (생성될 때만 호출, 리턴 X, 오브젝트 초기화 용도) 부모-자식의 클래스 중, 생성자 호출 단계에서 부모의 생성자를 호출하지 않는 자식의 경우가 있다면 체크 후 자식 생성자에 따로 알맞은 로직을 호출하도록 코딩한다 12.4 메서드 내리기 12.5 필드 내리기 12.6 타입 코드를 서브클래스로 바꾸기 타입코드 비슷한 대상들을 특정 특성에 따라 구분해야 할 때 서브 클래스로 생성하여 조건에 따라 다르게 동작하는 다형성 제공하기 특정 타입에서만 의미가 있는 값을 사용하는 필드나 메서드가 있을 때 사용하기 직접 상속 Employee를 상속한 클래스가 타입에 따라 Engineer, Manag..

Refactoring 2021.07.22

[ 리팩토링 by 마틴 파울러 ] Chapter11. API 리팩토링

모듈과 함수는 소프트웨어를 구성하는 빌딩 블록이며, API는 이 블록들을 끼워 맞추는 연결부다. 이런 API를 이해하기 쉽고 사용하기 쉽게 만드는 일은 중요하며 어렵다. 그래서 API를 개선하는 방법을 새로 깨달을 때마다 그에 맞게 리팩터링 해야한다. 11. 1 질의 함수와 변경 함수 분리하기 목표 : “부수 효과” 없애기 겉보기 부수 효과가 전혀 없이 값을 반환해주는 함수를 추구해야 함 Get함수 안에 set이 같이 있는 경우 11. 2 함수 매개변수화하기 두 함수의 로직이 아주 비슷하고 단지 리터럴 값만 다르다면? 하나의 함수로 만들고 중복 없애기 매개변수로 boolean값을 써서 제어에 쓰는 경우 아님 11.3 플래그 인수 제거하기 호출할 수 있는 함수들이 무엇이고 어떻게 호출해야 하는지를 이해하기..

Refactoring 2021.07.22

[ 리팩토링 by 마틴 파울러 ] Chapter10. 조건부 로직 간소화

조건부 로직을 이해하기 쉽고 깔끔하게 만들어야 프로그램의 전체 코드가 복잡하지 않게된다. 10.1 조건문 분해하기 조건, 분기 모두 함수로 추출해버려 가독성 높이기 왜 이 코드가 실행되는 지 모를때가 많음 10.2 조건식 통합하기 비교하는 조건은 다르지만 그 결과로 수행하는 동작은 똑같은 코드들이 있다. 이럴 때 and나 or연산자를 사용하여 여러 개의 비교 로직을 하나로 합칠 수 있다. 간단한 여러 조건문을 하나의 복잡한 조건문으로 통합하기 부수효과에 유의하기 10.3 중첩 조건문을 보호 구문으로 바꾸기 보호 구문 : 한쪽만 정상이라면 비정상 조건을 if로 검사한 다음, 조건이 참이면 함수에서 빠져나온다. if절과 else절에 똑같은 무게를 두어, 코드를 읽는 이에게 양 갈래가 똑같이 중요하다는 뜻을 ..

Refactoring 2021.07.22

[ 리팩토링 by 마틴 파울러 ] Chapter09. 데이터 조직화

데이터 구조에 집중한 리팩터링 9.1 변수 쪼개기 변수 1개당 역할은 하나이다 역할이 둘 이상인 변수가 있다면 쪼개야 한다. (여러 용도로 쓰인 변수는 코드를 읽는 이에게 커다란 혼란을 줌) 같은 역할에 여러 번의 할당은 필요할 때도 있다 -> 루프변수, 수집변수 9.2 필드 이름 바꾸기 점진적으로 안전하게 바꾸기 9.3 파생 변수를 질의 함수로 바꾸기 9.4 참조를 값으로 바꾸기 객체 내부를 수정하던 것을, 값 객체 통채 하나로 바꾸기 ( 불변 데이터이므로 외부에 건네주는 경우 등 나중에 그 값이 바뀌어 내부에 영향 끼치지 않음 ) 새로운 속성을 담은 객체로 기존 내부 객체를 통채로 대체 값 객체 - 불변 : setter없이 constructor 만으로 9.5 값을 참조로 바꾸기 데이터를 갱신해야 할 ..

Refactoring 2021.07.22

[ 리팩토링 by 마틴 파울러 ] Chapter08. 기능 이동

지금까지는 프로그램 요소를 생성 혹은 제거하거나 이름을 변경하는 리팩터링을 다뤘다. 여기에 더해 요소를 다른 컨텍스트(클래스나 모듈 등)로 옮기는 일 역시 리팩토링의 중요한 축이다. 8.1 함수 옮기기 함수가 자신이 속한 모듈 A보다 다른 모듈 B를 더 많이 참조한다면 모듈성을 높이기 위해 서로 연관된 요소들을 함께 묶고, 요소 사이의 연결 관계를 쉽게 찾고 이해할 수 있도록 해야 함. 함수를 옮길 시에 대상 함수의 현재 컨텍스트와 후보 컨텍스트를 둘러보면 도움이된다. 8.2 필드 옮기기 데이터 구조가 적절치 않음을 깨달으면 곧바로 수정하기 (어떤 레코드를 넘길 때마다 또 다른 레코드의 필드도 함께 넘기고 있다면 데이터 위치를 옮겨야 할 것) 필드 캡슐화 => 필드값을 외부에서 변경하지 못하게 할 시 사..

Refactoring 2021.07.22

[ 리팩토링 by 마틴 파울러 ] Chapter07. 캡슐화

모듈을 분리하는 가장 중요한 기준은 아마도 시스템에서 각 모듈이 자신을 제외한 다른 부분에 드러내지 않아야 할 비밀을 얼마나 잘 숨기느냐에 있을 것이다. 이러한 구조는 캡슐화를 통해 숨길 수 있다. 7.1 레코드 캡술화하기 간단한 레코드 캡슐화하기 변수 캡슐화를 한 후, 데이터 구조를 표현하는 클래스를 정의하고, 이를 반환하는 함수를 새로 만듬 중첩된 레코드 캡슐화하기 변수 캡슐화를 한 후, 데이터 구조를 표현하는 클래스를 정의하고, 이를 반환하는 함수를 새로 만듬 데이터 구조 안으로 들어가는 코드를 세터로 뽑아 작업함. 7.2 컬렉션 캡슐화하기 컬렉션을 소유한 클래스를 통해서만 원소를 변경하도록 캡슐화하기 => 컬렉션 변경자 메서드를 통해 원소를 변경하도록 하여 원본 모듈 밖에서 컬렉션을 수정하지 않도..

Refactoring 2021.07.21

[ 리팩토링 by 마틴 파울러 ] Chapter06. 기본적인 리팩터링

6.1 함수 추출하기 코드 조각을 찾아 무슨 일을 하는지 파악한 다음, 독립된 함수로 추출하고 목적에 맞는 이름을 붙인다 독립된 함수로 묶을때, 길이나 재사용성 또는 한 화면을 넘어갈 때 등등 많은 기준들이 있다. 하지만 핵심은 ‘목적과 구현을 분리’하는 방식이다. 즉, 무슨일을 하는지 함수의 이름을 통해 파악하도록 하는 것이다. (단, 함수의 이름이 잘 떠오르지 않으면 함수로 추출하면 안됨. 하지만 추출하는 과정에서 이름이 떠오를 수 있으니 일단 추출해 사용해보고 효과가 크지 않으면 인라인해서 써도 됨) 함수를 추출할 때, 원본 함수의 지역 변수를 참조하거나 추출한 함수의 유효범위를 벗어나는 변수는 없는지 검사하고, 있다면 매개변수로 전달한다. 또한 지역변수가 너무 많을 경우 변수 쪼개기나 임시 변수를..

Refactoring 2021.07.21

[ 리팩토링 by 마틴 파울러 ] Chapter04. 테스트 구축하기

리팩토링을 제대로 하려면 실수를 잡아주는 견고한 테스트 스위트가 뒷받침돼야 함. 테스트 작성에 시간이 걸리지만 결국 좋은 테스트를 작성하면 개발 효율을 높여준다. 4.1 자가 테스트 코드의 가치 테스트 케이스 작성을 통해 버그를 찾아낼 수 있음. 버그는 고치는 것보다 찾아내는 것이 어려움. “테스트 스위츠는 강력한 버그 검출 도구로, 버그를 찾는 데 걸리는 시간을 대폭 줄여준다” 저자는 반복적 개발 방법론을 경험할 당시 테스트를 반복 주기마다 포함시켜 작업했다고 한다. 이때 경험하고 누렸던 것중 버그 검출의 효과를 보았고 버그에 대해서는 테스트 코드로 신경을 덜 쓸수 있다고 자신의 경험을 소개하였다. 또한 저자는 개발하기 전에 테스트 케이스부터 작성한다고 한다. 얼핏 순서가 뒤바뀐듯 들리지만 테스트를 작..

Refactoring 2021.07.21

[ 리팩토링 by 마틴 파울러 ] Chapter03. 코드에서 나는 악취

저자는 리팩토링을 하는 시점을 코드에서 '악취'가 날 때라 말한다. '악취'가 나는 코드를 어떤 정확한 기준에 부합한다 라고 보기는 어렵다. 하지만 그동안의 경험을 토대로 하여 가지게 된 직관을 정리하여 제시한 악취들을 공부한 후 리팩토링 작업을 하게될 때, 감을 키워나가면서 리팩토링 실력을 쌓아 나가야 효과를 볼 수 있다. 3.1 기이한 이름 코드를 명료하게 표현하는데 이름만 보고도 각각이 무슨 일을 하고 어떻게 사용해야 하는지 알 수 있도록 신경써서 이름을 지어야 함. 이름만 잘 지어도 나중에 문맥을 파악하느라 해메는 시간을 크게 절약할 수 있음. 3.2 중복 코드 똑같은 코드 구조가 여러 곳에서 반복된다면 하나로 통합하여 더 나은 프로그램을 만들 수 있다. 코드가 중복되면 서로 차이점이 없는 지 주..

Refactoring 2021.07.20

[ 리팩토링 by 마틴 파울러 ] Chapter02. 리팩터링 원칙

* 마틴 파울러의 "리팩토링" 책을 공부한 후 정리한 포스팅 * 비중이 적은 내용은 생략하였음. 2.1 리팩터링 정의 리팩터링 : 겉보기 동작은 그대로 유지한 채, 여러 가지 리팩토링 기법을 적용해서 소프트웨어를 재구성. + 특정한 방식에 따라 코드를 정리 작은 단계들을 거쳐 코드 수정하여 순차적으로 큰 변화를 만들어냄. ( 겉보기동작 : 코드의 동작은 전과 후가 완전히 같아야 함. 내부 동작은 달라져 성능은 변할 수 있음. ) 성능 최적화와 비슷. 코드의 목적을 이해하고 수정하기 쉽게 만듬. 오로지 성능이 목표가 아니다. 2.2 두 개의 모자 소프트웨어 개발시 ‘기능 추가’ 혹은 ‘리팩터링’ 목표를 구분해 작업함. 2.3 리팩터링하는 이유 설계가 좋아짐 내부 설계가 유지되기 위함. 지속적인 리팩토링이 ..

Refactoring 2021.07.20