8 CÁCH VIẾT CODE JAVASCRIPT ĐẸP

Ngày đăng: 27/10/2020   -    Cập nhật: 07/11/2020
Code của chúng ta phải sạch và dễ đọc nhất có thể. Viết Code JavaScript cũng vậy.


Nhưng để viết code JavaScript đẹp đó thực sự là nghệ thuật.


Bởi vì chúng ta phải vừa cố gắng viết logic chính xác vừa phải cố gắng biến những thứ phức tạp (mà máy hiểu) thành thứ mà con người có thể hiểu được.


Với nhiệm vụ khó khăn này, cách viết code JavaScript đẹp mà mình sẽ giới thiệu ở dưới đây sẽ giúp bạn tiếp tục đi đúng hướng.



CÁCH VIẾT CODE JAVASCRIPT ĐẸP


1. CÚ PHÁP JAVASCRIPT ĐẸP



Để viết code JavaScript đẹp thì liên quan đến khá nhiều thứ ... nhưng ở bài này, chúng ta sẽ bắt đầu với những thứ cơ bản trước đó là cú pháp JS.


Viết cú pháp đẹp là bạn đã hoàn thành phần lớn mục tiêu rồi.


> Lưu ý: Đây chỉ là phong cách cá nhân của mình. Không phải quy tắc của JS.



1.1. Ngoặc nhọn



