기본형 집착 애플리케이션이 다루고 있는 도메인에 필요한 기본 타입을 만들지 않고 프로그래밍 언어가 제공하는 기본 타입을 사용하는 경우가 많다. 예) 전화번호, 좌표, 돈, 범위, 수량 등 기본형으로는 단위 (인치 vs 미터) 또는 표기법을 표현하기 어렵다. 이완 관련된 리팩토링 기술은 3종류가 있다. 기본형을 객체로 바꾸기 (Replace Primitive with Object) 타입 코드를 서브클래스로 바꾸기 (Replace Type Code with Subclasses) 조건부 로직을 다형성으로 바꾸기 (Replace Conditional with Polymorphism) “클래스 추출하기 (Extract Class)” “매개변수 객체 만들기 (Introduce Parameter Object)” 기본..
산탄총 수술 어떤 한 변경 사항이 생겼을 때 여러 모듈을 (여러 함수 또는 여러 클래스를) 수정해야 하는 상황. 뒤엉킨 변경 냄새와 유사하지만 반대의 상황이다. 예) 새로운 결제 방식을 도입하려면 여러 클래스의 코드를 수정해야 한다. 변경 사항이 여러곳에 흩어진다면 찾아서 고치기도 어렵고 중요한 변경 사항을 놓칠 수 있는 가능성도 생긴다. 이와 관련된 리팩토링 기술은 3종류가 있다. “함수 옮기기 (Move Function)” 또는 필드 옮기기 (Move Field)를 사용해서 필요한 변경 내역을 하나의 클래스로 모을 수 있다, 비슷한 데이터를 사용하는 여러 함수가 있다면 여러 함수를 클래스로 묶기 (Combine Functions into Class)를 사용할 수 있다. "단계 쪼개기 (Split Ph..
뒤엉킨 변경 소프트웨어는 변경에 유연하게 대처할 수 있어야 한다. 어떤 한 모듈이 (함수 또는 클래스가) 여러가지 이유로 다양하게 변경되어야 하는 상황. ex) 새로운 결제 방식을 도입하거나, DB를 변경할 때 동일한 클래스에 여러 메소드를 수정해야 하는 경우. 서로 다른 문제는 서로 다른 모듈에서 해결해야 한다. 모듈의 책임이 분리되어 있을수록 해당 문맥을 더 잘 이해할 수 있으며, 다른 문제는 신경쓰지 않아도 된다. 이와 관련된 리팩토링 기술은 3종류가 있다. 단계 쪼개기(Split Phase)를 사용해 서로 다른 문맥의 코드를 분리할 수 있다. 함수 옮기기 (Move Function)를 사용해 적절한 모듈로 함수를 옮길 수 있다. 모듈이 클래스 단위라면 클래스 추출하기 (Extract Class)를..
가변데이터 데이터를 변경하다보면 예상치 못했던 결과나 해결하기 어려운 버그가 발생하기도 한다. 함수형 프로그래밍 언어는 데이터를 변경하지 않고 복사본을 전달한다. 하지만 그밖의 프로그래밍 언어는 데이터 변경을 허용하고 있다. 따라서 변경되는 데이터 사용 시 발생할 수 있는 리스크를 관리할 수 있는 방법을 적용하는 것이 좋다. 이와 관련된 리팩토링으로는 변수 쪼개기 (Split Variable)을 사용해 여러 데이터를 저장하는 변수를 나눌 수 있다. 질의 함수와 변경 함수 분리하기 (Separate Query from Modifier)를 적용해서 클라이언트가 원하는 경우에만 사이드 이팩트가 있는 함수를 호출하도록 API를 개선할 수 있다. 가능하다면 세터 제거하기 (Remove Setting Method)..
전역 데이터 전역 데이터 (예, 자바의 public static 변수) 전역 데이터는 아무곳에서나 변경될 수 있다는 문제가 있다. 어떤 코드로 인해 값이 바뀐 것인지 파악하기 어렵다. 클래스 변수 (필드)도 비슷한 문제를 겪을 수 있다. 변수 캡슐화하기 (Encapsulate Variable)를 적용해서 접근을 제어하거나 어디서 사 용하는지 파악하기 쉽게 만들 수 있다. 파라켈수스의 격언, 약과 독의 차이를 결정하는 것은 사용량일 뿐이다. 변수 캡슐화하기 (Encapsulate Variable) 메소드는 점진적으로 새로운 메소드로 변경할 수 있으나, 데이터는 한번에 모두 변경해야 한다. 데이터 구조를 변경하는 작업을 그보다는 조금 더 수월한 메소드 구조 변경 작업으로 대체 할 수 있다. 데이터가 사용되는..
긴 매개변수 목록 함수에 매개변수가 많을수록 함수의 역할을 이해하기 어려워진다. 과연 그 함수는 한가지 일을 하고 있는게 맞는가? 불필요한 매개변수는 없는가? 하나의 레코드로 뭉칠 수 있는 매개변수 목록은 없는가? 어떤 매개변수를 다른 매개변수를 통해 알아낼 수 있다면, 매개변수를 질의 함수로 바꾸기 (Replace Parameter with Query) 를 사용할 수 있다. 기존 자료구조에서 세부적인 데이터를 가져와서 여러 매개변수로 넘기는 대신, 객체 통째로 넘기기 (Preserve Whole Object) 를 사용할 수 있다. 일부 매개변수들이 대부분 같이 넘겨진다면, 매개변수 객체 만들기 (Introduce Parameter Object) 를 적용할 수 있다. 매개변수가 플래그로 사용된다면, 플래..
긴 함수 짧은 함수 VS 긴 함수 함수가 길수록 이해하기 어려워진다. VS 짧은 함수는 더 많은 문맥전환을 필요로 한다. 과거에는 작은 함수를 사용하는 경우에 더 많은 서브루틴 호출로 인한 오버헤드가 있었다. 작은 함수에 좋은 이름을 사용했다면 해당 함수의 코드를 보지 않고도 이해할 수 있다. 어떤 코드에 주석을 남기고 싶다면, 주석 대신 함수를 만들고 함수의 이름으로 의도를 표현해보자. 이에 해당하는 리팩토링 기술은 7종류가 있다. 문제의 99%는 함수 추출하기(Extract Funtion)로 해결할 수 있다. 함수로 분리하면서 해당 함수로 전달해야 할 매개변수가 많아진다면 다음과 같은 리팩토링을 고려해볼 수 있다. 임시 변수를 질의 함수로 바꾸기 (Replace Temp with Query) 매개변수..
중복 코드 중복 코드의 단점 비슷하진, 완전히 동일한 코드인지 주의 깊게 봐야한다. 코드를 변경할 때, 동일한 모든 곳의 코드를 변경해야 한다. 이에 해당하는 리팩토링 기술은 3종류 가 있다. 동일한 코드를 여러 메소드에서 사용하는 경우, 함수 추출하기 (Extract Function) 코드가 비슷하게 생겼지만 완전히 같지는 않은 경우, 코드 분리하기 (Slide Statements) 여러 하위 클래스에 동일한 코드가 있다면, 메소드 올리기 (Pull Up Method) 함수 추출하기 (Extract Function) 의도와 구현 분리하기 무슨 일을 하는 코드인지 알아내려고 노력해야 하는 코드라면 해당 코드를 함수로 분리하고 함수 이름으로 무슨 일을 하는지 표현할 수 있다. 한줄 짜리 메소드도 괜찮다. ..
이해하기 힘든 이름 깔끔한 코드에서 가장 중요한 것 중 하나는 “좋은 이름”이다. 함수, 변수, 클래스, 모듈의 이름 등 모두 어떤 역할을 하며 어떻게 쓰이는지 직관적이어야 한다. 이에 해당하는 리팩토링 기술은 3종류가 있다. 함수 선언 변경하기 변수 이름 바꾸기 필드 이름 바꾸기 함수 선언 변경하기 좋은 이름을 가진 함수는 함수가 어떻게 구현되었는지 코드를 보지 않아도 이름만으로 이해할 수 있다. 좋은 이름을 찾아내기 위해서 함수에 주석을 작성한 다음, 주석을 함수 이름으로 만들어보자. 함수의 매개변수는 ? 함수 내부의 문맥을 결정한다. 의존성을 결정한다. 변수 이름 바꾸기 많이 사용되는 변수일수록 이름이 더 중요해진다. 다이나믹 타입을 지원하는 언어에서는 타입을 이름에 넣기도 한다. 여러 함수에 걸쳐..
- Total
- Today
- Yesterday
- leetcode
- 백준
- 구현
- 코테
- 릿코드
- 노마드코더
- 코틀린
- 리팩토링
- 스프링
- 인프런
- kotlin
- 데이터베이스
- 북클럽
- mysql 8.0
- spring boot
- Spring
- 그리디
- webflux
- 파이썬
- 노마드
- Algorithm
- 정렬
- MySQL
- Real MySQL
- 스프링부트
- 자료구조
- 문자열
- 김영한
- 알고리즘
- 스프링 부트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |