본문 바로가기

programming study/Refactoring

(21)
Refactoring - 기본적인 리팩터링(1) 본 내용은 마틴 파울러의 Refactoring 2판을 토대로 작성되었습니다. 기본적인 리팩터링 가장 기본적이고 많이 사용하는 리팩터링 기법들 1. 함수 추출하기 반대 리팩터링: 함수 인라인하기 예시 코드 function printOwing(invoice) { printBanner(); let outstanding = calculateOutstanding(); // 세부 사항 출력 console.log(`고객명: ${invoice.customer}`); console.log(`채무액: ${outstanding}`); } function printOwing(invoice) { printBanner(); let outstanding = calculateOutstanding(); printDetails(outs..
Refactoring - 테스트 구축하기 본 내용은 마틴 파울러의 Refactoring 2판을 토대로 작성되었습니다. 테스트 구축하기 리팩터링을 제대로 하려면 불가피하게 저지르는 실수를 잡아주는 견고한 테스트 스위트가 뒷받침 되어야 함 리팩터링을 하지 않더라도 좋은 테스트를 작성하는 일은 개발 효율을 높여줌 1. 자가 테스트 코드의 가치 실제 코드를 작성하는 시간의 비중은 그리 크지 않음 대부분의 시간은 디버깅에 사용 모든 테스트를 완전히 자동화하고 그 결과까지 스스로 검사하게 만들자 컴파일할 때마다 테스트도 함께 실행 생산성이 급상승, 디버깅 시간이 크게 줄어듦 테스트를 자주 수행하는 습관 가지기 버그가 발생한 지점은 조금 전에 작성한 코드에 있음 테스트 스위트는 강력한 버그 검출 도구로, 버그를 찾는 데 걸리는 시간을 대폭 줄여줌 테스트를 ..
Refactoring - 코드에서 나는 악취(4) 본 내용은 마틴 파울러의 Refactoring 2판을 토대로 작성되었습니다. 코드에서 나는 악취 중개자 객체의 대표적인 기능 중 하나는 외부로부터 세부사항을 숨겨주는 캡슐화 캡슐화하는 과정에서는 위임(delegation)이 자주 활용 클래스가 제공하는 메서드 중 절반이 다른 클래스에 구현을 위임하는 것은 문제가 됨 중개자 제거하기를 활용하여 실제로 일을 하는 객체와 직접 소통하게 함 위임메서드를 제거한 후 남는 일이 거의 없다면 호출하는 쪽으로 함수 인라인 하기 내부자 거래 모듈 사이의 데이터 거래가 많으면 결합도가 높아짐 데이터를 주고받는 모듈들이 있으면 함수 옮기기와 필드 옮기기 기법으로 떼어놓아서 처리하는 부분을 줄임 여러 모듈이 같은 관심사를 공유한다면 공통 부분을 정식으로 처리하는 제3의 모듈을..
Refactoring - 코드에서 나는 악취(3) 본 내용은 마틴 파울러의 Refactoring 2판을 토대로 작성되었습니다. 코드에서 나는 악취 기본형 집착 대부분의 프로그래밍 언어는 정수, 부동소수점 수, 문자열 같은 다양한 기본형(Primitive Type)을 제공 라이브러리를 통해 날짜 같은 간단한 객체를 추가로 제공하기도 함 주어진 문제에 맞는 기초 타입(화폐, 좌표, 구간 등)을 직접 정의하기를 몹시 꺼리는 사람이 많음 금액을 그냥 숫자형으로 계산 물리량을 계산할 때 단위형을 무시 최소한 사용자에게 보여줄 때는 일관된 형식으로 출력해주는 기능이라도 갖춰야 함 문자열화된 변수(Stringify Typed): 자료형들을 문자열로만 표현하는 악취 기본형을 객체로 바꾸기 기본형으로 표현된 코드가 조건부 동작을 제어하는 타입 코드로 사용되었다면 타입 ..
Refactoring - 코드에서 나는 악취(2) 본 내용은 마틴 파울러의 Refactoring 2판을 토대로 작성되었습니다. 코드에서 나는 악취 전역 데이터 전역 데이터는 코드베이스 어디에서든 건드릴 수 있고 값을 누가 바꿨는지 찾아낼 매커니즘이 없음 유령 같은 원격 작용(Spooky action at a distance)처럼, 버그는 끊임없이 발생 원인이 되는 코드를 찾아내기가 굉장히 어려움 대표적인 형태는 전역 변수 클래스 변수와 싱글톤(singletone)에서도 같은 문제가 발생 이를 방지하기 위한 대표적인 리팩터링은 변수 캡슐화하기 함수를 감싸는 것만으로도 데이터를 수정하는 부분을 쉽게 찾을 수 있고 접근을 통제 접근자 함수들을 클래스나 모듈에 집어넣고 그 안에서만 사용할 수 있도록 접근 범위를 최소로 줄이는 것이 좋음 전역 데이터가가변(mut..
Refactoring - 코드에서 나는 악취(1) 본 내용은 마틴 파울러의 Refactoring 2판을 토대로 작성되었습니다. 코드에서 나는 악취 적용 방법을 아는 것과 제때 적용할 줄 아는 것은 다름 리팩터링을 언제 해야 하는지에 대해서는 명확하게 정립된 규칙이 없음 리팩터링이 절실한 코드들에 일정한 패턴이 있음 코드가 풍기는 냄새(악취)가 무엇인지 찾자 기이한 이름 코드는 단순하고 명료하게 작성 코드를 명료하게 표현하는 데 가장 중요한 요소 하나는 이름 함수, 모듈, 변수, 클래스 등은 그 이름만 보고도 각각이 무슨 일을 하고 어떻게 사용해야 하는지 명확하게 알 수 있도록 엄청나게 신경 써서 이름을 지을 것 가장 많이 사용하는 리팩터링도 아래와 같은 이름을 바꾸는 리팩터링임 함수 선언 바꾸기 변수 이름 바꾸기 필드 이름 바꾸기 이름만 잘 지어도 나중..
Refactoring - 리팩터링 원칙(5) 본 내용은 마틴 파울러의 Refactoring 2판을 토대로 작성되었습니다. 리팩터링 원칙 리팩터링의 유래 정확한 유래는 찾을 수 없음 실력있는 프로그래머는 항상 자신의 코드를 정리하는 데 어느 정도의 시간을 할애 깔끔한 코드가 수정하기 쉬움 단, 처음부터 깔끔하게 작성하는 경우는 거의 없음 리팩터링은 소프트웨어 개발 프로세스 전반의 핵심 요소 스몰토크 기능이 풍부한 소프트웨어를 빠르게 작성할 수 있는 굉장히 역동적인 환경 개발 환경 중에서 리팩터링을 활용하기 특히 좋음 컴파일-링크-실행 주기가 상당히 짧음 마지막으로 컴파일한 시점을 안다면 수정 작업을 빠르게 진행 가능 객체 지향 언어의 경우, 인터페이스만 잘 정의해두면 내부 수정이 일부에 미치는 영향을 최소로 줄일 수 있음 그 결과로 XP가 탄생 생산..
Refactoring - 리팩터링 원칙(4) 본 내용은 마틴 파울러의 Refactoring 2판을 토대로 작성되었습니다. 리팩터링 원칙 리팩터링과 성능 리팩터링은 이해하기 쉽게 만들기 위해 속도가 느려지는 방향으로 수정되는 경우도 있음 그와 동시에 성능을 튜닝하기는 더 쉬워짐 튜닝하기 쉽게 만들고 나서 원하는 속도가 나오게끔 튜닝 빠른 소프트웨어를 작성하는 방법 세 가지 시간 예산 분배(time budgeting) 하드 리얼타임 시스템에서 많이 사용 설계를 여러 컴포넌트로 나눠서 컴포넌트마다 자원(시간과 공간) 예산을 할당 컴포넌트는 할당된 자원 예산을 초과할 수 없으며 주어진 자원을 서로 주고 받는 메커니즘은 가능 엄격한 시간 엄수를 강조 ex) 심작 박동 조율기 끊임 없이 관심을 기울이기 But. 성능을 개선하기 위해 코드를 수정하다 보면 프로..