Chuyển tới nội dung chính

Quy tắc code

Đặt tên

LoạiConventionVí dụ
Biếnlower_snake_caseuser_name, order_id
HàmcamelCasegetUserName(), createOrder()
Class, Interface, Enum, TypePascalCaseOrderService, IConfig
Hằng sốUPPER_SNAKE_CASESECRET_KEY, MAX_RETRY
  • Không dùng var, ưu tiên let
  • 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 main hoặc master
  • Luôn tạo branch riêng và tạo pull request
  • Chạy pnpm lintpnpm test trướ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