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