Menu
CoddyTech

Giới thiệu về an toàn với giá trị null

Thuộc phần Lập trình hướng đối tượng trong hành trình Dart của Coddy. Bài học 23 trên 110.

Một trong những nguyên nhân phổ biến nhất gây ra bug trong lập trình là cố dùng một giá trị không tồn tại. Trong Dart, trạng thái “không có giá trị” đặc biệt này được biểu thị bằng null. Tính năng an toàn null của Dart giúp bạn phát hiện những lỗi này trước cả khi code chạy.

Nếu không có tính năng an toàn với null, bất kỳ biến nào cũng có thể là null, dẫn đến sự cố khi chạy chương trình nếu bạn cố sử dụng biến đó:

// Trong các phiên bản Dart cũ (chưa có cơ chế an toàn với null)
String name;  // Có thể là null!
print(name.length);  // Chương trình gặp lỗi nếu name là null

Khi bật tính năng an toàn null (Dart 2.12 trở lên), trình biên dịch phân biệt các biến có thể chứa null với các biến không thể chứa giá trị này. Theo mặc định, các biến là không thể null, tức là chúng luôn phải chứa một giá trị hợp lệ:

String name = 'Alice';  // Phải có giá trị
print(name.length);     // An toàn vì name không bao giờ là null

Trình biên dịch sẽ từ chối biên dịch code nếu một biến không thể nhận giá trị null có khả năng mang giá trị null. Nhờ vậy, lỗi được phát hiện trong lúc biên dịch thay vì khi chạy, giúp chương trình của bạn đáng tin cậy hơn. Trong các bài học tiếp theo, bạn sẽ học cách khai báo kiểu có thể nhận giá trị null khi thực sự cần và các toán tử Dart cung cấp để xử lý an toàn những giá trị có khả năng là null.

challenge icon

Thử thách

Dễ

Hãy cùng tạo một hệ thống danh thiếp liên hệ đơn giản để minh họa tầm quan trọng của các biến không nullable. Bạn sẽ tạo một hệ thống trong đó mọi liên hệ đều phải có thông tin hợp lệ, chắc chắn có sẵn.

Bạn sẽ sắp xếp code thành hai tệp:

  • contact.dart: Định nghĩa một lớp Contact đại diện cho thông tin liên hệ của một người. Vì chúng ta đang dùng tính an toàn null, mọi trường đều phải có giá trị hợp lệ, không được thiếu dữ liệu! Lớp của bạn cần có:
    • Một String firstName cho tên của liên hệ
    • Một String lastName cho họ của liên hệ
    • Một String email cho địa chỉ email của liên hệ
    • Một int phoneDigits cho số chữ số trong số điện thoại của họ
    • Một hàm khởi tạo nhận cả bốn giá trị
    • Một getter fullName trả về tên và họ ghép lại, với một dấu cách ở giữa
    • Một phương thức displayCard() in ra thông tin liên hệ
  • main.dart: Nhập lớp liên hệ và tạo hai liên hệ để minh họa rằng mọi trường đều chắc chắn có giá trị:
    • Tạo một liên hệ có tên 'Emma', họ 'Wilson', email 'emma@mail.com' và số chữ số điện thoại là 10
    • Tạo một liên hệ có tên 'James', họ 'Brown', email 'james@work.com' và số chữ số điện thoại là 11
    • Gọi displayCard() trên từng liên hệ theo thứ tự liệt kê ở trên

Phương thức displayCard() cần in ra theo đúng định dạng sau:

--- Contact Card ---
Name: [fullName]
Email: [email]
Phone digits: [phoneDigits]

Hãy chú ý rằng mọi biến đều phải được khởi tạo bằng một giá trị thực, đây chính là tính an toàn null! Trình biên dịch đảm bảo rằng khi bạn truy cập fullName, email hoặc bất kỳ trường nào khác, trường đó luôn chứa dữ liệu hợp lệ.

Đầu ra mong đợi:

--- Contact Card ---
Name: Emma Wilson
Email: emma@mail.com
Phone digits: 10
--- Contact Card ---
Name: James Brown
Email: james@work.com
Phone digits: 11

Tự làm thử

import 'contact.dart';

void main() {
  // TODO: Tạo liên hệ đầu tiên với:
  // - tên: 'Emma'
  // - họ: 'Wilson'
  // - email: 'emma@mail.com'
  // - số chữ số của số điện thoại: 10

  // TODO: Tạo liên hệ thứ hai với:
  // - tên: 'James'
  // - họ: 'Brown'
  // - email: 'james@work.com'
  // - số chữ số của số điện thoại: 11

  // TODO: Gọi displayCard() trên từng liên hệ theo thứ tự
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch Dart online