Ranh giới giữa Helper và Util (Utility) thường khá mong manh, và tùy vào quy định của từng dự án mà chúng có thể được dùng thay thế cho nhau.
Tuy nhiên, nếu xét về mặt thiết kế phần mềm "chuẩn bài", mình có thể phân biệt dựa trên mục đích và ngữ cảnh sử dụng như sau:
| Đặc điểm | Utility (Util) | Helper |
|---|---|---|
| Tính phụ thuộc | Độc lập. Không phụ thuộc vào logic của ứng dụng. | Phụ thuộc. Thường gắn liền với một domain hoặc logic cụ thể của ứng dụng. |
| Phạm vi sử dụng | Toàn cục (Global). Có thể bê nguyên file sang dự án khác mà vẫn chạy tốt. | Cục bộ (Local). Thường chỉ dùng cho một vài module hoặc trang nhất định. |
| Mục đích | Thực hiện các tác vụ kỹ thuật, xử lý dữ liệu thô. | Hỗ trợ thực hiện một logic nghiệp vụ (business logic) phức tạp hoặc lặp lại. |
Hãy nghĩ về Utils như những "công cụ đa năng". Chúng giải quyết các bài toán lập trình chung chung mà ngôn ngữ chưa hỗ trợ sẵn hoặc hỗ trợ chưa tiện.
Những thứ thường đặt vào folder utils/:
- Xử lý Format: Format ngày tháng (Date formatter), format tiền tệ, viết hoa chữ cái đầu.
- Validation chung: Check email hợp lệ, check số điện thoại, check chuỗi rỗng.
- Thao tác dữ liệu: Clone object, so sánh 2 mảng, hàm băm (hashing), xử lý LocalStorage.
- Toán học: Tính toán các công thức chung, random số trong khoảng.
Ví dụ: Hàm formatDate(date, pattern) là một Utility. Dự án nào cũng cần, và nó không quan tâm bạn đang làm app bán hàng hay app quản lý nhân sự.
Helpers thường là những "trợ lý" đắc lực cho một module cụ thể. Nó hiểu về nghiệp vụ của ứng dụng và giúp code ở tầng Logic (Controller/Service) gọn gàng hơn.
Những thứ thường đặt vào folder helpers/:
- Logic nghiệp vụ: Tính toán giá vé dựa trên độ tuổi khách hàng (gắn với logic của app).
- Xử lý giao diện (UI Helper): Hàm chuyển đổi trạng thái đơn hàng sang màu sắc tương ứng (ví dụ:
PENDING-> màu vàng). - Xác thực/Phân quyền: Hàm check xem User hiện tại có quyền chỉnh sửa bài viết này không (
canUserEditPost). - Template Helper: Các hàm hỗ trợ render dữ liệu cụ thể lên màn hình.
Ví dụ: Hàm calculateMemberDiscount(user) là một Helper. Nó cần biết cấu trúc object user của dự án bạn và quy tắc giảm giá của công ty bạn.
Vì em đang làm QA Automation, mình có thể chia như sau để dễ hình dung:
utils/:db_client.js: Kết nối Database.api_logger.js: Ghi log API.random_data_gen.js: Tạo string ngẫu nhiên, số ngẫu nhiên.date_util.js: Lấy ngày hiện tại cộng thêm 7 ngày để làm test data.
helpers/:login_helper.js: Hàm thực hiện các bước login (điền user, pass, click login) để dùng lại ở nhiều test case.checkout_helper.js: Các bước chọn hàng, thêm vào giỏ, thanh toán.assertion_helper.js: Các hàm so sánh kết quả mong đợi đặc thù cho dự án của em.
Hãy tự hỏi: "Nếu mình mang file này sang một dự án hoàn toàn khác, nó có chạy được không?"
- Nếu Có -> Bỏ vào
utils. - Nếu Không (vì nó cần dữ liệu hoặc logic đặc thù của dự án hiện tại) -> Bỏ vào
helpers.