Facebook Pixel

Tự học ngôn ngữ Dart: Control Flow Statements

07 Jul, 2021

Nguyên

Author

Tự học ngôn ngữ Dart. Control Flow Statements (cấu trúc rẽ nhánh) trong ngôn ngữ Dart.

Tự học ngôn ngữ Dart: Control Flow Statements

Mục Lục

Cấu trúc điều khiển (Control structures) có thể được coi như là các block code ra lệnh hoặc xác định cho luồng mà các câu lệnh bên trong được thực thi. Chúng cơ bản là những câu lệnh rẽ nhánh của code.

Ví dụ, một block code có thể chạy tuần tự trong đó cấu trúc rẽ nhánh đảm bảo các câu lệnh của nó được thực thi một cách có thứ tự. Một block code cũng có thể chạy theo vòng lặp có các cấu trúc rẽ nhánh đảm bảo các câu lệnh của nó được thực thi lặp đi lặp lại.

Control Flow Statements

Ngôn ngữ Dart cung cấp nhiều câu lệnh có thể điều khiển rẽ nhánh cho block code của bạn.

Chúng ta sẽ tìm hiểu những câu lệnh sau:

  • if and else
  • for loops
  • while and do-while loops
  • break and continue
  • switch and case
  • assert

1. Câu lệnh If

Câu lệnh if cho phép bạn kết hợp các điều kiện trong code, điều kiện cần được đáp ứng trước khi code có thể thực thi.

Hãy xem ví dụ thực tế này để dễ hiểu hơn nhé

Tưởng tượng một sáng thức dậy và bạn chuẩn bị đi chơi. Khi đến cửa, bạn không chắc ngoài trời có mưa hay không. Nếu bên ngoài trời mưa, bạn sẽ mang theo ô bên mình. Nếu trời không mưa, bạn sẽ không cần đến ô nữa và chỉ cần như vậy rồi rời đi thôi. Quyết định cuối cùng của bạn sẽ dựa trên điều kiện thời tiết bên ngoài. Đây cũng là cách hoạt động của các câu lệnh điều kiện.

Điều kiện rẽ nhánh

Hãy xem điều kiện rẻ nhánh của If:

điều kiện rẽ nhánh if

Luồng trên cho thấy rằng nếu điều kiện đã được đáp ứng, trình biên dịch sẽ thực thi câu lệnh điều kiện và nếu điều kiện chưa được đáp ứng, trình biên dịch sẽ thoát khỏi block code đó mà không thực thi.

Syntax

Hãy xem syntax dưới đây của if và tìm hiểu cách viết một block code với if bằng ngôn ngữ Dart

syntax câu lệnh if

Syntax bắt đầu bằng từ khóa if theo sau bởi dấu ngoặc đơn (()). Trong ngoặc đơn, bạn sẽ viết điều kiện của mình. Ví dụ, điều kiện trong thực tế là “sẽ có mưa bên ngoài”. Sau dấu ngoặc đóng ()), chúng ta chèn một dấu ngoặc nhọn mở ({), sau đó chuyển sang dòng tiếp theo và viết câu lệnh điều kiện. Đây là code sẽ thực thi nếu điều kiện đúng. Trong ví dụ thực tế, điều này sẽ là ”lấy ô dù”. Sau khi viết câu lệnh điều kiện, chúng ta chuyển sang dòng tiếp theo và chèn dấu ngoặc nhọn đóng (}) và kết thúc câu lệnh if

Câu lệnh If trong code

Trong ví dụ bên dưới, chúng ta muốn làm trống một danh sách thì điều kiện là danh sách đó phải có chứa phần tử.

Bạn có thể kiểm tra thử liệu một collection có trống hay không bằng cách sử dụng các thuộc tính isEmptyisNotEmpty. isEmpty là true khi collection đó trống và isNotEmptytrue khi collection đó không trống.

Hãy nhớ rằng các thuộc tính có thể được truy cập bằng cách sử dụng toán tử .

Hãy xem ví dụ dưới đây:

Dart
main() {
  var testList = [2,4,8,16,32];
  print(testList);

  if(testList.isNotEmpty){
    print("Emptying List");
    testList.clear();
  }

  print(testList);
}
Bash
Output:
[2, 4, 8, 16, 32]
Emptying List
[]

