Python에서 문자열을 스마트하게 만들기

Jan 10 2023
도메인 기반 디자인 적용
좋은 건축 아이디어는 크고 복잡한 프로젝트에만 해당되는 것이 아닙니다. Domain-driven Design에 대해 들어본 적이 있든 없든, 나는 당신이 전달해 온 문자열에 기본 원칙을 적용하여 크든 작든 프로젝트를 개선하는 방법을 보여줄 것입니다.
Unsplash의 xandtor 사진

좋은 건축 아이디어는 크고 복잡한 프로젝트에만 해당되는 것이 아닙니다. Domain-driven Design에 대해 들어본 적이 있든 없든, 나는 당신이 전달해 온 문자열에 기본 원칙을 적용하여 크든 작든 프로젝트를 개선하는 방법을 보여줄 것입니다. 여기저기 흩어져 있는 유효성 검사 및 구문 분석 코드의 흩어진 비트를 수집하여 멋진 재사용 가능한 단위로 가져올 시간입니다.

우리는 여기서 Domain-driven Design의 겉핥기만 할 것입니다. 이 기사가 끝날 때까지 같은 이름의 Eric Evans의 책을 구하고 싶을 것입니다. 핵심 개념은 개체 모델이 비즈니스 도메인의 언어를 사용하여 가장 잘 개발된다는 것입니다. 비즈니스 규칙은 모델에 인코딩됩니다. 이는 애플리케이션 및 인프라 코드와 별도로 유지됩니다. 이 아이디어를 코드의 문자열에 적용할 수 있는 방법에 대한 간단한 예에 충실할 것입니다.

문자열이 시작하기에 간단한 대상이라는 것을 알았고 그것이 전부라면 이점을 누릴 수 있습니다. 오늘날 우리는 항공편 번호가 주어진 항공편의 터미널 위치를 얻는 방법을 가지고 있습니다 LA8165. 항공편 번호를 문자열로 처리할 수 있습니다.

def getTerminal(flight_number): 
  return db.getTerminal(flight_number)

def getTerminal(flight_number): 
  # Normalize input to a clean string
  flight_number = str(flight_number).upper().strip()
  if not flight_number:
    raise ValueError(“Flight Number can not be empty.”)

  return db.getTerminal(flight_number)

class FlightNumber(object):
  def __init__(self, flight_number):
    # Normalize input to a clean string
    flight_number = str(flight_number).upper().strip()
    if not flight_number:
      raise ValueError(“Flight Number can not be empty.”)
    self.flight_number = flight_number

  # The value when this is cast to a string or used in a formatted string
  def __str__(self):
    return self.flight_number

def getTerminal(flight_number): 
  flight_number = FlightNumber(flight_number)
  return db.getTerminal(str(flight_number))

이제 이러한 사고 방식의 모든 미묘한 이점을 살펴보겠습니다.

  1. 우리의 새 클래스는 파일 시스템이나 네트워크 또는 우리가 조롱해야 할 어떤 것도 건드리지 않기 때문에 단위 테스트가 매우 쉽습니다.
  2. 문서를 추가할 수 있는 단일 위치가 있습니다.
  3. 우리는 이것을 완전하게 만들고자 하는 모든 규칙과 구문 분석으로 가득 채울 수 있습니다.
  4. 프로젝트를 처음 접하는 사람은 항공편 번호가 매우 구체적으로 무엇인지 쉽게 알 수 있습니다.
  5. 이러한 개체는 모두 도메인 폴더에 저장되어 재사용 및 검색이 가능합니다.
  6. 호출 코드는 읽기 쉽고 풀 요청은 더 간단합니다.
  7. 오류는 스택에서 더 빨리 포착됩니다.

class FlightNumber(object):
  """
  Represents an International Air Transport Association flight number. Ex — LA8165
  The format is two uppercase letters for the airline followed by up to four digits. 
  """
  def __init__(self, flight_number):
  # Normalize input to a clean string
  flight_number = str(flight_number).upper().strip()
  if not flight_number:
    raise ValueError("Flight Number can not be empty.")
  self.airline_code = flight_number[0:2].strip()
  if not self.airline_code.isalpha():
    raise ValueError(f"Airline Code {self.airline_code} must be two letters.")
  # Throws ValueError already if not a valid int
  self.numeric_part = int(flight_number[2:])
  if self.numeric_part < 1 or self.numeric_part > 9999:
    raise ValueError(f”Flight Number {self.numeric_part} must be from 1 to 9999.”)
  if self.numeric_part == 666:
    raise ValueError(f"Seriously, airlines don’t use this flight number.")

  def __str__(self):
    return f"{self.airline_code}{self.numeric_part}"

참조

  • 도메인 기반 디자인