"Bẫy ngầm" trong Code: Sức mạnh hủy diệt của Kỹ thuật sử dụng hằng số (Constants)
Chào anh em!
Trong quá trình review code của các bạn junior, có một lỗi sai kinh điển mà mình gặp phải hàng tuần, thậm chí hàng tháng trời vẫn không hết. Đó là tội danh: "Dùng Magic Number và Magic String".
Nó trông như thế này đây:
// Đoạn code khiến ông Tech Lead tăng xông
if ($user->status === 1) {
// Kích hoạt tài khoản
} elseif ($user->status === 2) {
// Khóa tài khoản vĩnh viễn
}
Nhìn vào số 1 hay số 2 đó, đố ai trên đời này biết được nó nghĩa là gì nếu không mở Database hoặc mò vào tài liệu thiết kế. Để cứu rỗi những đoạn code "tối nghĩa" này, kỹ thuật sử dụng Hằng số (Constants) ra đời như một vị cứu tinh. Hôm nay, hãy cùng mổ xẻ xem kỹ thuật này quyền năng đến mức nào nhé!
1. Hằng số (Constants) thực chất là gì?
Hiểu một cách đơn giản nhất, Hằng số (Constants) là một định danh (tên gọi) dùng để lưu trữ một giá trị cố định không bao giờ thay đổi trong suốt vòng đời thực thi của chương trình.
Khác với Biến (Variables) - nơi bạn có thể thoải mái gán lại giá trị mới ở dòng 10 rồi đổi sang giá trị khác ở dòng 100, Hằng số một khi đã được khai báo và gán giá trị, nó sẽ đóng đinh như thế. Cố tình thay đổi nó, chương trình sẽ lập tức văng lỗi.
Ví dụ kinh điển:
// Thay vì viết số 3.14159 khắp nơi trong chương trình tính toán hình học
const PI = 3.14159;
// Thay vì viết số cứng ngắc
const STATUS_ACTIVE = 1;
const STATUS_BANNED = 2;
2. Tiêu diệt "Magic Number" và "Magic String"
Lý do lớn nhất khiến lập trình viên phải quỳ gối trước hằng số chính là để quét sạch các con số ma quỷ (Magic Numbers) và chuỗi ma quỷ (Magic Strings) ra khỏi source code.
Hãy nhìn lại ví dụ xử lý trạng thái user ở đầu bài, sau khi được "tút tát" lại bằng hằng số trong Class hoặc Config:
class User {
const STATUS_ACTIVE = 1;
const STATUS_BANNED = 2;
}
// Lúc sử dụng:
if ($user->status === User::STATUS_ACTIVE) {
// Đọc vào là hiểu ngay lập tức mà không cần chú thích (comment)
}
Lợi ích đem lại cực kỳ khủng khiếp:
- Tăng tính tự diễn giải (Self-documenting): Code tự nói lên ý nghĩa của nó. Người đọc không cần phải đoán già đoán non số 1 là hoạt động hay đang chờ duyệt.
- Chống gõ sai chính tả (Typo protection): Giả sử bạn dùng chuỗi
'active'rải rác ở 50 file khác nhau. Một đẹp trời, bạn sửa thành'activated'ở file A nhưng quên sửa ở file B, hệ thống toang ngay lập tức. Nhưng nếu dùng hằng sốUser::STATUS_ACTIVE, nếu bạn gõ sai tên hằng số, IDE (như VS Code, PhpStorm) sẽ báo lỗi đỏ lòm ngay từ bước gõ code. - Dễ dàng thay đổi (Single Source of Truth): Nếu ngày đẹp trời sếp yêu cầu đổi mã trạng thái từ số 1 sang chuỗi
'ACT', bạn chỉ cần sửa đúng 1 dòng duy nhất ở nơi định nghĩa hằng số, toàn bộ dự án sẽ tự động cập nhật theo mà không phải đi mò mẫm sửa từng file.
3. Kỹ thuật nâng cao: Enum hay Class Constants?
Trong các ngôn ngữ lập trình hiện đại như PHP (từ bản 8.1+), TypeScript, C#, hay Java, kỹ thuật sử dụng hằng số đã tiến hóa lên một tầm cao mới: Enum (Enumerations).
Thay vì gom một đống hằng số vào một Class chung chung trông khá lỏng lẻo:
class Role {
const ADMIN = 'admin';
const EDITOR = 'editor';
const VIEWER = 'viewer';
}
Chúng ta sử dụng Enum để giới hạn chặt chẽ kiểu dữ liệu, ép buộc biến chỉ được phép nhận các giá trị nằm trong tập hợp đó:
enum UserRole: string {
case Admin = 'admin';
case Editor = 'editor';
case Viewer = 'viewer';
}
Việc sử dụng Enum giúp bảo vệ hệ thống tuyệt đối ở tầng kiểu dữ liệu (Type Safety), ngăn chặn hoàn toàn việc ai đó lỡ tay truyền một chuỗi linh tinh vào hàm xử lý phân quyền.
Lời kết
Kỹ thuật sử dụng hằng số là bài học vỡ lòng của bất kỳ lập trình viên nào muốn bước từ ngưỡng "biết code" sang "viết code chuyên nghiệp". Nó biến những con số vô hồn trở thành ngôn ngữ giao tiếp rõ ràng giữa người với người và giữa người với máy.
Lần tới, khi thấy ngón tay chuẩn bị gõ một con số hoặc một chuỗi cụ thể trực tiếp vào câu lệnh điều kiện if, hãy khựng lại một nhịp và tự hỏi: "Cái này có nên đưa ra thành một Hằng số hay không?". Chắc chắn source code của bạn sẽ sạch sẽ và đẳng cấp lên rất nhiều!
All rights reserved