Trong đoạn code trên, điều kiện là sử dụng thuộc tính isNotEmpty để kiểm tra xem testList có trống không (dòng if(testList.isNotEmpty){). Nếu nó không trống, thì câu lệnh điều kiện được thực thi, đầu tiên sẽ in ra "Emptying List" (dòng print("Emptying List");) và sau đó xóa tất cả các mục có trong testList (dòng testList.clear();).

2. else và else if

Tưởng tượng bạn đang chơi bóng rổ. Khi trận đấu kết thúc chúng ta sẽ biết được đội nào chiến thắng dựa trên số điểm của mỗi đội. Nếu đội A có số điểm nhiều hơn thì đội A sẽ được tuyên bố là chiến thắng. Ngược lại, đội B sẽ là đội chiến thắng.

Nếu chúng ta viết một vài đoạn code cho kịch bản trên, điều đầu tiên chúng ta nghĩ đến có thể là sử dụng câu lệnh if. Nhưng câu lệnh if sẽ không thể tự thực hiện được việc trên bởi vì nó chỉ thực hiện cho một điều kiện và một kết quả. Kịch bản ở trên lại có hai kết quả.

2.1 Câu lệnh else

Dart cung cấp câu lệnh else . else được sử dụng với câu lệnh if và cho trình biên dịch biết phải làm gì nếu điều kiện if không được đáp ứng.

Điều kiện rẽ nhánh

câu lệnh else

Nếu điều kiện không được đáp ứng, trình biên dịch sẽ thực thi đoạn code thay thế trước khi thoát.

Syntax

Hãy xem qua Syntax của câu lệnh if-else

syntax if-else trong ngôn ngữ Dart

Câu lệnh else trong code

Chúng ta sẽ viết đoạn code cho trò bóng rổ ở bên trên nhé.

Dart
main() {
  var pointsA = 50;
  var pointsB = 64;

  if(pointsA > pointsB){
    print("Team A Wins!");
  } else {
    print("Team B Wins!");
  }
}
Bash
Output:
Team B Wins!

Biến pointsA chứa điểm số của team A, pointsB chứa điểm số của team B.

Nếu team A có số điểm nhiều hơn team B, pointsA > pointsB thì in ra Team A Wins!. Ngược lại thì in ra Team B Wins!.

Nếu cả hai team đều có cùng số điểm thì sao? điều kiện if sễ false và đoạn code của else sẽ được thực thi và in ra Team B Wins!. Điều đó thì không đúng lắm và ta sẽ giải quyết vấn đề này ở nội dung bên dưới.

2.2 Câu lệnh else if

câu lệnh else thì quá tốt nếu chỉ có hai kết quả có thể xảy ra. Tuy nhiên, điều gì sẽ xảy ra nếu chúng ta có nhiều hơn 2 trường hợp?

Dart cũng cung cấp câu lệnh else if. else if cũng được sử dụng với câu lệnh if, tuy nhiên khác với else bạn phải chỉ định một điều kiện cùng với đoạn code thay thế. Nó sẽ chỉ thực thi nếu điều kiện else if là true.

Syntax như sau:

syntax câu lệnh else if

else if cũng có thể được sử dụng với câu lệnh else:

syntax else-if và else

Hãy giải quyết bài toán đã thảo luận bên trên với câu lệnh else if nhé!

Dart
main() {
  var pointsA = 50;
  var pointsB = 50;

  if(pointsA > pointsB){
    print("Team A Wins!");
  } else if(pointsB > pointsA) {
    print("Team B Wins!");
  } else {
    print("It's a Tie!");
  }
}
Bash
Output:
It's a Tie!

3. Toán tử Ternary

Trong Dart có một toán tử cho phép thay thế việc sử dụng câu lệnh if-else.

Toán tử đó là toán tử Ternary được đại diện bởi ?:.

Syntax

Hãy xem qua cách mà toán tử này được sử dụng:

syntax toán tử ternary

Nếu condition true, expression1 sẽ được đánh giá và giá trị của nó sẽ được hiển thị. Ngược lại, expression2 sẽ được đánh giá và hiển thị giá trị.

Ví dụ

Hãy nhìn vào ví dụ bên dưới đây. Chúng ta có hai số nguyên ab. Nếu a lớn hơn b, thì lấy a trừ cho b. Ngược lại, lấy b trừ cho a.

Dart
main() {
  var a = 5;
  var b = 2;
  
  var result = a > b ? a - b : b - a;
  print(result);
}
Bash
Output:
3

Ở dòng var result = a > b ? a - b : b - a;, chúng ta sử dụng toán tử ?: . a > b đại diện cho điều kiện trong khi đó a - b đại diện cho biểu thức thứ 1 và b - a đại diện cho biểu thức thứ 2.

Giá trị gán cho a là 5 và giá trị gán cho b là 2. Do đó, a > btrue. Vì điều kiện đã đúng nên biểu thức 1 (a - b) sẽ được đánh giá và kết quả trả về là 3 sẽ được chưa trong result.

Ví dụ trên cũng có thể được viết bằng câu lệnh if-else

Dart
main() {
  var a = 5;
  var b = 2;
  var result;

  if(a > b){
    result = a - b;
  } else {
    result = b - a;
  }
  
  print(result);
}
Bash
Output:
3

4. Vòng lặp for

Nếu như bạn phải in 100 bản tài liệu. Bạn sẽ in từng bản riêng lẻ và nhấn nút in 100 lần hay là bạn sẽ đặt lệnh cho máy in in 100 bản và bạn chỉ cần nhấn một lần thôi?

Cái máy in sẽ thực hiện một hành động (in tài liệu) lặp đi lặp lại trong một vòng lặp cho đến khi nó đạt được mục tiêu của nó. (in 100 bản)

Trong lập trình máy tính, đôi khi chúng ta gặp các tình huống trong đó một block code cần được thực thi nhiều lần. Dart cung cấp vòng lặp for cho mục đích đó.

Điều kiện rẽ nhánh

Hãy xem điều kiện rẻ nhánh của vòng lặp for bên dưới:

điều kiện rẽ nhánh của vòng lặp for

Vòng lặp for cho phép chúng ta xác định một dãy số mà chúng ta muốn vòng lặp chạy.

Iterator có trách nhiệm theo dõi các lần lặp. Giá trị ban đầu của nó là điểm bắt đầu của phạm vi vòng lặp và nó sẽ thay đổi theo mỗi lần lặp.

Syntax

Có nhiều hơn một cách để viết một vòng lặp for trong ngôn ngữ Dart. Hãy xem thử syntax được khái quát hóa ở bên dưới.

syntax vòng lặp for

Syntax bắt đầu bằng từ khóa for theo sau là iterator. Nhưng iterator là gì? và chúng ta xác định nó bằng cách nào?

Iterator mà chúng ta sẽ sử dụng là một biến được gán một dải số. Bạn cần xác định được ba thứ: giá trị ban đầu hay nơi dãy số bắt đầu, giá trị cuối cùng hay nơi nó kết thúc và cách iterator sẽ di chuyển qua dãy (từ giá trị đầu đến giá trị cuối) trong mỗi lần lặp lại của vòng lặp for. Ví dụ, nó có thể được tăng lên 1 hoặc giảm đi 1.

Tất cả ba điều trên được chỉ định trong dấu ngoặc đơn và được phân tách bằng dấu chấm phẩy ;

Đừng lo lắng quá nhé! Bạn sẽ dễ hình dung hơn khi xem qua ví dụ bên dưới.

Vòng lặp for trong code

Giả sử chúng ta muốn in một thứ gì đó 5 lần. Chúng ta cần xác định được 3 thứ.

  1. Giá trị ban đầu của iterator: var i = 0 (giá trị ban đầu là 0)
  2. Giá trị cuối của iterator: i < 5 (lên tới 5)
  3. Cách iterator di chuyển qua dãy được chỉ định: i++ (tăng thêm 1)

Hãy xem đoạn code bên dưới:

Dart
main() {
  for(var i = 0; i < 5; i++){
    print(i);
  }
}
Bash
Output:
0
1
2
3
4

Câu lệnh print được thực thi 5 lần với i lần lượt được gán một giá trị mới từ 0 đến 4 trong mỗi lần lặp. Biểu thức for chạy trong 5 lần lặp.

Vòng lặp với một collection

Chúng ta có thể sử dụng vòng lặp for để thực hiện một vài hành động trên mỗi phần tử trong một collection.

Hãy in từng phần tử trong danh sách màu dưới đây

Dart
main() {
  var colorList = ['blue', 'yellow', 'green', 'red'];
  for(var i = 0; i < colorList.length; i++){
    print(colorList[i]);
  }
}
Bash
Output:
blue
yellow
green
red

Để tạo ra phạm vi cho iterator i, chúng ta sử dụng thuộc tính length . iterator của chúng ta sẽ chạy trong phạm vi từ 0 đến nhỏ hơn độ dài của colorList một đơn vị. Bởi vị thuộc tính length bắt đầu đếm các phần tử trong danh sách từ số 1 còn i của chúng ta thì bắt đầu bằng 0.

Đó là lý do mà chúng ta phải viết i < colorList.length thay vì i <= colorList.length.

Dạng For-In

Đối với sets và lists, bạn có thể sử dụng dạng lặp for-in.

Vòng lặp for được sử dụng dưới dạng for-in theo syntax sau:

Dạng lặp for-in

Hãy lấy ví dụ bên trên và điều chỉnh code một chút để áp dụng dạng mới nhé.

Dart
main() {
  var colorList = ['blue', 'yellow', 'green', 'red'];
  
  for(var i in colorList){
    print(i);
  }
}
Bash
Output:
blue
yellow
green
red

Đoạn code hoạt động giống như trong ví dụ trước. Tuy nhiên, lần này phạm vi là các phần tử của một collection. Mỗi phần tử khi đến lượt sẽ được gán cho iterator i và một thao tác sẽ được thực hiện trên nó. Trong trường hợp này, phương thức in sẽ gọi cho từng phần tử.

Kết hợp điều kiện với vòng lặp

Cho đến bây giờ, chúng ta mới chỉ thực hiện một vài thao tác vòng lặp đơn giản với câu lệnh in. Nhưng có rất nhiều thứ hay ho khác mà bạn có thể thực hiện với vòng lặp.

Hãy thử kết hợp một điều kiện với một vòng lặp xem sao nhé!

Trong ví dụ dưới đây, chúng ta có một danh sách các số nguyên trong intList. Và chúng ta sẽ chỉ in những số nguyên chẵn từ danh sách đó.

Dart
main() {
  var intList = [6,7,3,9,2,5,4];
  
  for(var i in intList){
    if(i % 2 == 0){
      print(i);
    }
  }
}
Bash
Output:
6
2
4

Trong dòng for(var i in intList){, chúng ta truy cập vào từng phần tử trong danh sách intList. Ở dòng if(i % 2 == 0){, chúng ta chèn thêm một điều kiện cho các phần tử. Chỉ khi điều kiện là true thì câu lệnh dòng print(i) mới được thực thi.

5. Vòng lặp while

Khi sử dụng từ "while" trong một câu, chúng ta liên hệ nó với cấu trúc của thời gian. Trong tiếng Anh, "while" có thể được sử dụng như một liên từ, chỉ sự xuất hiện của một sự kiện trong khi một sự kiện khác đang diễn ra. Ví dụ, bạn có thể nói "I am reading a book while my sister is cooking". Câu này chỉ ra rằng sự kiện, reading a book, sẽ diễn ra song song với sự kiện cooking.

Vòng lặp while trong ngôn ngữ Dart cũng vậy, Sự kiện A là một điều kiện và sự kiện B là một nội dung code sẽ được thực thi. Phần nội dung code sẽ được thực thi lặp đi lặp lại miễn là điều kiện A được đáp ứng (true).

Cấu trúc rẻ nhánh

Hãy xem cấu trúc rẻ nhánh của vòng lặp while bên dưới

cấu trúc rẻ nhánh của vòng lặp while

Nếu điều kiện được thỏa, trình biên dịch sẽ thực thi block code và kiểm tra lại điều kiện. Vòng lặp này tiếp tục diễn ra cho đến khi điều kiện không còn thỏa nữa. Lúc đó trình biên dịch sẽ thoát ra khỏi block code.

Syntax

Syntax của while

Syntax của while khá là rõ ràng. Điều kiện để kiểm tra sẽ nằm trong dấu (). Theo sau là block code thực thi được nằm trong dấu ngoặc nhọn {}. Nếu điều kiện true thì block code sẽ thực thi.

Điều kiện phải là một biểu thức kiểu Boolean. Nếu điều kiện là true, mã sẽ thực thi. Nếu điều kiện false, trình biên dịch sẽ thoát code.

Vòng lặp while trong code

Trong ví dụ bên dưới chúng ta muốn in từ số 1 đến 10 bằng cách sử dụng vòng lặp while

Dart
main() {
  var count = 1;
  while (count <= 10) {
    print(count);
    count += 1;
  }
}
Bash
Output:
1
2
3
4
5
6
7
8
9
10

Biến count đang hoạt động như một biến điều khiển vòng lặp. Nó được khởi tạo với giá trị 1 và trong khi giá trị của nó vẫn nhỏ hơn hoặc bằng 10 thì block code trong ({}) sẽ tiếp tục thực thi. Block code chỉ đơn giản là in giá trị hiện tại của số đếm (trên dòng print(count);) và tăng nó lên một đơn vị (trên dòng count += 1;).

6. Vòng lặp do-while

Dart cũng có một vòng lặp do-while hoạt động giống hệt như vòng lặp while với một điểm khác biệt được bổ sung, đó là nó thực thi block code trước khi kiểm tra điều kiện.  do-while đảm bảo rằng mã trong dấu ngoặc nhọn ({}) sẽ thực thi ít nhất một lần.

Syntax như sau:

vòng lặp do-while

Ví dụ:

Hãy xem một ví dụ đơn giản dưới đây để hiểu được sự khác biệt nhỏ giữa whiledo-while.

Đoạn mã dưới đây khai báo một biến không thay đổi, alwaysOne, được gán giá trị là 1. Chúng ta muốn in giá trị của alwaysOne khi nó không phải là 1. Hơi nghịch lý một chút nhỉ!

Vì điều kiện của alwaysOne != 1 không bao giờ có thể true, giá trị của alwaysOne sẽ không bao giờ được in phải không?

Nhưng không phải vậy đâu. Hãy chạy cùng một đoạn code bằng cách sử dụng whiledo-while và xem điều gì sẽ xảy ra nhé!

while:

Dart
main() {
  var alwaysOne = 1;
  while (alwaysOne != 1){
    print("Using while: $alwaysOne");
  }

  print("Nothing Happened");
}
Bash
Output:
Nothing Happened

Chỉ có một thứ được in trong đoạn code trên đó là Nothing Happened . bởi vì chương trình không bao giờ đi vào vòng lặp while.

do-while:

Dart
main() {
  var alwaysOne = 1;
  do {
    print("Using do-while: $alwaysOne");
  } while (alwaysOne != 1);
}
Bash
Output:
Using do-while: 1

Trong khi vòng lặp while không thực thi block code thì vòng lặp do-while được thực hiện vì nó kiểm tra điều kiện sau khi thực thi block code.

7. Vòng lặp vô hạn

Khi khai báo vòng lặp while, hãy nhớ rằng điều kiện cuối cùng phải được đánh giá là false. Nếu nó không bao giờ được đánh giá là false và sẽ luôn là true thì vòng lặp while sẽ chạy với vô số lần lặp lại dẫn đến chương trình của bạn bị lỗi.

Xem thử ví dụ khi vòng lặp while chạy tới vô hạn:

Dart
main() {
  var alwaysOne = 1;

  while(alwaysOne == 1) {
    print(alwaysOne);
  }
}

Khi chương trình trên chạy thì cuối cùng nó sẽ bị sập. Lý do cho điều này là điều kiện được chuyển đến while sẽ luôn đúng đến vô hạn. alwaysOne sẽ luôn bằng 1 vì chúng ta không bao giờ gán cho nó một giá trị khác trong suốt chương trình.

8. Câu lệnh break và continue

Trong phần này, chúng ta sẽ học cách kiểm soát  các vòng lặp nhiều hơn bằng cách sử dụng câu lệnh breakcontinue.

8.1 Câu lệnh break

break được sử dụng để dừng sớm một vòng lặp. Khi Dart tìm thấy một câu lệnh break, nó sẽ ngắt khỏi vòng lặp bất kể các lần lặp đã được hoàn thành hay chưa.

Nó chủ yếu được sử dụng với một câu lệnh điều kiện. Dựa trên điều kiện, vòng lặp sẽ biết cần phải thoát ra hay không.

Hãy xem một ví dụ tương tự như ví dụ chúng ta đã xem xét với vòng lặp for, chúng ta có một danh sách các số nguyên và chỉ muốn in các số nguyên chẵn từ danh sách.

Tuy nhiên, trong ví dụ này, chúng ta chỉ muốn biết lần xuất hiện đầu tiên của một số nguyên chẵn là bao nhiêu.

Dart
main() {
  var intList = [7,3,9,6,2,5,4];

  for(var i in intList){
    if(i % 2 == 0){
      print(i);
      break;
    }
  }
}
Bash
Output:
6

Trong ví dụ trước, chúng ta muốn in mọi số nguyên chẵn trong danh sách. Tuy nhiên, trong ví dụ này, chúng ta đã chèn một câu lệnh break trong câu lệnh điều kiện của mình.

Khi số nguyên chẵn đầu tiên được tìm thấy, điều kiện của câu lệnh if sẽ trở thành true, dẫn đến việc thực hiện dòng print(i); và dòng break;. Ở dòng break;, vòng lặp bị ngắt, vì vậy chỉ số 6 được in chứ không phải 2 và 4.

8.2 Câu lệnh continue

continue được sử dụng để bỏ qua bước lặp đang chạy và chuyển sang bước tiếp theo, bất kể vẫn còn dòng code đang được thực thi.

Hãy tưởng tượng bạn chịu trách nhiệm tuyển dụng một nhân viên mới cho công ty của bạn và người đó phải có ít nhất 5 năm kinh nghiệm làm việc. Bạn xem qua danh sách các ứng cử viên. Ứng viên có ít hơn 5 năm kinh nghiệm bị bỏ qua, trong khi ứng viên có hơn 5 năm kinh nghiệm được gọi phỏng vấn.

Chúng ta sẽ lưu trữ kinh nghiệm của các ứng viên trong một danh sách. Kinh nghiệm của ứng viên đầu tiên sẽ ở thứ tự 0, kinh nghiệm của ứng viên thứ hai sẽ ở thứ tự  1, v.v.

Hãy thử viết tình huống này trong Dart và tìm ra thử ứng viên nào sẽ được đi phỏng vấn nhé!

Dart
main() {
  var experience = [5,1,9,7,2,4];

  for(var i = 0; i < experience.length; i++){
    var candidateExperience = experience[i];
    if(candidateExperience < 5){
      continue;
    }
    print("Call candidate $i for an interiew.");
  }
}
Bash
Output:
Call candidate 0 for an interiew.
Call candidate 2 for an interiew.
Call candidate 3 for an interiew.

Nếu, trên một lần lặp, giá trị của candidateExperience nhỏ hơn 5, thì dòng 7 của đoạn code trên được thực thi, nó sẽ bỏ qua lần lặp hiện tại và quay trở lại đầu vòng lặp. Do đó, câu lệnh print sẽ không bao giờ được thực thi với những phần tử nhỏ hơn 5.

9. Câu lệnh switch - case

Câu lệnh switch là một câu lệnh điều kiện tương tự if-else. Nó có các mệnh đề trường hợp khác nhau được chỉ định bởi từ khóa case, tương tự như các điều kiện trong câu lệnh if-else. switch nhận một biểu thức và mệnh đề trường hợp tương đương với biểu thức đó sẽ được thực thi.

switch khác với if-else ở chỗ các câu lệnh if chỉ có thể trả về true hoặc false và chỉ có thể được định nghĩa như vậy. Mặt khác, mệnh đề trường hợp không bị giới hạn ở các giá trị boolean. Tuy nhiên, hãy đảm bảo rằng các mệnh đề trường hợp có cùng kiểu với biểu thức.

Syntax của nó như sau:

Câu lệnh switch

Biểu thức sẽ được so sánh với caseClause bằng cách sử dụng ==. Khi tìm thấy caseClause, câu lệnh điều kiện cho trường hợp cụ thể đó sẽ được thực thi và câu lệnh break ngắt khỏi câu lệnh switch vì chỉ một trường hợp có thể được thực thi mà thôi. Nếu không có trường hợp nào bằng với biểu thức, mệnh đề sẽ mặc định được thực thi.

Trong ví dụ bên dưới, chúng ta có command. Dựa vào giá trị của command câu lệnh sẽ được in.

Dart
main() {
  var command = 'OPEN';
  
  switch(command) {
    case 'CLOSED': 
      print('closed');
      break;
    case 'PENDING': 
      print('pending');
      break;
    case 'APPROVED': 
      print('approved');
      break; 
    case 'DENIED': 
      print('denied');
      break;   
    case 'OPEN':
      print('open');
      break;
    default:
      print('command unknown');
  }
}
Bash
Output:
open

Khi bạn chạy đoạn code trên, output sẽ hiển thị open. Do giá trị của commandOPEN nên đến trường hợp thứ 5 thì câu lệnh điều kiện print('open') mới được thực thi.

10. Câu lệnh assert

assert là một câu lệnh cực kỳ hữu ích cho phép bạn đặt điều kiện cho việc thực thi code. Nó được sử dụng để làm gián đoạn quá trình thực thi bình thường khi điều kiện booleanfalse.

Syntax của nó như sau:

Câu lệnh assert

Tham số đầu tiên được truyền qua assert  là biểu thức đầu vào được đánh giá với kiểu boolean. Nếu biểu thức đầu vào có giá trị là true, hàm assert sẽ không làm gì (chương trình vẫn thực hiện như bình thường). Nếu biểu thức đầu vào có giá trị là false, hàm assert sẽ in ra thông báo lỗi.

Tham số thứ hai được truyền qua assert là một kiểu string nhằm gắn thông điệp vào assertion.

Ví dụ:

Dart
main() {
  var variable;
  print(variable);

  assert(variable != null);
  
  variable = 5;
  print(variable);
}
Bash
Output:
null
Unhandled exception:
'file:///usercode/main.dart': Failed assertion: line 5 pos 10: 'variable != null': is not true.
#0      _AssertionError._doThrowNew (dart:core-patch/errors_patch.dart:40:39)
#1      _AssertionError._throwNew (dart:core-patch/errors_patch.dart:36:5)
#2      main (file:///usercode/main.dart:5:10)
#3      _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:305:19)
#4      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:172:12)

Ở dòng var variable; của đoạn code trên chúng ta khai báo một biến variable, mà không gán cho nó một giá trị gì cả. Do đó nó sẽ tương tự như null.

Ở dòng assert(variable != null); chúng ta sử dụng câu lệnh assert và truyền cho nó một biểu thức  variable != null. Vì biểu thức là false nên các đoạn code phía sau sẽ không được thực thi và một tình huống ngoại lệ được trả ra.

Có thể bạn sẽ nghĩ đến câu lệnh if vì nó khá tương tự với câu lệnh assert này.

Hãy điều chỉnh đoạn code bên dưới bằng câu lệnh if-else thay vì câu lệnh assert.

Dart
main() {
  var variable;
  print(variable);

  if(variable != null){
    print('not null');
  }
  else{
    variable = 5;
    print(variable);
  }
}
Bash
Output:
null
5

Đối với If chương trình tiếp tục chạy và thực thi đến dòng code cuối cùng.

Khi chương trình phát triển và trở thành module, bạn có thể đặt câu lệnh assert ở bất cứ đâu khi cần cảnh báo các trường hợp ngoại lệ phát sinh.

Kết thúc bài viết về câu điều kiện rẻ nhánh tại đậy. Chúng ta hãy cùng tiếp tục đến với bài viết tiếp theo để tìm hiểu về hàm trong ngôn ngữ Dart nhé!

Bài viết liên quan

Lập trình backend expressjs

xây dựng hệ thống microservices
  • Kiến trúc Hexagonal và ứng dụngal font-
  • TypeScript: OOP và nguyên lý SOLIDal font-
  • Event-Driven Architecture, Queue & PubSubal font-
  • Basic scalable System Designal font-

Đăng ký nhận thông báo

Đừng bỏ lỡ những bài viết thú vị từ 200Lab