본문 바로가기
프로그래밍 언어/Python

[Python] 파이썬 프로그래밍의 개발 지침

by 토마토베이컨수프 2021. 10. 1.

소프트웨어 업계에서 많이들 인용된다는 개발 지침 용어들 중 일부를 정리해 보았습니다.

 

DRY / OAOO

DRY : Do not Repeat Yourself의 약자로, 중복을 피해야 한다는 뜻입니다.
OAOO : Once and Only Once의 약자로, 코드에 있는 지식은 단 한번, 단 한 곳에 정의되어야 한다는 뜻입니다.

 

예를 들어, 다음과 같은 코드를 보면

def process_calculation(nums):
    revalued_nums = sorted(nums, key=lambda x: x.deci * 2 + x.one * 3)
    for num in revalued_nums:
    	print(num.deci * 2 + num.one * 3)

새롭게 평가된 변수들의 리스트 revalued_nums를 구하는 로직과, 그 값을 출력하는데 있어 불필요한 중복이 들어가 있습니다. 코드를 변경하려고 할 때 수정이 필요한 곳은 한군데만 있어야 하며, 위 코드에서는 만약 변수들의 평가 기준이 바뀌게 된다면 두 군데를 수정해야 하니 좋은 코드라 할 수 없습니다.

 

위 코드의 중복을 제거하기 위해 함수 생성 기법을 사용해 보겠습니다.

def revalue(num):
    return num.deci * 2 + num.one * 3
    
def process_calculation(nums):
    revalued_nums = sorted(nums, key=revalue)
    for num in revalued_nums:
    	print(revalue(num))

 


YAGNI

YAGNI : You Ain't Gonna Need it의 약자로, 과잉 엔지니어링을 하지 않도록 항상 염두에 두어야 한다는 원칙입니다.

소프트웨어를 작성한 후 나중에 수정을 쉽게 하기 위해 추상화에 신경을 많이 써야하고, 굳이 필요 없는 추가 개발을 하지 말라는 뜻입니다.

 

KIS

KIS : Keep It Simple의 약자로, 과잉 엔지니어링을 피하라는 뜻으로 YAGNI와 흡사합니다.

 

아래 코드를 보면

class Namespace:
    """주어진 속성을 가진 인스턴스를 만듬"""
    ATTR = ("id", "name")
    
    @classmethod
    def init_again(cls, **data):
        instance = cls()
        for key, value in data:
            if key in cls.ATTR:
                setattr(instance, key, value)
        return instance

객체를 초기화 하기 위해 클래스 메소드까지 써가며 setattr 함수를 통해 속성을 직접 집어넣습니다. 이 대신 __init__ 메소드를 통해 객체를 초기화 하는 편이 훨씬 더 간편합니다.

class Namespace:
    ATTR = ("id", "name")
    
    def __init__(self, **data):
        accepted_data = {
            key: value for key, value in data.items() if key in self.ATTR
        }
        self.__dict__.update(accepted_data)

 


EAFP / LBYL

EAFP : Easier to Ask Forgiveness than Permission의 약자로 일단 코드를 실행하고 동작하지 않을 경우에 대응한다는 뜻입니다.
LBYL : Look Before You Leap의 약자로 코드를 실행하기 전 먼저 검사를 하라는 뜻입니다.

 

먼저 아래의 코드는 LBYL의 방식으로 작성한 코드 입니다. 파일을 열기 전 먼저 파일이 있는 확인합니다.

if os.path.exists(filename):
    with open(filename) as f:
        ...

그러나 파이썬은 EAFP 방식으로 코딩하는 것을 권장합니다. 따라서 위 코드를 EAFP 방식으로 다시 작성해보면, 우선 try except문을 이용해 파일을 여는 동작을 수행하도록 하고 에러가 발생하였을 때 그에 따른 처리를 해줍니다.

try:
    with open(filename) as f:
        ...
except FileNotFoundError as e:
    logger.error(e)

 


참고 자료

  • <파이썬 클린 코드 : 유지보수가 쉬운 파이썬 코드를 만드는 비결, 마리아노 아나야 지음>

'프로그래밍 언어 > Python' 카테고리의 다른 글

[Python] 제너레이터  (0) 2021.11.11
[Python] 유용한 데이터 구조  (0) 2021.11.07
[Python] 파이썬 다운 코딩  (0) 2021.11.05
[Python] SOLID 원칙  (0) 2021.10.03
[Python] 매직 메소드를 통한 기능 구현  (0) 2021.09.29