แนวทางปฏิบัติที่ดีที่สุดใน Python

แนวทางปฏิบัติที่ดีที่สุดใน 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 ด้วย

YouTube Video