Ôn tập: hệ thống hồ sơ người dùng
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 29 trên 110.
Thử thách
DễHãy xây dựng một hệ thống hồ sơ người dùng hoàn chỉnh, kết hợp tất cả các khái niệm về an toàn null bạn đã học trong chương này. Bạn sẽ tạo một hệ thống quản lý tài khoản người dùng với một số thông tin bắt buộc và một số thông tin tùy chọn.
Bạn sẽ sắp xếp code trong hai tệp:
user_profile.dart: Định nghĩa một lớpUserProfileđại diện cho tài khoản người dùng. Hãy cân nhắc thông tin nào là thiết yếu, chẳng hạn như tên người dùng, và thông tin nào là tùy chọn, chẳng hạn như tiểu sử hoặc số điện thoại. Lớp của bạn cần có:String usernamekhông thể null, mọi người dùng đều phải có tên người dùngString emailkhông thể null, mọi người dùng đều phải có emailString? displayNamecó thể null, người dùng có thể muốn hiển thị một tên khácString? biocó thể null, không phải ai cũng viết tiểu sửint? agecó thể null, tuổi là thông tin cá nhân tùy chọn- Một hàm khởi tạo dùng các tham số có tên, với
requiredchousernamevàemail - Một phương thức
getDisplayIdentity()trả về tên hiển thị nếu đã được đặt, nếu không thì trả về tên người dùng bằng?? - Một phương thức
getBioPreview()trả về 20 ký tự đầu tiên của tiểu sử kèm theo...nếu tiểu sử tồn tại và dài hơn 20 ký tự, toàn bộ tiểu sử nếu có độ dài không quá 20 ký tự, hoặcnullnếu không có tiểu sử. Dùng?.để truy cập an toàn - Một phương thức
setDefaultBio()chỉ đặt tiểu sử thành'Hello, I am new here!'nếu hiện tại tiểu sử là null, bằng cách dùng??= - Một phương thức
printProfile()hiển thị toàn bộ hồ sơ của người dùng
main.dart: Nhập lớp hồ sơ người dùng và tạo một số người dùng để minh họa đầy đủ các tính năng an toàn null:- Tạo người dùng có tên người dùng
'alice_dev'và email'alice@code.com', sau đó đặt tên hiển thị là'Alice', tiểu sử là'Software developer passionate about clean code and testing'và tuổi là28 - Tạo người dùng có tên người dùng
'bob_builder'và email'bob@build.io', sau đó chỉ đặt tên hiển thị là'Bob' - Tạo người dùng có tên người dùng
'charlie99'và email'charlie@mail.net', giữ tất cả các trường tùy chọn ở trạng thái null - Gọi
setDefaultBio()cho cả ba người dùng - Với từng người dùng theo thứ tự, gọi
printProfile(), sau đó in raIdentity: [getDisplayIdentity()], rồi in raBio preview: [getBioPreview()]
- Tạo người dùng có tên người dùng
Phương thức printProfile() cần in theo định dạng sau:
===== User Profile =====
Username: [username]
Email: [email]
Display Name: [displayName or "Not set"]
Bio: [bio or "No bio"]
Age: [age or "Not specified"]Lưu ý rằng tiểu sử của Alice không thay đổi sau khi gọi setDefaultBio() vì tiểu sử đã có giá trị, trong khi Charlie được gán tiểu sử mặc định. Cũng hãy quan sát cách phần xem trước tiểu sử rút gọn tiểu sử dài của Alice nhưng hiển thị đầy đủ tiểu sử mặc định ngắn hơn của Charlie.
Kết quả dự kiến:
===== User Profile =====
Username: alice_dev
Email: alice@code.com
Display Name: Alice
Bio: Software developer passionate about clean code and testing
Age: 28
Identity: Alice
Bio preview: Software developer p...
===== User Profile =====
Username: bob_builder
Email: bob@build.io
Display Name: Bob
Bio: Hello, I am new here!
Age: Not specified
Identity: Bob
Bio preview: Hello, I am new here!
===== User Profile =====
Username: charlie99
Email: charlie@mail.net
Display Name: Not set
Bio: Hello, I am new here!
Age: Not specified
Identity: charlie99
Bio preview: Hello, I am new here!Tự làm thử
import 'user_profile.dart';
void main() {
// TODO: Tạo người dùng 'alice_dev' với email 'alice@code.com'
// Đặt displayName thành 'Alice'
// Đặt bio thành 'Software developer passionate about clean code and testing'
// Đặt age thành 28
// TODO: Tạo người dùng 'bob_builder' với email 'bob@build.io'
// Chỉ đặt displayName thành 'Bob'
// TODO: Tạo người dùng 'charlie99' với email 'charlie@mail.net'
// Giữ tất cả các trường tùy chọn là null
// TODO: Gọi setDefaultBio() cho cả ba người dùng
// TODO: Với từng người dùng theo thứ tự (alice, bob, charlie):
// 1. Gọi printProfile()
// 2. In ra "Identity: [getDisplayIdentity()]"
// 3. In ra "Bio preview: [getBioPreview()]"
}
Tất cả bài học trong Lập trình hướng đối tượng
1Nền tảng về lập trình hướng đối tượng
Tệp bên ngoàiThư viện và câu lệnh importGiới thiệu về lập trình hướng đối tượngLớp và đối tượngTừ khóa thisPhương thứcBiến thể hiệnKiến thức cơ bản về hàm khởi tạoÔn tập: Máy tính đơn giản4An toàn với giá trị null
Giới thiệu về an toàn với giá trị nullCó thể null và không thể nullToán tử ? và !Từ khóa late và an toàn với giá trị nullToán tử xử lý nullAn toàn với giá trị null trong lớpÔn tập: hệ thống hồ sơ người dùng7Lớp trừu tượng và interface
Lớp trừu tượngPhương thức trừu tượngInterface trong DartInterface ngầm địnhTriển khai và kế thừaNhiều interfaceÔn tập: Máy tính hình10Bộ sưu tập và kiểu tổng quát
Tổng quan về List, Set và MapBộ sưu tập an toàn về kiểuLớp tổng quátPhương thức tổng quátRàng buộc kiểu tổng quátIterable và IteratorÔn tập: Lưu trữ tổng quát2Hàm khởi tạo trong Dart
Hàm khởi tạo mặc địnhHàm khởi tạo có tênDanh sách khởi tạoHàm khởi tạo hằng sốHàm khởi tạo nhà máyHàm khởi tạo chuyển hướngÔn tập: Trình tạo hình dạng5Đóng gói
Thành viên công khai và riêng tưQuy ước tiền tố _Tính riêng tư ở cấp thư việnTìm hiểu sâu về getter và setterChe giấu thông tinÔn tập: hồ sơ học sinh8Mixin
Giới thiệu về MixinTạo MixinSử dụng nhiều MixinTừ khóa on trong MixinMixin và kế thừaMixin và giao diệnÔn tập: hệ thống động vật3Thuộc tính của lớp
Thành viên instance và thành viên tĩnhTrường final và constBiến latePhương thức và trường tĩnhGetter và setterÔn tập: trình quản lý tài khoản ngân hàng6Kế thừa
Kế thừa cơ bảnTừ khóa superGhi đè phương thứcChú thích @overrideTừ khóa lớp finalHàm khởi tạo và kế thừaÔn tập: phân cấp nhân viên9Đa hình
Khái niệm cơ bản về đa hìnhĐa hình qua giao diệnKiểm tra kiểu lúc chạyToán tử is và asTừ khóa hiệp biếnÔn tập: Bộ xử lý thanh toánTự luyện tập: Trình biên dịch Dart online