Từ những kết cấu thuần túy cho mục đích an toàn, trong ba đoạn tiếp theo đây chúng ta sẽ chuyển hướng sang các tính năng khác. Chúng không những giúp cho mã nguồn an toàn hơn và dễ đọc hơn, mà còn làm cho công việc lập trình dễ chịu hơn. Hy vọng rằng các lập trình viên chỉ quen với lối lập trình “hoang dã” có thể tìm thấy trong đó những điều lý thú.
Thuộc tính
Trước hết xin được làm rõ thuật ngữ. Trong ngữ cảnh lập trình định hướng đối tượng, khái niệm
thuộc tính (attribute) được dùng theo nghĩa biến thành viên, tức là biến gắn liền với một lớp kiểu nào đó. Còn ở Ada, khái niệm này mang một ý nghĩa khác.
Các thuộc tính trong Ada là một thứ thông tin phụ trợ nào đó gắn liền với một thực thể (kiểu, biến,...). Chúng mô tả tính chất của thực thể đáng quan tâm đối với lập trình viên. Các thuộc tính Ada có lẽ gần giống nhất với thuộc tính trong C#, nhưng không tinh vi phức tạp bằng C#. Nếu nhận thức rằng Ada trên một phương diện nào đó cạnh tranh với ngôn ngữ C, các thuộc tính như vậy là quá đủ. Tốt nhất ta hãy xem một thí dụ nhỏ. Trong đoạn trước ta đã xác lập các kiểu số nguyên với những ràng buộc khác nhau.
Code: type Integer is range -2**31 .. 2**31-1;
subtype Natural is Integer range 0 .. 2**31-1; -- số tự nhiên, kể cả số 0
subtype Positive is Integer range 1 .. 2**31-1; -- số nguyên dương
Nhưng đoạn mã này còn có một thiếu sót. Các phân kiểu Natural và Positive được chặn dưới đúng như yêu cầu, nhưng lại được chặn trên bởi những “số quái” (magic number) không diễn đạt thật rõ là chúng có cùng cận trên với Integer. Vấn đề này có thể giải quyết bằng một hằng số, nhưng dùng thuộc tính thì sẽ đẹp hơn. Các thuộc tính trong Ada được viết sau một dấu nháy đơn (apostrophe).
Code: type Integer is range -2**31 .. 2**31-1;
subtype Natural is Integer range 0 .. Integer’Last; -- số tự nhiên, kể cả số 0
subtype Positive is Integer range 1 .. Integer’Last; -- số nguyên dương
Mỗi kiểu số nguyên đều có thuộc tính
Last, giá trị của nó là số lớn nhất của kiểu. Giả sử lúc này ta muốn thay đổi khoảng giá trị của Integer, thí dụ, thành số 64 bit, thì chỉ cần thay đổi ở một nơi trong chương trình - ở nơi định nghĩa kiểu. Thuộc tính cho biết giá trị nhỏ nhất của kiểu gọi là thuộc tính
First.
Xin nêu thêm vài thí dụ đáng chú ý nữa. Như đã nói trong một đoạn trước, Ada cho phép xác lập các kiểu số nguyên theo cách lập trình viên ấn định khoảng giá trị, còn bộ biên dịch tự chọn cách biểu diễn “vật lý” thích hợp. Muốn biết nó đã chọn như thế nào, ta dùng thuộc tính. Hãy xem câu khai báo xác lập một kiểu với khoảng giá trị kỳ quái sau đây.
Code: type BlackHat is range 200 .. 1_000;
Thuộc tính
Size cho biết số bit cần thiết để biểu diễn mọi giá trị của kiểu. Biểu thức BlackHat’Size có giá trị là 10 vì 1024 = 2**10. Do phần lớn máy tính đều không có phép tính số học 10 bit, bộ biên dịch phải biểu diễn mỗi kiểu dựa trên một kiểu nào đó tự nhiên (native), sẵn có trên loại máy tính của ta, gọi là kiểu
cơ sở (base). Kiểu cơ sở không có tên mà chỉ được mệnh danh bằng thuộc tính
Base. Biểu thức BlackHat’Base’Size có giá trị là 16, vậy BlackHat được chứa trong một thanh ghi số nguyên 16 bit.
Ngôn ngữ định nghĩa hàng loạt thuộc tính. Chúng có mặt không những ở các kiểu số nguyên, mà còn ở
liệt kê (enumeration), số thực dấu chấm động và tĩnh,
mảng (array),
thẻ (record),
tác vụ (task) và vài thứ khác liên quan.