본문 바로가기

Programming/리팩토링

(7)
[리팩토링 기술-7] 기본형을 객체로 바꾸기 / 타입 코드를 서브클래스로 바꾸기 / 조건부 로직을 다형성으로 바꾸기 👀 기본형 집착 ? - 어플리케이션이 다루고 있는 도메인에 필요한 기본 타입을 만들지 않고 프로그래밍 언어가 제공하는 기본 타입을 사용하는 경우가 많다. - 기본형으로는 단위 또는 표기법을 표현하기 어렵다. 🙌 기본형을 객체로 바꾸기 (Replace Primitive with Object) - 개발 초기에 기본형 (숫자 또는 문자열)으로 표현한 데이터가 나중에는 해당 데이터와 관련있는 다양한 기능을 필요로 하는 경우가 많다. (예) 문자열로 표현하던 전화번호의 지역코드가 필요한 경우 (예) 숫자로 표현하던 온도의 단위(화씨, 섭씨)를 변환하는 경우 기본형을 사용한 데이터를 감싸 줄 클래스를 만들면, 필요한 기능을 추가할 수 있다. [ Berfore ] Order 클래스에서 우선순위를 의미하는 prioir..
[리팩토링 기술-6] 단계 쪼개기 / 클래스 추출하기 🙌 단계 쪼개기 (Split Phase) - 서로 다른 일을 하는 코드를 각기 다른 모듈로 분리한다. : 그래야 어떤 것을 변경해야 할 때, 그것과 관련있는 것만 신경쓸 수 있다. - 여러 일을 하는 함수의 처리과정을 각기 다른 단계로 구분할 수 있다. (예) 전처리 -> 주요작업 -> 후처리 (예) 컴파일러 : 텍스트 읽어오기 -> 실행 가능한 형태로 변경 - 서로 다른 데이터를 사용한다면, 단계를 나누는데 있어 중요한 단서가 될 수 있다. - 중간 데이터를 만들어 단계를 구분하고, 매개변수를 줄이는데 활용할 수 있다. [ Berfore ] priceOrder() 함수는 주문에 값을 매기는 일을 하지만 내부에서 할인가격과 할인된 가격을 구하는 두가지 일을 같이한다. [ After ] - basePric..
[리팩토링 기술-5] 반복문을 처리하는 리팩토링 👀 반복문 (Loops) - 프로그래밍 언어 초기부터 있었던 반복문은 처음에는 별다른 대안이 없어서 간과했지만 최근 자바와 같은 언어에서 함수형 프로그래밍을 지원하면서 반복문에 비해 더 나은 대안책이 생겼다. - "반복문을 파이프라인으로 바꾸는 (Replace Loop with Pipeline)" 리팩토링을 적용하면 필터나 맵핑같은 파이프라인 기능을 사용해 보다 빠르게 어떤 작업을 하는지 파악할 수 있다. 🙌 반복문을 파이프라인으로 바꾸기 (Replace Loop with Pipeline) - 고전적인 반복문을 파이프라인 오퍼레이션을 사용해 표현하면 코드를 더 명확하게 만들 수 있다. (1) filter : 전달받은 조건의 true에 해당하는 데이터만 다음 오퍼레이션으로 전달 (2) map : 전달받은 ..
[리팩토링 기술-4] 가변데이터를 처리하는 리팩토링 👀 가변 데이터 (Mutable Data) - 데이터를 변경하다보면 예상치 못했던 결과나 해결하기 어려운 버그가 발생하기도 한다. - 함수형 프로그래밍 언어는 데이터를 변경하지 않고 복사본을 전달한다. 하지만 그밖의 프로그래밍 언어는 데이터 변경을 허용하고 있다. 따라서 변경되는 데이터 사용 시 발생할 수 있는 리스크를 관리할 수 있는 방법을 적용하는 것이 좋다. * 관련 리팩토링 - "변수 쪼개기(Split Variable)"을 사용해 여러 데이터를 저장하는 변수를 나눌 수 있다. - "질의 함수와 변경 함수 분리하기(Separate Query form Modifier)"를 적용해서 클라이언트가 원하는 경우에만 사이드 이팩트가 있는 함수를 호출하도록 API를 개선할 수 있다. - 가능하다면 "세터 제거..
[리팩토링 기술-3] 긴 매개변수를 처리하는 리팩토링 👀 매개변수가 많으면 무엇이 문제일까? 그리고 어떻게 해결할 수 있을까? - 어떤 함수에 매개변수가 많을수록 함수의 역할을 이해하기 어려워진다. 그렇다면 아래 내용을 생각해 봐야한다. 1. 과연 그 함수는 한 가지 일을 하고 있는게 맞는가? 2. 불필요한 매개변수는 없는가? 3. 하나의 레코드로 뭉칠 수 있는 매개변수 목록은 없는가? - 어떤 매개변수를 다른 매개변수를 통해 알아낼 수 있다면, "매개변수를 질의함수로 바꾸기(Replace Parameter with Query)"를 사용할 수 있다. - 매개변수가 플래그로 사용된다면, "플래그 인수 제거하기(Remove Flag Argument)"를 사용할 수 있다. - 여러 함수가 일부 매개변수를 공통적으로 사용한다면 "여러 함수를 클래스로 묶기(Comb..
[리팩토링 기술-2] 긴 함수를 처리하는 리팩토링 👀 짧은 함수 vs 긴 함수 - 함수가 길 수록 이해하기 어렵다! vs 짧은 함수는 더 많은 문맥전환을 필요로 한다. - 작은 함수에 "좋은 이름"을 사용했다면, 해당 함수의 코드를 보지 않고도 이해할 수 있다. - 어떤 코드에 "주석"을 남기고 싶다면, 주석 대신 함수를 만들고 함수의 이름으로 "의도"를 표현해보자. ✍ 긴 코드를 리팩토링할 때 사용할 수 있는 기술 1. 99%는 "함수 추출하기"로 해결할 수 있다. 2. 함수로 분리하면서 해당함수로 전달해야 할 매개변수가 많아진다면, 다음과 같은 리팩토링을 고려해볼 수 있다. (1) 임시 변수를 질의 함수로 바꾸기 (Replace Temp With Query) (2) 매개변수 객체 만들기 (Introduce Parameter Object) (3) 객체..
[리팩토링 기술-1] 중복코드를 처리하는 리팩토링 👀 중복코드의 단점 1. 비슷한 코드인지, 완전히 동일한 코드인지 주의깊게 살펴봐야 한다. 2. 코드 변경 시 통일한 모든 곳의 코드를 변경해야 한다. ✍ 사용할 수 있는 리팩토링 기술 1. 함수 추출하기 - 동일한 코드를 여러 메소드에서 사용하는 경우 사용한다. - 무슨 일을 하는 코드인지 알아내려고 노력해야 하는 코드라면, 해당 코드를 함수로 분리하고 함수 이름으로 "무슨 일을 하는지" 표현할 수 있다. ( = 의도를 드러낼 수 있다. ) [ Berfore ] * printParticipants() : 깃헙 커넥션을 만들고 -> 리포지토리를 읽어오고 -> 이슈를 찾아서 -> 이슈에서 코멘트를 돌면서 -> 참석한 사람들의 이름을 담아주고 -> 담은 userName을 출력하는 내용이다. import or..