[리펙터링] 2. 기본기 익히기

jongmin-oh·2023년 4월 26일
0

Refactoring

목록 보기
2/2

Python 리펙터링 기본

이번 챕터에서는 가장 기본적인 리렉터링 기법들을 소개한다.
이것만 지켜도 사실상 반은 간다고 생각한다.

PEP8을 준수한다.

첫 번째로 기본 중에 기본은 PEP8을 준수하는 것이다.
PEP8은 파이썬 코드를 작성하는 데 가이드라인을 제공하는 문서로
파이썬 개발자들끼리 약속한 것이다. 약속을 어겨도 상관없지만 대부분 이 약속을 지키기 때문에 나 또한 지킨다면 내 코드의 가독성은 더 높아질 것이다.

함수 이름은 동사로 시작한다.

함수의 이름을 반드시 동사로 시작하는 것은 파이썬을 떠나 모든 프로그래밍 언어에서 포괄하는 관행이다.
해당 함수가 어떤 동작을 수행하는지 바로 이해할 수 있을뿐더러 일반적으로 통일성이 있어서 좋다.

함수는 한 가지 일만 한다.

함수의 수가 더 많아지는 것보다 여러 개를 만들더라도 함수가 어떤 동작을 수행하는지 명확하게 하는 것이 더 좋다.

함수의 인수는 3개 이하로 유지한다.

마찬가지로 함수의 인수가 많아지면 복잡해질 수 있다. 하지만 이건 불가피할 때도 있는데.
이러면 함수는 여러 개의 인수로 작성하되 함수의 파라미터를 넣어줄 때.

params = {
	"age": 20,
    "name": "jongmin",
    "address" : "인천시...",
    "weight" : 70, 
}

set_user(**parms)

위와 같이 넣어주면 명확하게 할 수 있다.

모든 레벨의 상수는 대문자료 표기한다.

이건 파이썬에 존재하는 관행이다. Python은 동적 타입핑을 지원하기 때문에 타 언어의 const 같은 타입이 없지만, 대문자로 표기함으로써 이를 어느 정도 대체할 수 있다. +로 final 타이핑까지 해주면 더 좋다.

MAX_LENGTH: Final[int] = 128

함수 인수의 기본값으로 가변 객체를 사용하지 않는다.

def append_item(item, my_list=[]):
    my_list.append(item)
    return my_list

위의 함수처럼 my_list 라는 가변객체를 사용하게 되면 함수 호출 시 인수의 값을 변경하여 예상치 못한 결과가 발생할 수 있다.

def append_item(item, my_list=None):
    if my_list is None:
        my_list = []
    my_list.append(item)
    return my_list

이렇게 변경해서 사용하는 것을 권장한다.

def append_item(item):
	my_list = []
    my_list.append(item)
    return my_list

이렇게 쓰면 되잖아? 라고 생각할 수도 있지만 이렇게 하면 새로운 리스트를 생성해야 해서 안 좋다고 한다. 난 그냥 이렇게 쓸래..

불리언을 반환하는 함수는 is_* 로 명명한다.

관행입니다. is_null() , is_email_type() 이런 식으로 작성해야 합니다.

단축 평가를 사용한다.

if x != 0 and 10/x > 1:
    # do something if x is not zero and 10/x is greater than 1

if x != 0:
    if 10/x > 1:
        # do something if 10/x is greater than 1

두 번째 코드가 더 복잡해 보이고 한 줄 늘어나지만, 가독성 측면으로 보면 훨씬 이해하기 쉽다. 조건문의 경우 이런식으로 작성할 필요가 있다.

예외 처리는 하나의 try/except 블록을 사용한다.

try:
    x = int(input("Enter a number: "))
    y = int(input("Enter another number: "))
    print(x / y)
except ValueError:
    print("Invalid input")
except ZeroDivisionError:
    print("Cannot divide by zero")

하나의 try 블록에서 발생하는 모든 예외를 하나의 except 블록에서 처리할 수 있도록 하는 것이 좋다.

중첩된 코드는 피한다.


정리

위에서 언급한 모든 내용은 지키지 않아도 에러를 발생시키지 않는다.
하지만 위 규칙들을 준수한다면 모두를 위한 훨씬 깔끔하고 가독성 좋은 코드가 될 것이다.

profile
스타트업에서 자연어처리 챗봇을 연구하는 머신러닝 개발자입니다.

0개의 댓글