Kiểu dữ liệu do người dùng định nghĩa
Đã giới thiệu| English | Ý nghĩa |
|---|---|
| user-defined types/ˈjuːzə dɪˈfaɪnd taɪps/ | kiểu do người dùng định nghĩa |
| non-composite/nɒn ˈkɒmpəzɪt/ | không tổ hợp |
| composite/ˈkɒmpəzɪt/ | tổ hợp |
| enumerated type/ɪˈnjuːməreɪtɪd taɪp/ | kiểu liệt kê |
| pointer/ˈpɔɪntə/ | con trỏ |
| dereference/ˌdiːˈrefrəns/ | giải tham chiếu |
| record/ˈrekɔːd/ | bản ghi |
| set/set/ | tập hợp |
| class/klæs/ | lớp |
| attributes/ˈætrɪbjuːts/ | thuộc tính |
| methods/ˈmeθədz/ | phương pháp |
Một kiểu dữ liệu khiến lỗi trở nên không thể xảy ra
- Hệ thống bệnh viện lưu nhóm máu bệnh nhân dưới dạng
STRING. Ai đó gõ "0+" thay vì "O+": số 0 cho chữ cái O. Trường dữ liệu đã chấp nhận nó, vì chuỗi ký tự (string) chấp nhận mọi thứ. - Không có gì trong chương trình có thể nhận ra "0+" không phải là nhóm máu, nên lỗi di chuyển không bị phát hiện đến điểm mà nó gây hậu quả.
- gán cho trường đó một kiểu mà giá trị của nó chính xác là tám nhóm máu, và phép gán sẽ bị từ chối ngay khi được nhập, bởi trình biên dịch, trước khi chương trình EVER chạy.
- Đó chính là điều mà kiểu dữ liệu do người dùng định nghĩa mang lại. Bài học này là những cái mà chương trình học tên, và cách chọn giữa chúng.
Tại sao cần kiểu dữ liệu do người dùng định nghĩa
- Một
STRINGtích hợp cho phép bạn lưu vô nghĩa vào một trường vốn dĩ chỉ nên chứa một trong vài giá trị hợp lệ; một kiểu dữ liệu do người dùng định nghĩa hạn chế nó, giúp trình biên dịch bắt được nhiều lỗi hơn. - Các thực thể thực tế thường là một bộ sưu tập các giá trị khác nhau, và một kiểu tích hợp chỉ có thể chứa một.
DECLARE MyTaxi : Vehiclelà tự giải thích: nó nói rõ biến đó là gì, trong khiDECLARE MyTaxi : STRINGchỉ nói rõ nó được lưu trữ như thế nào.
Tại sao cần kiểu dữ liệu do người dùng định nghĩa? Chọn tất cả các phương án đúng.
Difficulty 2/5 · 140 coins + a small bonus on first completion today
Giới hạn, nhóm và tự tài liệu hóa. Tốc độ không phải là lý do; tính chính xác và rõ ràng mới là yếu tố then chốt.
Kiểu không tổ hợp: liệt kê
- Một kiểu đơn giản chứa một giá trị duy nhất; một kiểu tổng hợp nhóm nhiều giá trị lại với nhau.
- Một kiểu liệt kê có các giá trị là một danh sách cố định các hằng có tên. Các tên này là giá trị của kiểu mới, được lưu trữ bên trong dưới dạng số nguyên nhỏ.
TYPE Vehicle = (M100, M230, T101, T102, T120, T150)
DECLARE MyTaxi : Vehicle
MyTaxi ← T102 // anything outside the list is rejected
- Ứng dụng: các ngày trong tuần, màu sắc, mã trạng thái, nhóm máu: bất kỳ lĩnh vực nào mà các giá trị hợp lệ là một danh sách ngắn đã biết.

Sáu giá trị có tên, và không có gì khác có thể gán
An enumerated type holds:
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Kiểu liệt kê giới hạn một biến chỉ nhận một trong một tập hợp cố định các giá trị có tên (ví dụ: các ngày trong tuần).
Các kiểu không tổ hợp: conype
- Một conype giữ địa chỉ bộ nhớ của một biến khác, hoặc
NULLcó nghĩa là "không có mục tiêu". - Để truy cập trực tiếp một conype, ký hiệu là
p^, là đến được biến mà nó trỏ tới.
TYPE PNode = ^TNode // a pointer to a TNode
DECLARE p : PNode
p ← NEW TNode
p^.Value ← 42 // dereference, then reach the field
- Conype là thứ tạo điều kiện cho các cấu trúc động: một danh sách liên kết gồm các nút được nối bằng conype, và một cây gồm các nút có hai. Chúng cũng truyền một bản ghi lớn sang thủ tục mà không cần sao chép.

