Explore all courses in this category.
Explore all courses in this category.
Nguyễn Đình Cường
0 comment
09 Nov, 2026
Bạn đã từng đọc một hàm mà dòng code trôi dần sang phải vì các tầng if lồng vào nhau? Đó là "mũi tên code" khó đọc và khó bảo trì. Guard clause (điều kiện bảo vệ, hay còn gọi là early return) là kỹ thuật đơn giản giúp đưa code về đường thẳng dễ đọc.
Hãy xem hàm đăng ký người dùng dưới đây:
function registerUser(user) {if (user) {if (user.email) {if (isValidEmail(user.email)) {if (!emailExists(user.email)) {saveUser(user);return { ok: true };} else {return { ok: false, error: 'Email đã tồn tại' };}} else {return { ok: false, error: 'Email không hợp lệ' };}} else {return { ok: false, error: 'Thiếu email' };}} else {return { ok: false, error: 'Thiếu dữ liệu' };}}Để biết điều gì xảy ra khi email không hợp lệ, bạn phải lần theo bốn tầng thụt lề và ghép từng else với if của nó. Phần xử lý chính (saveUser) bị chôn sâu bên trong.
Ý tưởng là kiểm tra các điều kiện không hợp lệ ở đầu hàm và thoát ngay (return, throw, continue). Phần còn lại của hàm chỉ chạy khi mọi điều kiện đã thỏa:
function registerUser(user) {if (!user) return { ok: false, error: 'Thiếu dữ liệu' };if (!user.email) return { ok: false, error: 'Thiếu email' };if (!isValidEmail(user.email)) return { ok: false, error: 'Email không hợp lệ' };if (emailExists(user.email)) return { ok: false, error: 'Email đã tồn tại' };saveUser(user);return { ok: true };}Cùng một logic, nhưng phẳng, mỗi dòng ở đầu hàm nói rõ một điều kiện loại trừ, và đường đi "bình thường" (happy path) nằm gọn ở cuối.
Trong vòng lặp, continue đóng vai trò tương tự:
// Trướcfor (const order of orders) {if (order.isPaid) {if (!order.isShipped) {ship(order);}}}// Saufor (const order of orders) {if (!order.isPaid) continue;if (order.isShipped) continue;ship(order);}Khi điều kiện phức tạp, hãy tách thành hàm có tên:
function canShip(order) {return order.isPaid && !order.isShipped;}for (const order of orders) {if (!canShip(order)) continue;ship(order);}Trong Python, bạn làm tương tự:
def withdraw(account, amount):if amount <= 0:raise ValueError("Số tiền phải lớn hơn 0")if amount > account.balance:raise ValueError("Số dư không đủ")account.balance -= amountreturn account.balanceTrong PHP, Java, C#, Go ý tưởng cũng giống hệt: kiểm tra điều kiện sai trước, thoát sớm, phần chính để cuối.
else chứa trường hợp lỗi hoặc ngắn gọn.Guard clause là một trong những thủ thuật nhỏ nhưng hiệu quả nhất để làm code phẳng và dễ đọc. Lần tới khi thấy mình viết tầng if thứ ba, hãy dừng lại và thử đảo điều kiện, thoát sớm.
Muốn rèn tay viết code sạch qua bài tập, hãy xem thêm các khóa học trên codebem.com.
Nguyễn Đình Cường
0 comment