Trong hầu hết các dự án JavaScript, cặp dấu ngoặc nhọn { } được viết theo kiểu “Ai Cập” với dấu ngoặc nhọn mở { trên cùng dòng với từ khóa tương ứng - không phải trên dòng mới.


Cũng phải có một khoảng trắng trước dấu ngoặc mở {, như sau:




// Cách đặt cặp ngoặc nhọn
if (dieuKien) {
    // Code ở đây
    // Ở đây nữa
}
 


Có nhiều người thích đặt cặp ngoặc nhọn như thế này:



if (dieuKien)
{
    // Code ở đây
    // Ở đây nữa
}
 


Nhưng mình thật sự không thích nó bởi mình không thấy sự liên kết giữa từ khóa và phần thân của nó.


Khi bạn sử dụng các extension (plugin) để định dạng code thì hầu hết nó sẽ định dạng như cách đầu tiên.


Đó là cách viết code nếu phần thân dài ( trên nhiều dòng ).


Còn một câu lệnh if trên một dòng thì sao?


Chẳng hạn như:




if (dieuKienlamGiDo()
 


Trong trường hợp này, có nên đặt chúng trong ngoặc nhọn { } không?


Để chọn ra giải pháp tốt nhất. Hãy xem các ví dụ dưới đây và mình nghĩ bạn có thể tự đánh giá được khả năng đọc của chúng:


Cách #1: Những người mới học lập trình JavaScript thường làm như thế này




if (n < 0) { alert(`Điểm dễ đọc là: ${n}`); }
 


Xấu, khó đọc.


Cách #2: Tách ra một dòng riêng mà không cần dấu ngoặc nhọn.



if (n < 0)
    alert(`Điểm dễ đọc là: ${n}`);
 


Đừng bao giờ làm như trên, nó dễ gây ra lỗi khi chúng ta thêm dòng mới.


Cách #3: Viết trên một dòng, không có ngoặc nhọn.




if (n < 0alert(`Điểm dễ đọc là: ${n}`);
 


Có thể chấp nhận được nếu nó ngắn.


Cách #4: Cách làm phổ biến nhất




if (n < 0) {
    alert(`Điểm dễ đọc là: ${n}`);
}
 


Bạn thấy thế nào?


Dễ quan sát hơn chứ?


Đối với cách làm này, nếu bạn muốn đọc hiểu, thêm code, chỉnh sửa đều dễ dàng.


Túm cái váy, đối với một câu lệnh rất ngắn gọn, một dòng không ngoặc nhọn thì ổn, ví dụ:




if (dieuKienreturn null;
 


Nhưng sử dụng một khối (block code) (Cách #4) thường dễ đọc hơn.


1.2. Độ dài của một dòng



Không ai thích đọc một dòng một dòng dài cả. Code cũng thế.


Cách tốt nhất là chia chúng ra.




let str = `
    Nếu bạn muốn viết chuỗi trên nhiều dòng
    trong khi code thì có thể sử dụng
    dấu backtick
`;
 


Trong câu điều kiện kết hợp cũng rất hay gặp trường hợp quá dài.


Thay thì viết như thế này:




if (id === 123 && name === 'niithanoi' && password === 'hoclaptrinh') {
    // Code khi điều kiện đúng
    lamGiDo();
}
 


Hãy tách các điều kiện thành dòng riêng biệt:



if (
    id === 123 &&
    name === "niithanoi" &&
    password === "hoclaptrinh"
) {
    // Code khi điều kiện đúng
    lamGiDo();
}
 


Độ dài dòng tối đa nên được quy định chung ở trong một nhóm. Nó thường là 80 hoặc 120 ký tự.


Nói chung ngắn sẽ ổn hơn là dài.



1.3. Thụt lề



Thụt lề ngang được thực hiện bằng cách sử dụng 2 hoặc 4 dấu cách (phím Space) hoặc ký hiệu tab ngang (phím Tab).


Chọn sử dụng cái nào tốt hơn là một cuộc tranh cãi lớn.


Nó giống như kiểu so sánh Dynamic và Static vậy.


Nhưng Space khá là phổ biến (sử dụng 2 hoặc 4 cách)


Một lợi thế của dấu cách so với Tab là dấu cách cho phép cấu hình thụt lề linh hoạt hơn, tự do hơn.


Lưu ý:



TỰ DO CHỈ DÀNH CHO NHỮNG NGƯỜI KỶ LUẬT CAO!


Còn nếu bạn không có tính kỷ luật cao, không tự đặt ra một quy tắc sử dụng Space thống nhất, xuyên suốt cho mình thì mình khuyên bạn nên sử dụng Tab.


Ví dụ, Chúng ta có thể căn chỉnh các đối số bằng dấu ngoặc mở, như sau:




show(thamSo0,
     thamSo1// 5 spaces ở bên trái
     thamSo2,
     thamSo3,
     thamSoCuoi
) {
    // ...
}
 


Nếu bạn sử dụng Tab, các IDE hoặc Editor sẽ tự động điều chỉnh khoảng cách.


Ví dụ, thay vì 5 lần cách, bạn chỉ cần 1 Tab như thế này:




show(thamSo0,
    thamSo1// 1 Tab ở bên trái
    thamSo2,
    thamSo3,
    thamSoCuoi
) {
    // ...
}
 


Nhanh hơn, đơn giản hơn phải không?


Nếu bạn sử dụng VSCode hoặc Extension định dạng code thì mặc định nó sẽ sử dụng Tab (Chỉ cần Ctrl + S là nó sẽ định dạng code giúp bạn như trên)


Cá nhân mình thì thích sử dụng Tab, và trong trường hợp này, mình sẽ xuống dòng tham số như sau:




show(
    thamSo0,
    thamSo1// 1 Tab ở bên trái
    thamSo2,
    thamSo3,
    thamSoCuoi
) {
    // ...
}
 


1.4. Xuống dòng để tách logic code



Ngay cả một hàm đơn lẻ thường có thể được chia thành các khối logic để dễ đọc hơn, dễ liên kết và tách ý nghĩa của chúng ra.


Trong ví dụ dưới đây, việc khởi tạo biến, vòng lặp chính và return được tách nhau ra:




// Tính x^n
function pow(xn) {
    let ketQua = 1;
    //              <-- Xuống dòng để tách logic
    for (let i = 0i < ni++) {
        ketQua *= x;
    }
    //              <-- Xuống dòng để tách logic
    return ketQua;
}
 


Chèn thêm một dòng mới để giúp code JS của bạn dễ đọc hơn.


Và không được viết hơn 9 dòng code mà chẳng xuống dòng trống.



1.5. Dấu chấm phảy



Ngôn ngữ JavaScript là một ngôn ngữ kiểu Dynamic. Nó có thể bỏ qua dấu chấm phảy ; (JavaScript Engine tự nội suy)


Nhưng dấu chấm phẩy là nên có sau mỗi câu lệnh, ngay cả khi nó có thể bị bỏ qua.


Với lại, trong JavaScript, có những trường hợp ngắt dòng không được hiểu là kết thúc câu lệnh, điều này khiến code dễ bị lỗi.


Ví dụ:




alert("Tất cả đều ổn");

[12].forEach(alert)
 


Nhưng khi không có dấu chấm phảy như thế này:



alert("Thế này sẽ bị lỗi")

[12].forEach(alert)
 


Chúng ta có thể nghĩ nó ổn.


Nhưng thực sự JavaScript Engine thấy như thế này:




alert("Thế này sẽ bị lỗi")[12].forEach(alert)
 


Dĩ nhiên là trường hợp này sẽ bị lỗi ở đoạn sau.


Nếu bạn là một lập trình viên JavaScript có kinh nghiệm, bạn có thể chọn kiểu viết code mà không sử dụng dấu chấm phẩy như StandardJS.


Nhưng nếu không, tốt nhất bạn nên sử dụng dấu chấm phẩy để tránh những lỗi có thể xảy ra.


Đặc biệt là khi làm việc trong một team mà trình độ của mỗi người không giống nhau, thi thoảng lại có mem mới tò te.


Phần lớn các lập trình viên có kinh nghiệm đều đặt dấu chấm phẩy để đảm bảo code được hiểu đúng.


> Ghi chú: Thiếu dấu chấm phảy ; là không được chấp nhận trong Java. Khác với JavaScript, Java rất chặt chẽ về cú pháp. Đó cũng là một lý do khiến nó có hiệu suất cao hơn JavaScript




> Nếu bạn yêu thích những thứ chặt chẽ. Hãy HỌC JAVA (Full Stack) ngay!


1.6. Code lồng code



Có thể bạn đã biết, code lồng nhau càng sâu thì càng khiến hiệu suất kém đi.


Vì thế, các lập trình viên có kinh nghiệm thường cố gắng tránh lồng mã quá nhiều cấp độ sâu.


Ví dụ: Trong vòng lặp, đôi khi bạn nên sử dụng lệnh từ khóa continue để tránh lồng thêm.


Thay vì thêm một if lồng nhau có điều kiện như thế này:




for (let i = 0i < 10i++) {
    if (dieuKien) {
        ... // <- Thêm một cấp lồng
    }
}
 


Bạn có thể viết như thế này:



for (let i = 0i < 10i++) {
    if (!dieuKiencontinue;
    ... // <- Không bị lồng thêm
}
 


Điều tương tự có thể được thực hiện với if / elsereturn.


Ví dụ, hai cấu trúc dưới đây giống hệt nhau.


Cách 1:




function pow(xn) {
    if (n < 0) {
        alert("Không chơi số ÂM");
    } else {
        let ketQua = 1;

        for (let i = 0i < ni++) {
            ketQua *= x;
        }

        return ketQua;
    }
}
 


Cách 2:



function pow(xn) {
    if (n < 0) {
        alert("Không chơi số ÂM");
        return;
    }

    let ketQua = 1;

    for (let i = 0i < ni++) {
        ketQua *= x;
    }

    return ketQua;
}
 


Cái thứ hai dễ đọc hơn vì "trường hợp đặc biệt" của n bằng 0 sẽ được xử lý sớm.


Sau khi kiểm tra xong, chúng ta có thể chuyển sang các dòng code chính mà không cần phải lồng thêm nhiều lần.



1.7. Vị trí đặt khai báo hàm



Nếu bạn đang viết một số hàm “trợ giúp” và code sử dụng chúng, có ba cách để tổ chức các hàm.


Cách 1: Khai báo các hàm ở phía trên và sau đó sử dụng




// Khai báo các hàm
function taoPhanTu() {
    ...
}

function thietLapPhanThu(elem) {
    ...
}

function lamGiDo() {
    ...
}

// Code sử dụng chúng
let elem = taoPhanTu();
thietLapPhanThu(elem);
lamGiDo();
 


Cách 2: Sử dụng chúng trước và sau đó khai báo chúng



// Code sử dụng chúng trước
let elem = taoPhanTu();
thietLapPhanThu(elem);
lamGiDo();


// Sau đó hai báo các hàm
function taoPhanTu() {
    ...
}

function thietLapPhanThu(elem) {
    ...
}

function lamGiDo() {
    ...
}
 


Nếu như bạn đã biết hoisting trong JavaScript thì khi chạy chương trình, JavaScript Engine sẽ kéo các khai báo lên trên đầu trước khi thực sự thực hiện điều gì đó.


Và cách làm trên hoạt động như bình thường.


Cách 3: Một hàm được khai báo ở nơi nó được sử dụng lần đầu tiên.


Hầu hết, cách thứ 2 được sử dụng phổ biến hơn.


Bởi vì khi đọc code, trước tiên chúng ta sẽ muốn biết chúng cái gì đang làm việc.


Sau đó nếu chúng ta muốn biết hàm này hoạt động như thế nào thì chúng ta sẽ tìm đến chỗ khai báo nó.


Hoặc nếu tên hàm đã mô tả được ý nghĩa của nó thì có lẽ chúng ta chẳng cần xem khai báo chúng làm gì cả (nếu nó chạy được).



1.8. Khai báo, định nghĩa



Đừng khai báo biến như thế này:



let a="ABC";
 



Thay vào đó, hãy làm thế này:


 


let a = "ABC";
 



Đừng khai báo mảng thế này:

 


let arr = [1,2,3,4,5];
 



Hãy làm như thế này:

 


let arr = [12345];
 



Các dấu cách sau mỗi phần tử (sẽ được bỏ qua bởi JavaScript Engine) giúp bạn đọc mảng dễ hơn.


Và cũng đừng khai báo vòng lặp như thế này:


 


for(let i=1i<10i++) {
    // Làm cái gì đó
}
 



Thay vào đó, hãy làm thế này:

 


for (let i = 1i < 10i++) {
    // Làm cái gì đó
}
 



Đừng khai báo đối tượng như thế này:

 


let sinhVien = {ten:"Nguyen Van A",tuoi:19,mssv:"NIIT3369"};
 



Thay vào đó, hãy làm như thế này:

 


let sinhVien = {
    ten: "Nguyen Van A",
    tuoi: 19,
    mssv: "NIIT3369"
}
 


 

2. CÓ CÁC HƯỚNG DẪN CÁCH VIẾT CODE JS CỤ THỂ NÀO KHÁC KHÔNG?



Có!


Có nhiều hướng dẫn về quy tắc viết code JavaScript, ví dụ: Sử dụng dấu ngoặc kép nào, bao nhiêu dấu cách để thụt lề, độ dài dòng tối đa, v.v.


Rất nhiều thứ nhỏ nhặt.


Khi tất cả các thành viên trong nhóm sử dụng cùng một kiểu lập trình, code sẽ trông đồng nhất, cho dù là thành viên nào trong nhóm đã viết nó.


Tất nhiên, một bạn hoặc nhóm của bạn có thể tự viết cách viết code JS phong cách của riêng họ, nhưng thường thì không cần thiết.


Bởi vì đã có rất nhiều hướng dẫn (hoàn chỉnh) hiện có để lựa chọn.


Một số lựa chọn phổ biến:


 



Nếu bạn là một người mới bắt đầu, thì đừng quên HỌC JAVASCRIPT cho vững nhé.


Sau đó, bạn có thể xem qua các hướng dẫn viết code JS khác (đã giới thiệu ở trên) để chọn cái bạn thích nhất.


 

3. TỰ ĐỘNG ĐỊNH DẠNG CODE JS



Có các công cụ có thể tự động kiểm tra kiểu mã của bạn và đưa ra các đề xuất cải tiến.


Điều tuyệt vời về chúng là kiểm tra kiểu cũng có thể tìm thấy một số lỗi, như lỗi chính tả trong tên biến hoặc hàm.


Do tính năng này, nên sử dụng chúng ngay cả khi bạn không muốn dính vào một “kiểu viết code” cụ thể.


Dưới đây là một số công cụ nổi tiếng:


 

  • JSLint - một trong những công cụ đầu tiên.
  • JSHint - nhiều cài đặt hơn JSLint.
  • ESLint - có lẽ là công cụ theo tiêu chuẩn (ES) mới nhất



Tất cả chúng đều có thể làm được việc.


Mình thì sử dụng ESLint.


Hầu hết các công cụ đều được tích hợp với các Editor hay IDE phổ biến.


Do đó, bạn chỉ cần mở phần cài đặt Extension / Plugin lên và tìm kiếm "ESlint" rồi sau đó cài đặt.


Ví dụ, đối với ESLint, bạn nên làm như sau:


 

  • Cài đặt Node.js.
  • Cài đặt ESLint bằng lệnh npm install -g eslint (npm là một trình cài đặt package của JavaScript).
  • Tạo một tệp cấu hình có tên .eslintrc trong thư mục gốc của dự án JavaScript của bạn (trong thư mục chứa tất cả các tệp của bạn).
  • Cài đặt / bật plugin cho Editor của bạn tích hợp với ESLint.



Dưới đây là ví dụ về tệp .eslintrc:

 


{
    "extends""eslint:recommended",
    "env": {
        "browser": true,
        "node": true,
        "es6": true
    },
    "rules": {
        "no-console": 0,
        "indent": ["warning"2]
    }
}
 



Ở đây, chỉ thị extends biểu thị rằng cấu hình dựa trên bộ cài đặt eslint:recommended. Sau đó, chúng ta có thể cài đặt thêm.


Bạn cũng có thể tải xuống các bộ quy tắc từ web và thay vì extend nó. Xem https://eslint.org/docs/user-guide/getting-started để biết thêm chi tiết về cách cài đặt.


Ngoài ra, một số trình soạn thảo như VSCode hỗ trợ rất tốt định dạng code.


Bạn có thể cài đặt ESlint trên VS Code như sau:


 

  • Extensions (Hoặc Ctrl + Shift + X)
  • Gõ tìm kiếm "ESLint"
  • Nhẫn "Install"
  • Đi đến Manager > Extension Setting nếu bạn biết cài đặt (Còn không thì để mặc định)


TỔNG KẾT VỀ CÁCH VIẾT CODE JS ĐẸP



Tất cả các quy tắc viết code JavaScript đẹp được chia sẻ trong bài viết này (và trong hướng dẫn kiểu được tham chiếu) nhằm mục đích tăng khả năng đọc mã của bạn.


Tuy nhiên, nó không phải là hoàn hảo.


Khả năng đọc tốt hơn như thế nào vẫn còn là điều tranh cãi.


Nhưng chỉ cần khi bạn nghĩ về việc làm sao để viết code JS tốt hơn, câu hỏi chúng ta nên tự hỏi là:



"ĐIỀU GÌ LÀM CHO CODE DỄ ĐỌC VÀ DỄ HIỂU HƠN?"





"ĐIỀU GÌ CÓ THỂ GIÚP TRÁNH SAI SÓT?"


Và nếu bạn cho rằng phương án của bạn giải quyết được 2 câu hỏi trên thì cách viết code JS của bạn là Đẹp.


Ít nhất nó tốt đối với bạn.


2 câu hỏi này cũng chính là 2 câu hỏi cần trả lời khi tranh luận về cách viết code nào đẹp hơn.


Và cuối cùng, hãy thường xuyên đọc các hướng dẫn các viết code phổ biến sẽ giúp bạn cập nhật những ý tưởng mới nhất về xu hướng code và các cách viết code JS đẹp nhất.


Làm một bài tập đơn giản nhé, hãy vận dụng các cách viết code JavaScript đẹp ở trên để viết lại đoạn code này theo cách tốt hơn:




function pow(x,n)
{
  let ketQua=1;
  for(let i=0;i<n;i++) {ketQua*=x;}
  return ketQua;
}

let x=prompt("x?",''), n=prompt("n?",'')
if (n<=0)
{
  alert(`Số ${n} không chơi bạn ơi. Làm ơn điền lại một số nguyên dương bạn nhé!`);
}
else
{
  alert(pow(x,n))
}
 


Chúc bạn học JS tốt.


Đọc thêm:

> Cách đặt tên trong JavaScript

> Cách đặt tên trong Java



---
HỌC VIỆN ĐÀO TẠO CNTT NIIT - ICT HÀ NỘI
Học Lập trình chất lượng cao (Since 2002). Học làm Lập trình viên. Hành động ngay!
Đc: Tầng 3, 25T2, N05, Nguyễn Thị Thập, Cầu Giấy, Hà Nội
SĐT: 02435574074 - 0914939543
Email: hello@niithanoi.edu.vn
Fanpage: https://facebook.com/NIIT.ICT/
 
#niit #niithanoi #niiticthanoi #hoclaptrinh #khoahoclaptrinh #hoclaptrinhjava #hoclaptrinhphp #java #php #python
Bình luận Facebook
Khóa học liên quan đến bài viết

Khóa học PHP Full stack [2023] cho người mới bắt đầu

96 giờ
Khóa học Lập trình PHP Full stack, phiên bản cập nhật lần thứ 8. Dạy Lập trình PHP bài bản từ Front end đến Back end + Laravel. Hướng dẫn làm 2 Dự Án Web lớn

KHÓA HỌC PYTHON HƯỚNG ĐỐI TƯỢNG

50 giờ
Khóa học giúp học viên sử dụng thành thạo ngôn ngữ Lập trình Python (3x). Hiểu và phát triển được Ứng dụng Web với Django Framework. Học thực hành với Giảng viên cao cấp.

Lập trình PHP với Laravel Framework

42 giờ
Khóa học Lập trình PHP với Laravel Framework được NIIT - ICT HÀ NỘI xây dựng nhằm hoàn thiện kỹ năng lập trình web các các bạn đã biết Lập trình Web PHP thuần.

Khóa học Java Full stack (IJFD)

104 giờ
Học lập trình Java Fullstack với khóa học được xây dựng theo lộ trình bài bản, từ JAVA CƠ BẢN đến JAVA WEB và nâng cao về JAVA FRAMEWORK như: Spring Boot, Hibernate
Mục lục
Đăng ký tư vấn
Nhân viên gọi điện tư vấn miễn phí sau khi đăng ký
Được cập nhật các ưu đãi sớm nhất
Hotline: 0383180086
Tên không được để trống
Số điện thoại không được để trống
Email không được để trống
Hãy đăng ký để nhận những thông tin mới nhất về học bổng mới nhất tại NIIT - ICT Hà Nội
top
Đóng lại Đăng ký học tại NIIT - ICT Hà Nội
6260+ học viên đã theo học tại NIIT - ICT Hà Nội và có việc làm tốt trong ngành lập trình. Nắm lấy cơ hội ngay hôm nay!
Chọn khóa học
  • KHÓA HỌC LẬP TRÌNH FRONT END VỚI REACT.JS
  • KHÓA HỌC LẬP TRÌNH PHP WEB
  • Khóa học PHP Full stack [2023] cho người mới bắt đầu
  • Khóa học BIG DATA với Hadoop và Spark
  • Khóa học Lập trình Android tại Hà Nội
  • [Tuyển sinh 2023] Lập trình viên Quốc tế DigiNxt
  • Khóa học Tiền lương & Phúc lợi (C&B Excel) tại Hà Nội
  • LẬP TRÌNH GAME
    • Khóa học Lập trình Game Unity
  • LẬP TRÌNH WEB FRONT END
    • KHÓA HỌC PYTHON HƯỚNG ĐỐI TƯỢNG
    • KHÓA HỌC ANGULAR & TYPESCRIPT (FRONT END)
  • LẬP TRÌNH WEB BACK END
    • LẬP TRÌNH JAVA WEB VỚI FRAME WORK
    • Lập trình Web với Django
    • Lập trình PHP với Laravel Framework
  • CHƯƠNG TRÌNH ĐÀO TẠO ỨNG DỤNG CÔNG NGHỆ
    • Khóa học Tiền lương & Phúc lợi (C&B Excel) tại TP HCM
  • LẬP TRÌNH WEB FULL STACK
    • Khóa học Java Full stack (IJFD)
  • LẬP TRÌNH MOBILE
    • FRONT-END VỚI REACTJS VÀ REACT NATIVE
    • Lập trình Android Nâng cao
  • ĐÀO TẠO CHO DOANH NGHIỆP
    • KHÓA HỌC BUSINESS ANALYSIC TỪ CƠ BẢN ĐẾN NÂNG CAO 2023
    • Khóa học Magento: Làm chủ CMS TMĐT lớn nhất
    • Khóa học IOT: Xây dựng Sản phẩm IOT với Raspberry Pi
    • Khóa học Automation Testing Chuyên nghiệp
  • KHÓA HỌC DỰ ÁN
    • Học sử dụng bộ Office: Word, Excel, Power Point, Mail chuyên nghiệp
  • KHÓA HỌC KHÁC
    • VBA Excel Toàn Tập (Cơ Bản - Nâng Cao)
    • VBA Excel Nâng cao
    • Khóa học JMeter: Performance Testing
    • Khóa học Tester đạt chuẩn Quốc tế ISTQB Foundation Level
    • Khoá Học Tester đạt chuẩn quốc tế ISTQB Advanced Level
Bạn chưa chọn khóa học cần đăng ký
Tên không được để trống
Số điện thoại không được để trống
Email không được để trống
Đăng ký học thành công!
Cảm ơn bạn đã đăng ký học tại NIIT - ICT HÀ NỘI!