리펙토링 (5) 썸네일형 리스트형 리펙토링 - 뒤엉킨 변경 뒤엉킨 변경 소프트웨어는 변경에 유연하게(soft) 대처할 수 있어야 한다. • 어떤 한 모듈이 (함수 또는 클래스가) 여러가지 이유로 다양하게 변경되어야 하는 상황. • 예) 새로운 결제 방식을 도입하거나, DB를 변경할 때 동일한 클래스에 여러 메소드를 수정해야 하는 경우. • 서로 다른 문제는 서로 다른 모듈에서 해결해야 한다. • 모듈의 책임이 분리되어 있을수록 해당 문맥을 더 잘 이해할 수 있으며 다른 문제는 신경쓰지 않아도 된다. 관련 리팩토링 기술 •“단계 쪼개기 (Split Phase)”를 사용해 서로 다른 문맥의 코드를 분리할 수 있다. •“함수 옮기기 (Move Function)”를 사용해 적절한 모듈로 함수를 옮길 수 있다. • 여러가지 일이 하나의 함수에 모여 있다면 “함수 추출하기.. 리펙토링 - 가변 데이터 가변 데이터 • 데이터를 변경하다보면 예상치 못했던 결과나 해결하기 어려운 버그가 발생하기도 한다. • 함수형 프로그래밍 언어는 데이터를 변경하지 않고 복사본을 전달한다. 하지만 그밖의 프로그래밍 언어는 데이터 변경을 허용하고 있다. 따라서 변경되는 데이터 사용 시 발생할 수 있는 리스크를 관리할 수 있는 방법을 적용하는 것이 좋다. • 관련 리팩토링 •“변수 캡슐화하기 (Encapsulate Variable)”를 적용해 데이터를 변경할 수 있는 메소드를 제한하고 관리할 수 있다. •“변수 쪼개기 (Split Variable)”을 사용해 여러 데이터를 저장하는 변수를 나눌 수 있다. •“코드 정리하기 (Slide Statements)”를 사용해 데이터를 변경하는 코드를 분리하고 피할 수 있다. •“함수 .. 리펙토링 - 전역 데이터 전역 데이터 • 전역 데이터 (예, 자바의 public static 변수) • 전역 데이터는 아무곳에서나 변경될 수 있다는 문제가 있다. • 어떤 코드로 인해 값이 바뀐 것인지 파악하기 어렵다. • 클래스 변수 (필드)도 비슷한 문제를 겪을 수 있다. •“변수 캡슐화하기 (Encapsulate Variable)”를 적용해서 접근을 제어하거나 어디서 사 용하는지 파악하기 쉽게 만들 수 있다. 변수 캡슐화하기 • 메소드는 점진적으로 새로운 메소드로 변경할 수 있으나, 데이터는 한번에 모두 변경해야 한다. • 데이터 구조를 변경하는 작업을 그보다는 조금 더 수월한 메소드 구조 변경 작업으로 대체 할 수 있다. • 데이터가 사용되는 범위가 클수록 캡슐화를 하는 것이 더 중요해진다. • 함수를 사용해서 값을 변경.. 리펙토링 - 긴함수 짧은 함수 vs 긴 함수 • 함수가 길 수록 더 이해하기 어렵다. vs 짧은 함수는 더 많은 문맥 전환을 필요로 한다. • “과거에는” 작은 함수를 사용하는 경우에 더 많은 서브루틴 호출로 인한 오버헤드가 있었다. • 작은 함수에 “좋은 이름”을 사용했다면 해당 함수의 코드를 보지 않고도 이해할 수 있다. • 어떤 코드에 “주석”을 남기고 싶다면, 주석 대신 함수를 만들고 함수의 이름으로 “의도”를 표현해보자. 사용할 수 있는 리팩토링 기술 • 99%는, “함수 추출하기 (Extract Function)”로 해결할 수 있다. • 함수로 분리하면서 해당 함수로 전달해야 할 매개변수가 많아진다면 다음과 같은 리팩토링을 고려해볼 수 있다. • 임시 변수를 질의 함수로 바꾸기 (Replace Temp with .. 리팩토링-함수 추출하기,코드 정리하기, 메소드 올리기 1.함수 추출하기 •“의도”와 “구현” 분리하기 • 무슨 일을 하는 코드인지 알아내려고 노력해야 하는 코드라면 해당 코드를 함수로 분리하고 함수 이름으로 “무슨 일을 하는지” 표현할 수 있다. • 함수 이름으로 무슨일을 할 수 있는지 알면 한줄 짜리 메소드도 괜찮다. • 거대한 함수 안에 들어있는 주석은 추출한 함수를 찾는데 있어서 좋은 단서가 될 수 있다. @PostMapping("/login") public String memberLogin(@Valid LoginDTO loginDTO, BindingResult result, HttpServletResponse response, HttpServletRequest request) { Member member = new Member(loginDTO.get.. 이전 1 다음