블로그를 이전하였습니다. 2023년 11월부터 https://bluemiv.github.io/에서 블로그를 운영하려고 합니다. 앞으로 해당 블로그의 댓글은 읽지 못할 수 도 있으니 양해바랍니다.
반응형
리펙토링이란?
리펙토링은 기존의 코드를 외부의 동작 방식에는 변화 없이 내부 구조를 변경해서 재구성하는 작업 또는 기술을 말한다.
리펙토링을 통해 얻을 수 있는 이점
- 코드를 이해하기 편해짐
- 변화에 효율적으로 대응할 수 있음
- 생산성이 높아짐
- 코드의 품질이 좋아짐
- 유지 보수하기 편함
Example
(적절한 예인지 모르겠으나, 한가지 예를 만들어봤다)
예를들어서, 정보를 담고 있는 A.txt, B.txt 파일 2개를 만들고, text_dir 라는 특정 디렉토리에 복사하는 프로그램을 작성했다.
import os
import shutil
dir_path = "~/text_dir"
# A.txt
a_file_path = "~/A.txt"
with open(a_file_path, "w") as f:
f.write("블라블라")
shutil.copy2(a_file_path, os.path.join(dir_path, "A.txt"))
# B.txt
b_file_path = "~/B.txt"
with open(b_file_path, "w") as f:
f.write("블라블라2")
shutil.copy2(b_file_path, os.path.join(dir_path, "B.txt"))
중복제거
하지만, 위 코드는 중복된 부분도 있고, 복사해야하는 파일 C.txt 가 생긴다고 하면 같은 코드를 또 작성해야한다.
위 코드를 리팩토링하면, 아래와 같이 할 수 있다. (더 좋게 바꿀 수도 있겠지만, 내가 생각한 부분은 여기까지..)
import os
import shutil
def write_n_copy(src_path, dest_path, text):
"""파일에 만들고 특정 디렉토리로 복사한다"""
dir_name, file_name = os.path.split(src_path)
with open(src_path, "w") as f:
f.write(text)
shutil.copy2(src_path, os.path.join(dest_path, file_name))
# A.txt
write_n_copy("~/A.txt", "~/text_dir", "블라블라")
# B.txt
write_n_copy("~/B.txt", "~/text_dir", "블라블라2")
상황 1. 파일 추가 요청
고객사의 요청으로 C.txt 파일도 추가하고, C.txt 파일은 text_dir2에 복사해달라고 한다면 아래와 같이 메소드를 하나 더 호출하면 된다.
import os
import shutil
def write_n_copy(src_path, dest_path, text):
"""파일에 만들고 특정 디렉토리로 복사한다"""
dir_name, file_name = os.path.split(src_path)
with open(src_path, "w") as f:
f.write(text)
shutil.copy2(src_path, os.path.join(dest_path, file_name))
# A.txt
write_n_copy("~/A.txt", "~/text_dir", "블라블라")
# B.txt
write_n_copy("~/B.txt", "~/text_dir", "블라블라2")
# C.txt
write_n_copy("~/C.txt", "~/text_dir2", "블라블라3")
상황 2. DB 저장 추가
이번에는 파일을 만들고 특정 디렉토리로 복사하는 것 뿐만 아니라, DB에도 값을 저장해달라는 요청이 들어왔다. 단순히 메소드 내부만 수정하면 된다.
import os
import shutil
def write_n_copy(src_path, dest_path, text):
"""파일에 만들고 특정 디렉토리로 복사한다"""
dir_name, file_name = os.path.split(src_path)
with open(src_path, "w") as f:
f.write(text)
shutil.copy2(src_path, os.path.join(dest_path, file_name))
# 아래에 DB에 값을 넣는 코드 추가
# ...
# A.txt
write_n_copy("~/A.txt", "~/text_dir", "블라블라")
# B.txt
write_n_copy("~/B.txt", "~/text_dir", "블라블라2")
# C.txt
write_n_copy("~/C.txt", "~/text_dir2", "블라블라3")
결론은 코드 리팩토링을 통해 변화에 효율적이고 유연하게 대응할 수 있다는 것이다.
Code Smell
리팩토링이 절실히 필요한 코드를 Code Smell 이라고 칭한다.
- 말 그대로 "코드에서 (나쁜) 냄새가 난다." 라는 뜻
Code Smell 중 흔한 예는 '중복된 코드' 다. 적절한 리팩토링을 통해 Code Smell 을 제거해줘야 한다.
추천하는 책
Code Smell 과 관련되어 추천하는 책
- '리팩토링' (마틴 파울러, 켄트 벡 공저)
반응형
'ETC' 카테고리의 다른 글
Mac OS에서 Virtual Box 설치 실패하는 경우 (0) | 2020.07.21 |
---|---|
CI/CD 개념 정리 (0) | 2020.07.08 |
[공유] 클래스 다이어그램 그리기 좋은 웹 서비스 (0) | 2020.06.07 |
병행성(Concurrency)과 병렬성(Parallelism) (0) | 2020.04.10 |
Git 좋은 커밋(Commit) 메세지 작성하기 (0) | 2020.03.04 |