ducdev
Python / Bài viết

Clean Code Trong Python — 5 Nguyên Tắc Làm Code Dễ Đọc Hơn

Code được đọc nhiều hơn được viết. 5 nguyên tắc clean code này giúp bạn viết Python mà đồng nghiệp (và bạn tương lai) sẽ cảm ơn.

a
admin
03/04/2026 · 3 phút đọc · 0 lượt xem
Chia sẻ

"Code is read more often than it is written" — câu nói của Guido van Rossum, cha đẻ Python, là lời nhắc nhở quan trọng nhất cho mọi developer. Viết code chạy được là mức tối thiểu; viết code người khác hiểu được mới là kỹ năng thực sự.

1. Đặt Tên Là Nghệ Thuật

Tên tốt loại bỏ nhu cầu comment giải thích:

# Xấu — tên không có ý nghĩa
def calc(x, y, z):
    return x * y * (1 - z)

# Tốt — tên tự giải thích
def tinh_gia_sau_giam(gia_goc, so_luong, ty_le_giam):
    return gia_goc * so_luong * (1 - ty_le_giam)

# Xấu — boolean không rõ ý nghĩa
if user.status == 1:
    pass

# Tốt — dùng constant hoặc property
if user.is_active:
    pass

Một số quy tắc đặt tên trong Python:

  • Hàm và biến: snake_case
  • Class: PascalCase
  • Constant: UPPER_SNAKE_CASE
  • Tránh viết tắt trừ khi cực kỳ phổ biến (url, id, html)

2. Hàm Nhỏ — Một Việc Duy Nhất

Single Responsibility Principle áp dụng cho từng hàm:

# Xấu — hàm làm quá nhiều thứ
def xu_ly_don_hang(don_hang):
    # Validate
    if not don_hang.san_pham:
        raise ValueError("Giỏ hàng trống")
    # Tính giá
    tong = sum(sp.gia * sp.so_luong for sp in don_hang.san_pham)
    # Gửi email
    gui_email(don_hang.email, f"Đơn hàng {tong}đ")
    # Lưu DB
    don_hang.save()

# Tốt — tách thành các hàm nhỏ
def validate_don_hang(don_hang):
    if not don_hang.san_pham:
        raise ValueError("Giỏ hàng trống")

def tinh_tong_don_hang(don_hang):
    return sum(sp.gia * sp.so_luong for sp in don_hang.san_pham)

def xu_ly_don_hang(don_hang):
    validate_don_hang(don_hang)
    tong = tinh_tong_don_hang(don_hang)
    gui_email(don_hang.email, f"Đơn hàng {tong}đ")
    don_hang.save()

3. Comment Chỉ Khi WHY Không Rõ

# Xấu — comment giải thích WHAT (code đã nói điều đó)
# Lấy danh sách users active
active_users = User.objects.filter(is_active=True)

# Tốt — comment giải thích WHY
# Dùng select_for_update để tránh race condition khi update balance
with transaction.atomic():
    account = Account.objects.select_for_update().get(id=account_id)

# Tốt — giải thích business logic không rõ ràng từ code
# Theo quy định thuế TNCN, thu nhập dưới 11 triệu được miễn thuế
MIEN_THUE_TNCN = 11_000_000

4. Exception Handling Đúng Cách

# Xấu — catch tất cả exception
try:
    result = xu_ly_data(data)
except Exception:
    pass  # Im lặng nuốt lỗi — nguy hiểm!

# Xấu — catch quá rộng
try:
    result = xu_ly_data(data)
except Exception as e:
    log(e)  # Vẫn quá rộng

# Tốt — catch exception cụ thể
try:
    result = xu_ly_data(data)
except ValueError as e:
    log.warning(f"Dữ liệu không hợp lệ: {e}")
    raise
except ConnectionError:
    log.error("Không thể kết nối database")
    raise ServiceUnavailableError()

5. Pythonic Patterns — Tận Dụng Đặc Tính Python

# List comprehension thay vì vòng lặp
# Xấu
titles = []
for post in posts:
    if post.is_published:
        titles.append(post.title)

# Tốt
titles = [post.title for post in posts if post.is_published]

# Dùng enumerate thay vì range(len())
for i, post in enumerate(posts):
    print(f"{i + 1}. {post.title}")

# Dùng zip để ghép lists
for user, score in zip(users, scores):
    print(f"{user.name}: {score}")

# Context manager cho resource management
with open('file.txt') as f:
    content = f.read()
Code tốt không cần nhiều comment vì nó tự giải thích. Khi bạn cảm thấy cần viết comment để giải thích code, hãy xem xét việc refactor code trước.

Kết Luận

Clean code không phải là viết ít code hơn hay viết code "thông minh" hơn — mà là viết code dễ đọc và dễ thay đổi. Bắt đầu với việc đặt tên tốt và viết hàm nhỏ. Những thói quen này sẽ tạo ra sự khác biệt lớn theo thời gian.

#Python #Clean code #Best practices #Refactoring
a
Tác giả
admin

Lập trình viên, yêu thích chia sẻ kiến thức về công nghệ và phát triển phần mềm.

Bình luận

Chưa có bình luận. Hãy là người đầu tiên!

Để lại bình luận

Bình luận sẽ được duyệt trước khi hiển thị.