แนวทางปฏิบัติที่ดีที่สุดใน Python
บทความนี้อธิบายแนวทางปฏิบัติที่ดีที่สุดใน Python
เราจะอธิบายแนวทางปฏิบัติที่ดีที่สุดใน Python พร้อมตัวอย่างโค้ดจริง แนะนำวิธีการเขียนโค้ดที่อ่านง่ายและดูแลรักษาได้
YouTube Video
แนวทางปฏิบัติที่ดีที่สุดใน Python
ให้ความสามารถในการอ่านเป็นสิ่งสำคัญอันดับแรก
ก่อนอื่น มาดูหัวข้อ 'การให้ความสามารถในการอ่านเป็นสิ่งสำคัญอันดับแรก'
Python เป็นภาษาที่ให้ความสำคัญกับ 'ความสามารถในการอ่าน' ก่อนอื่น ควรให้ความสำคัญกับการเขียนโค้ดที่เจตนาเข้าใจได้ในทันที
1# Bad example: unclear variable names
2a = 10
3b = 5
4c = a * bในตัวอย่างโค้ดนี้ ชื่อตัวแปรไม่ได้บอกข้อมูลหรือความหมาย ทำให้ผู้อื่นใช้เวลาทำความเข้าใจในภายหลัง
1# Good example: descriptive variable names
2price = 10
3quantity = 5
4total_cost = price * quantityการตั้งชื่อตัวแปรให้สื่อความหมายชัดเจน จะช่วยให้โค้ดของคุณเป็นเสมือนเอกสารไปในตัว
เขียนโค้ดให้ชัดเจน
ถัดไป มาดูหัวข้อ 'การเขียนโค้ดให้ชัดเจน'
ใน Python เจตนาที่ชัดเจนดีกว่าพฤติกรรมที่กำกวม
1# Bad example: implicit truthy check
2if data:
3 process(data)ในตัวอย่างโค้ดนี้ ไม่ชัดเจนว่า data คาดหวังค่าแบบไหน อาจทำให้เกิดบั๊กได้ง่าย
1# Good example: explicit condition
2if len(data) > 0:
3 process(data)การระบุเงื่อนไขอย่างชัดเจน ทำให้เจตนาของโค้ดตรงกับข้อกำหนด
ทำให้ฟังก์ชันสั้น และเน้นทำงานเพียงหน้าที่เดียว
ต่อไป มาดูหัวข้อ 'การทำให้ฟังก์ชันสั้นและเน้นรับผิดชอบงานเดียว'
เมื่อฟังก์ชันเดียวทำหลายอย่าง การทดสอบและดูแลรักษาจะยากขึ้น
1# Bad example: doing too many things
2def handle_user(user):
3 save_to_database(user)
4 send_email(user)
5 write_log(user)ในโค้ดตัวอย่างนี้ กระบวนการต่างๆ ถูกเชื่อมโยงเข้าหากันแน่นเกินไปจึงนำกลับมาใช้ซ้ำหรือแก้ไขได้ยาก
1# Good example: single responsibility
2def save_user(user):
3 save_to_database(user)
4
5def notify_user(user):
6 send_email(user)
7
8def log_user(user):
9 write_log(user)ถ้าแยกฟังก์ชันออกจากกัน บทบาทของแต่ละฟังก์ชันจะชัดเจนและทดสอบง่ายขึ้น
ใช้ type hint อย่างสม่ำเสมอ
ต่อไป มาดูหัวข้อ 'การใช้ type hint อย่างสม่ำเสมอ'
type hint เป็นเสมือนเอกสารและเครื่องมือสำคัญในการป้องกันบั๊ก
1# Bad example: Without type hints
2def add(a, b):
3 return a + bในโค้ดนี้ ประเภทของอาร์กิวเมนต์และค่าที่คืนกลับไม่ชัดเจน อาจนำไปสู่การใช้งานที่ผิดได้
1# Good example: With type hints
2def add(a: int, b: int) -> int:
3 return a + bการใช้ type hint ช่วยให้ฟีเจอร์ auto-complete ของ IDE, การวิเคราะห์แบบ static และความสามารถในการอ่านดีขึ้นมาก
ระบุอย่างชัดเจนถึงความเป็นไปได้ที่จะส่งค่ากลับเป็น None
ต่อไป มาดูหัวข้อ 'การระบุอย่างชัดเจนถึงความเป็นไปได้ที่จะส่งค่ากลับเป็น None'
ฟังก์ชันที่อาจคืนค่าเป็น None มักถูกผู้ใช้มองข้าม
1# Bad example: Ambiguous return value
2def find_user(user_id):
3 if user_id == 1:
4 return {"id": 1, "name": "Alice"}
5 return Noneในโค้ดนี้ ไม่แน่ใจว่าจะได้ค่ากลับหรือไม่
1# Good example: explicit return type
2from typing import Optional, Dict, Any
3
4def find_user(user_id: int) -> Optional[Dict[str, Any]]:
5 if user_id == 1:
6 return {"id": 1, "name": "Alice"}
7 return Noneการใช้ Optional จะสื่อถึงความเป็นไปได้ของการคืนค่า None ผ่าน type ได้
อย่าจับ exception อย่างกว้างเกินไป
ต่อไป มาดูหัวข้อ 'อย่าจับ exception อย่างกว้างเกินไป'
การจัดการ exception ควรจับเฉพาะสิ่งที่จำเป็นเท่านั้น
1# Bad example: catching all exceptions
2try:
3 result = int(value)
4except Exception:
5 result = 0โค้ดนี้อาจซ่อนบั๊กที่ควรจะตรวจพบ
1# Good example: catch specific exception
2try:
3 result = int(value)
4except ValueError:
5 result = 0การจำกัดขอบเขตของ exception จะช่วยไม่ให้มองข้ามปัญหาที่ไม่ได้คาดคิด
จัดการ resource อย่างปลอดภัยด้วยคำสั่ง with
ต่อไป มาดูหัวข้อ 'การจัดการ resource อย่างปลอดภัยด้วย with statement'
resource เช่น ไฟล์หรือ lock ต้องถูกปล่อยเมื่อใช้งานเสร็จเสมอ
1# Bad example: manual close
2file = open("data.txt")
3content = file.read()
4file.close()ในโค้ดนี้ หากเกิด exception อาจไม่มีการเรียก close()
1# Good example: using context manager
2with open("data.txt") as file:
3 content = file.read()การใช้ with statement จะช่วยทำความสะอาดทรัพยากรได้อย่างปลอดภัยแม้เกิด exception
ใช้ list comprehension ให้เหมาะสม
ต่อไป มาดูหัวข้อ 'การใช้ list comprehension อย่างเหมาะสม'
กระบวนการแปลงข้อมูลที่ง่ายสามารถเขียนให้กระชับได้ด้วย list comprehension
1# Bad example: Verbose loop
2squares = []
3for i in range(10):
4 squares.append(i * i)ในโค้ดนี้ ขั้นตอนสำคัญของกระบวนการดูได้ยาก
1# Good example: Clear list comprehension
2squares = [i * i for i in range(10)]การใช้ list comprehension อย่างเหมาะสมจะช่วยให้โค้ดอ่านง่ายขึ้น
หลีกเลี่ยง magic number
ต่อไป มาดูหัวข้อ 'การหลีกเลี่ยง magic number'
การเขียนตัวเลขและสตริงลงไปตรง ๆ ทำให้ความหมายไม่ชัดเจน
1# Bad example: magic number
2if status == 404:
3 handle_not_found()ในโค้ดนี้ สมมติว่าคุณรู้ความหมายของ 404
1# Good example: named constant
2NOT_FOUND = 404
3
4if status == NOT_FOUND:
5 handle_not_found()การตั้งชื่อให้กับค่าเหล่านั้นจะช่วยให้เจตนาในการใช้งานชัดเจน
เขียนโค้ดที่ดูแลรักษาได้ ไม่ใช่แค่โค้ดที่ 'ใช้ได้เท่านั้น'
สุดท้าย มาดูหัวข้อ 'การเขียนโค้ดที่ดูแลรักษาได้ ไม่ใช่แค่โค้ดที่ใช้ได้'
สิ่งสำคัญคือคุณในอนาคตหรือผู้อื่นจะอ่านมันเข้าใจหรือไม่
1# Bad example: Hard to maintain
2def f(x):
3 return x * 1.08 + 100ในโค้ดนี้ ไม่สามารถเข้าใจข้อกำหนดจากตัวโค้ดได้
1# Good example: Easy to maintain
2TAX_RATE = 1.08
3BASE_FEE = 100
4
5def calculate_total(price: float) -> float:
6 return price * TAX_RATE + BASE_FEEเมื่อสะท้อนความหมายผ่านชื่อ โค้ดจะเป็นเสมือนข้อกำหนดไปเอง
สรุป
แนวทางที่ดีที่สุดของ Python คือ เขียนโค้ดให้เข้าใจง่าย ดีกว่าเขียนโค้ดให้ดูฉลาด การสร้างนิสัยเล็กๆ เหล่านี้จะช่วยให้โค้ดของคุณมีบั๊กน้อยลงและใช้งานได้ยาวนาน
คุณสามารถติดตามบทความข้างต้นโดยใช้ Visual Studio Code บนช่อง YouTube ของเรา กรุณาตรวจสอบช่อง YouTube ด้วย