개요
함수는 추상화의 기본 빌딩 블록
추상화의 경계를 항상 올바르게 긋기는 쉽지 않다.
코드 베이스의 기능 범위가 달라지면 추상화의 경계도 움직인다.
초기에 응집도 높고 한 가지 일만 수행하던 함수가 둘 이상 다른 일을 수행하게 바뀔 수 있다는 뜻
예시
function renderPerson(outStream, person){ outStream.write(`<p>${person.name}</p>\n`); renderPhoto(outStream, person.photo); emitPhotoData(outStream, person.photo); } function listRecentPhotos(outStream, photos){ photos .filter(p=>p.date > recentDateCutoff()) .forEach(p=>{ outStream.write("<div>\n"); emitPhotoData(outStream, p) outStream.write("</div>\n"); }); } function emitPhotoData(outStream, photo){ outStream.write(`<p>제목: ${photo.title}</p>\n`); outStream.write(`<p>날짜: ${photo.date.toDateString()}</p>\n`); outStream.write(`<p>위치: ${photo.location}</p>\n`); } |
위치 정보만 다르게 해야 한다. |
function emitPhotoData(outStream, photo){ zztmp(outStream, photo); outStream.write(`<p>위치: ${photo.location}</p>\n`); } function zztmp(outStream, photo) {//이동하지 않을 코드 outStream.write(`<p>제목: ${photo.title}</p>\n`); outStream.write(`<p>날짜: ${photo.date.toDateString()}</p>\n`); } |
function renderPerson(outStream, person){ outStream.write(`<p>${person.name}</p>\n`); renderPhoto(outStream, person.photo); zztmp(outStream, person.photo); outStream.write(`<p>위치: ${photo.location}</p>\n`); } |
function listRecentPhotos(outStream, photos){ photos .filter(p=>p.date > recentDateCutoff()) .forEach(p=>{ outStream.write("<div>\n"); zztmp(outStream, p) outStream.write(`<p>날짜: ${photo.date.toDateString()}</p>\n`); outStream.write("</div>\n"); }); } |
function renderPerson(outStream, person){ outStream.write(`<p>${person.name}</p>\n`); renderPhoto(outStream, person.photo); emitPhotoData(outStream, person.photo); outStream.write(`<p>위치: ${photo.location}</p>\n`); } //기존 emitPhotoData제거 후 새 함수 이름 emitPhotoData로 변경 function listRecentPhotos(outStream, photos){ photos .filter(p=>p.date > recentDateCutoff()) .forEach(p=>{ outStream.write("<div>\n"); emitPhotoData(outStream, p) outStream.write(`<p>날짜: ${photo.date.toDateString()}</p>\n`); outStream.write("</div>\n"); }); } function emitPhotoData(outStream, photo) { outStream.write(`<p>제목: ${photo.title}</p>\n`); outStream.write(`<p>날짜: ${photo.date.toDateString()}</p>\n`); } |
'IT책, 강의 > 리팩터링' 카테고리의 다른 글
08 - 기능이동 - 문장 슬라이드하기 (0) | 2023.08.08 |
---|---|
08 - 기능이동 - 인라인 코드를 함수 호출로 바꾸기 (0) | 2023.08.07 |
08 - 기능이동 - 문장을 함수로 옮기기 (0) | 2023.08.05 |
08 - 기능이동 - 필드 옮기기 (0) | 2023.08.04 |
08 - 기능이동 - 함수 옮기기 (0) | 2023.08.03 |