본문 바로가기

소프트웨어-이야기/프로그래밍 언어와 프레임워크

(saleor) 가독성 좋은 함수명 만들 때 유용한 팁 모음집

이 글은 Django E-commerce OpenSource인 Saleor에서 얻은 팁들을 정리한 문서입니다. 


1. 값을 증분할 때는 increase / decrease 동사를 prefix으로 붙인다.

def increase_voucher_usage(voucher):
voucher.used = F('used') + 1
voucher.save(update_fields=['used'])


def decrease_voucher_usage(voucher):
voucher.used = F('used') - 1
voucher.save(update_fields=['used'])


2. 상태를 확인할 때에는 is 동사를 prefix으로 붙인다. 


def is_category_on_sale(category, sale):
"""Check if category is descendant of one of categories on sale."""
discounted_categories = set(sale.categories.all())
return any([
category.is_descendant_of(c, include_self=True)
for c in discounted_categories])

상태를 의미할 때에는 전치사 on을 붙인다. 


3. 가능 여부를 확인할 때에는 can 동사를 prefix으로 붙인다.

def can_charge(self):
not_fully_charged = (
self.charge_status == ChargeStatus.CHARGED
and self.get_total() > self.get_captured_amount())
return self.is_active and (self.not_charged or not_fully_charged)

def can_void(self):
return self.is_active and self.not_charged and self.is_authorized

def can_refund(self):
return (
self.is_active and self.charge_status == ChargeStatus.CHARGED
and self.gateway != CustomPaymentChoices.MANUAL)


4. 포함여부를 확인할 때에는 contain 동사를 prefix으로 붙인다.

def contains_unavailable_variants(cart):
"""Return `True` if cart contains any unfulfillable lines."""
try:
for line in cart:
line.variant.check_quantity(line.quantity)
except InsufficientStock:
return True
return False


5. 데이터로 별도의 처리를 하는 경우 process 동사를 prefix으로 붙인다.

@transaction.atomic
def create_order(cart, tracking_code, discounts, taxes):
order_data = _process_voucher_data_for_order(cart)
order_data.update(_process_shipping_data_for_order(cart, taxes))
order_data.update(_process_user_data_for_order(cart))
order_data.update({
'language_code': get_language(),
'tracking_client_id': tracking_code,
'total': cart.get_total(discounts, taxes)})
def process_payment(
payment_information: Dict, connection_params: Dict) -> Dict:
auth_resp = authorize(payment_information, connection_params)
if auth_resp['is_success']:
payment_information['token'] = auth_resp['transaction_id']
return [auth_resp, capture(payment_information, connection_params)]
return [auth_resp, void(payment_information, connection_params)]


6. 객체를 딕셔너리로 변환할 때에는 as_dict를 suffix으로 붙인다.

def price_as_dict(price):
if price is None:
return None
return {
'currency': price.currency,
'gross': price.gross.amount,
'grossLocalized': prices_i18n.amount(price.gross),
'net': price.net.amount,
'netLocalized': prices_i18n.amount(price.net)}


def price_range_as_dict(price_range):
if not price_range:
return None
return {
'maxPrice': price_as_dict(price_range.start),
'minPrice': price_as_dict(price_range.stop)}


7. 객체를 특정 객체에 담는 행동을 할 때에는 add to 형식을 사용한다.

def product_add_to_cart(request, slug, product_id):
...
def add_variant_to_order(request, order_pk):

...