Tworzenie inteligentnych ciągów znaków w Pythonie
Dobre pomysły architektoniczne nie dotyczą tylko dużych i skomplikowanych projektów. Niezależnie od tego, czy słyszałeś o projektowaniu opartym na domenie, czy nie, pokażę ci, jak ulepszyć swój projekt, duży lub mały, stosując podstawowe zasady do przekazywanych ciągów znaków. Czas zebrać te rozproszone fragmenty sprawdzania poprawności i analizowania kodu, które rozsiałeś po całym miejscu, i umieścić je w ładnej, nadającej się do ponownego użycia jednostce.
Zamierzamy tutaj po prostu zarysować powierzchnię projektowania opartego na domenie. Do końca tego artykułu będziesz chciał otrzymać kopię książki Erica Evansa o tym samym tytule. Podstawową koncepcją jest to, że najlepiej opracować model obiektowy przy użyciu języka domeny biznesowej. Reguły biznesowe są zakodowane w modelu. Jest to oddzielone od kodu aplikacji i infrastruktury. Będziemy trzymać się prostego przykładu zastosowania tego pomysłu do ciągów znaków w kodzie.
Odkryłem, że struny są prostym celem na początek, a jeśli to wszystko, co robisz, będziesz cieszyć się korzyściami. Obecnie mamy metodę uzyskiwania lokalizacji terminala lotu na podstawie jego numeru lotu, na przykład LA8165. Numer lotu możemy potraktować jako string:
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))
Przyjrzymy się teraz wszystkim subtelnym zaletom tego sposobu myślenia:
- Nasza nowa klasa jest niezwykle łatwa do przetestowania jednostkowego, ponieważ nie dotyka systemów plików, sieci ani niczego, z czego musimy kpić.
- Mamy jedno miejsce na dodawanie dokumentacji.
- Możemy spakować to pełne wszystkich reguł i parsowania, które chcemy, aby było kompletne.
- Każdy, kto jest nowy w projekcie, z łatwością dowie się, czym jest numer lotu, bardzo dokładnie.
- Wszystkie te obiekty można umieścić w folderze domeny, aby umożliwić ich ponowne użycie i wykrywanie.
- Kod wywołujący jest łatwiejszy do odczytania, a żądania ściągania są prostsze.
- Błędy zostaną wyłapane wcześniej w stosie
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}"
Bibliografia
- Projekt oparty na domenie

![Czym w ogóle jest lista połączona? [Część 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































