Quy tắc code
Đặt tên
| Loại | Convention | Ví dụ |
|---|---|---|
| Biến | lower_snake_case | user_name, order_id |
| Hàm | camelCase | getUserName(), createOrder() |
| Class, Interface, Enum, Type | PascalCase | OrderService, IConfig |
| Hằng số | UPPER_SNAKE_CASE | SECRET_KEY, MAX_RETRY |
- Không dùng
var, ưu tiênlet - Không dùng dấu
; - Ưu tiên
' 'thay cho" "
Chú thích
- Viết bằng tiếng Việt
- JSDoc
/** */trước biến, hàm, hằng số, class, interface, type //cho logic code- Chú thích từng field khi khai báo interface/type
Code style
- JS: 80 cột, HTML: 120 cột
- Không để for/if đẩy code sâu quá 40 cột — phá bớt ngoặc
- Logic trùng lặp phải tách hàm/component
{
"printWidth": 80,
"tabWidth": 2,
"singleQuote": true,
"semi": false,
"singleAttributePerLine": true,
"arrowParens": "avoid"
}
SOLID
Bắt buộc cho mọi service/business logic:
- S — Một class chỉ có 1 lý do để thay đổi
- O — Mở rộng được mà không sửa code cũ
- L — Class con thay thế class cha không phá vỡ chương trình
- I — Chia nhỏ interface
- D — Phụ thuộc vào abstraction, không phụ thuộc implementation
Class pattern
//#region ____ - ....
// -------------------------------------------------------
/** Cấu hình .... */
export interface IConfig____ {}
/** Bối cảnh đầu vào .... */
export interface IContext____ {}
/** Kết quả trả về .... */
export interface IResult____ {}
/** Contract cho service .... */
export interface I____ {
exec(context: IContext____): Promise<IResult____>
}
/** Cài đặt cụ thể .... */
export class ____ implements I____ {
constructor(
private readonly CONFIG: IConfig____ = {},
private readonly SERVICE_ABC: IAbc = new Abc(),
) {}
async exec({}: IContext____) {
return {}
}
}
// -------------------------------------------------------
//#endregion
Git
- CẤM commit/push lên
mainhoặcmaster - Luôn tạo branch riêng và tạo pull request
- Chạy
pnpm lintvàpnpm testtrước khi commit - Không commit
.env*(trừ.env.example)
Bảo mật
- Không hardcode API key, secret key, token trong source code
- Xác thực signature trước khi xử lý webhook/IPN
- Không trả về Secret Key, Access Key cho user không phải owner