나는 리팩토링하고 싶은 비교적 큰 레거시 메서드를 가지고 있습니다. Michael Feathers의 "Legacy Code Effective With Effective With Legacy Code"에 명시된대로 "Bulleted method"유형에 적합하기 때문에 직선적 인 방식으로 여러 순차적 방법으로 분할 될 수 있습니다. 그러나 각각의 순차적 인 단계는 일부 로그 메시지를 출력하고 메시지 자체는 단계 자체보다 훨씬 많은 데이터를 필요로합니다. 그래서 메서드를 추출하려고 할 때, 결국 6 개의 매개 변수를 갖는 메서드로 끝납니다. 이러한 로그 문을 제거했다면 매개 변수가 하나 뿐인 메서드가 있습니다. 그래서 나는 효과적으로 리펙터를 할 수 없습니다. 그리고 나는 단지 로그 문을 삭제할 수 없다.로그 문은 리팩토링을 방지합니다.
방법의 일부는 다음과 같습니다
// much of code before
Device device = getDevice(deviceID);
boolean isFirstRegistration = false;
if (device == null) {
/*logger.trace(
"DeviceId", deviceID,
"ADM", adminCode,
"Phone", clientData.getPhone()
);
logger.info("First registration of the device. Device ID - " + deviceID);*/
isFirstRegistration = true;
} else {
/*logger.trace(
"DeviceId", deviceID,
"ADM", adminCode,
"Phone", clientData.getPhone()
);
logger.info("Device ID - " + deviceID
+ " has been previously registered by adminCode: "
+ device.getAdminCode());*/
}
// much of code after
보시다시피가, 로깅 문을 주석. 이 경우 방법 boolean isFirstRegistration(String deviceId)
을 추출 할 수 있습니다. 그러나 주석을 달지 않은 경우 서명이 최대 boolean isFirstRegistration(String deviceId, String adminCode, ClientData clientData)
까지 증가합니다. 그리고 그것은 가장 극단적 인 경우는 아니며, 처음 엿볼 수 있습니다. 어떤 방법으로 리팩터링해야합니까?
우리가 볼 수 있습니까? 로그 도우미 메서드가 추가 데이터를 가져 와서 로깅을 위해 메서드에 전달하는 단일 문자열/개체를 반환하도록 할 수 있습니다. 또는 로깅에 필요한 모든 항목을 하나의 배열이나 해시에 넣은 다음 전달하십시오. – CaffGeek
리팩터링을 통해 무엇을 달성하려고합니까? –
나는 그 방법의 부분과 유사한 스 니펫을 작성하려고 노력할 것이다. – Rorick