การสร้างสตริงอย่างชาญฉลาดใน Python
แนวคิดทางสถาปัตยกรรมที่ดีไม่ได้มีไว้สำหรับโครงการขนาดใหญ่และซับซ้อนเท่านั้น ไม่ว่าคุณจะเคยได้ยินเกี่ยวกับการออกแบบที่ขับเคลื่อนด้วยโดเมนหรือไม่ก็ตาม ฉันจะแสดงให้คุณเห็นถึงวิธีการปรับปรุงโครงการของคุณ ไม่ว่าจะเล็กหรือใหญ่ โดยใช้หลักการพื้นฐานกับสตริงที่คุณได้ผ่านไปแล้ว ถึงเวลาที่จะรวบรวมบิตของการตรวจสอบความถูกต้องและการแยกวิเคราะห์โค้ดที่คุณได้กระจายไปทั่วสถานที่และทำให้มันกลายเป็นหน่วยที่ดีและใช้ซ้ำได้
เราจะมาดูพื้นผิวของการออกแบบที่ขับเคลื่อนด้วยโดเมนกันที่นี่ คุณจะต้องได้รับสำเนาหนังสือของ 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))
ตอนนี้เราจะสำรวจประโยชน์ที่ละเอียดอ่อนทั้งหมดของวิธีคิดนี้:
- คลาสใหม่ของเรานั้นง่ายอย่างเหลือเชื่อในการทดสอบหน่วย เพราะไม่ได้แตะต้องระบบไฟล์หรือเครือข่าย หรืออะไรก็ตามที่เราต้องจำลอง
- เรามีที่เดียวสำหรับเพิ่มเอกสาร
- เราสามารถบรรจุกฎทั้งหมดและการแยกวิเคราะห์ที่เราต้องการทำให้สมบูรณ์
- ใครก็ตามที่เริ่มโครงการใหม่จะเรียนรู้ได้อย่างง่ายดายว่าหมายเลขเที่ยวบินคืออะไร โดยเฉพาะอย่างยิ่ง
- วัตถุเหล่านี้ทั้งหมดสามารถไปอยู่ในโฟลเดอร์โดเมนเพื่อทำให้สามารถใช้ซ้ำได้และค้นพบได้
- รหัสการโทรนั้นอ่านง่ายกว่าและการดึงคำขอนั้นง่ายกว่า
- ข้อผิดพลาดจะถูกตรวจพบเร็วขึ้นในสแต็ก
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}"
อ้างอิง
- การออกแบบที่ขับเคลื่อนด้วยโดเมน





































![รายการที่เชื่อมโยงคืออะไร? [ส่วนที่ 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)