"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.
Chưa có bình luận. Hãy là người đầu tiên!