Biến giữ nơi dữ liệu nằm, chứ không phải chính dữ liệu
A pointer lưu địa chỉ bộ nhớ của một biến khác, và trỏ ngược lại nó (ví dụ: p^) sẽ truy cập đến biến mà con trỏ đó đang trỏ tới.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Con trỏ (với NULL đánh dấu "trỏ tới không gì") là cách các cấu trúc động như danh sách liên kết và cây được xây dựng.
Việc truy cập đến biến mà con trỏ đang trỏ tới, được viết là p^, được gọi là ____.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Con trỏ giữ một địa chỉ; trỏ ngược lại nó để theo dõi đến dữ liệu. Đó chính là cách danh sách liên kết và cây được xây dựng.
Các kiểu tổ hợp
- Một bản ghi nhóm các trường có kiểu khác nhau dưới một tên, trong một khối
TYPE … ENDTYPE. Bạn đã gặp nó trong chủ đề 10. - Một tập hợp là một tập hợp không thứ tự các giá trị duy nhất, với các toán tử thêm, xóa, kiểm tra thành viên, hợp và giao.
DECLARE Available : SET OF Colour
Available ← {Red, Blue}
IF Green IN Available THEN
…
ENDIF
- Một lớp và các đối tượng của nó, đối tượng, kết hợp các trường dữ liệu, các thuộc tính, với các toán tử trên chúng, các phương thức.

Các trường có kiểu khác nhau, một định danh
Ghép nối mỗi kiểu do người dùng định nghĩa với những gì nó chứa.
Difficulty 2/5 · 140 coins + a small bonus on first completion today
Enumerated = giá trị có tên cố định; pointer = một địa chỉ; class = dữ liệu + hành vi; set = các giá trị duy nhất không thứ tự.
Một tập hợp (set) là một bộ có thứ tự trong đó một giá trị có thể xuất hiện nhiều lần.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Một tập hợp (set) không có thứ tự và các giá trị của nó là duy nhất. Một mảng (array) là cấu trúc có thứ tự cho phép trùng lặp.
Lớp
CLASS Taxi
PRIVATE Capacity : INTEGER
PUBLIC FUNCTION GetCapacity() RETURNS INTEGER
RETURN Capacity
ENDFUNCTION
ENDCLASS
- Một lớp là định nghĩa; một đối tượng là thực thể của nó, một chiếc taxi cụ thể với dung lượng riêng.
- Điều phân biệt nó với bản ghi là các phương thức: bản ghi chỉ là dữ liệu, còn lớp là dữ liệu và hành vi đi kèm với nó.
A class combines:
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Một class gộp chung thuộc tính và phương thức; một object là một thực thể (instance) của class.
What distinguishes a class from a record?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Cả hai đều là trường nhóm; chỉ lớp mới mang hành vi. Một đối tượng là một thực thể của lớp.
Ví dụ giải: chọn kiểu và giải thích lý do
- Hệ thống đặt phòng lưu trữ, đối với mỗi lần đặt, một trạng thái phải là một trong ba: Đã yêu cầu, Đã xác nhận hoặc Hủy. Loại do người dùng định nghĩa nào, và tại sao?
- Kiểu liệt kê: các giá trị hợp lệ là một danh sách cố định ngắn, vì vậy kiểu này ngăn chặn việc gán bất kỳ giá trị nào khác và đoạn mã đọc như miền giá trị thực tế.
- Và đối với chính lần đặt: tham chiếu, ngày tháng, số lượng hành khách và giá tiền? Một bản ghi, vì các giá trị có kiểu khác nhau và luôn mô tả một lần đặt cùng nhau.
- Và đối với tập các ghế vẫn trống? Một tập hợp: không thứ tự, không trùng lặp, và kiểm tra thành viên là toán tử bạn cần.
Chọn giữa hai loại
| Nhu cầu | Kiểu |
|---|---|
| một giá trị từ danh sách cố định ngắn | liệt kê |
| trỏ indirect, hoặc cấu trúc phát triển | conype |
| nhiều trường có kiểu khác nhau mô tả một thứ | bản ghi |
| một tập hợp không thứ tự các giá trị duy nhất | tập hợp |
| trạng thái và hành vi tác động lên nó | lớp |
Phòng thí nghiệm khái niệm lập trình
Connect examples to the programming idea they show.
Đối với biến bắt buộc phải là một trong {Red, Green, Blue}, kiểu tốt nhất là:
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Một danh sách cố định các giá trị cho phép chính xác là điều mà kiểu liệt kê dùng để làm.
Điểm số dễ mất
- Các giá trị của kiểu liệt kê là hằng có tên, không phải chuỗi.
MyTaxi ← "T102"là thứ khác và sai. - Một conype giữ một địa chỉ, không phải giá trị. Truy cập trực tiếp là bước để lấy được giá trị.
- Một tập hợp là không thứ tự và không trùng lặp; một mảng có thứ tự và có thể lặp lại. Cách diễn đạt của câu hỏi sẽ cho bạn biết cái nào.
- Điều làm cho lớp hơn cả bản ghi là các phương thức. Hãy nói khi được hỏi về sự khác biệt.
Bạn đã nắm vững
- Các kiểu do người dùng định nghĩa hạn chế những gì có thể lưu trữ, nhóm các giá trị thuộc về nhau, và làm cho đoạn mã tự tài liệu hóa
- không tổ hợp: liệt kê (danh sách cố định các hằng có tên) và conype (địa chỉ, truy cập bằng truy cập trực tiếp)
- tổ hợp: bản ghi (các trường có kiểu khác nhau), tập hợp (không thứ tự, duy nhất), lớp/đối tượng (thuộc tính cộng phương thức)
- chọn từ nhu cầu, và giải thích bằng tính chất phù hợp: danh sách cố định, trỏ indirect, các trường hỗn hợp, tính duy nhất, hoặc trạng thái với hành vi