Nhân tiện khi nói về chủ đề liên quan tới package
, thì mình mới nhớ ra một yếu tố nữa mà các ngôn ngữ phổ biến khác hỗ trợ OOP
có sử dụng. Đó là các thành phần static
bao gồm các biến lưu trữ và các phương thức không cần phải phát động bởi các object
thực thể mà có thể sử dụng trực tiếp từ tên định kiểu. Ví dụ như trong JavaScript
thì chúng ta có thể tạo ra một biến và một phương thức sử dụng chung trong nội bộ các object
của một class
như thế này.
class Person { static #counter; static { counter = 0; } static #increaseCounter ( ) { Person.#counter += 1; }
} //. Person
Ở đây biến #counter
được sử dụng để đếm số lượng các object
tạo ra từ class Person
trong suốt thời gian vận hành chương trình, và thường được gọi là thuộc tính static
. Còn phương thức #increaseCounter
được sử dụng để tăng biến đếm. Các yếu tố static
như thế này này có thể được định nghĩa private
và chỉ khả dụng trong nội bộ class Person
hoặc để mở public
cho code bên ngoài sử dụng nếu cần thiết.
Package Constant
Trong Ada
thì chúng ta có code định nghĩa của package
có thể được xem là tương đương với code định nghĩa class
trong Java
, JavaScript
, v.v... Tuy nhiên, ở khía cạnh khác thì package
của Ada
cũng có thể được nhìn nhận là thư viện library
giống với C
. Và vì vậy nên trong tệp cấu hình package.ads
thì chúng ta còn có thể định nghĩa các hằng constant
để lưu các giá trị tĩnh, không thay đổi, và có thể để mở public
hoặc ẩn private
.
package Person is MAX_AGE : constant Integer := 1001; -- ... private -- ... end Person;
Và như vậy là chúng ta đã có static constant
nếu theo cách gọi của các ngôn ngữ OOP
phổ biến.
with Ada.Text_IO; use Ada.Text_IO;
with Person; use Person; procedure Main is --
begin Put_Line (Integer'Image (Person.MAX_AGE));
end Main;
Variable & Method
Các biến static variable
thì cần được định nghĩa ở nơi có thể nhận tương tác là các phương thức static method
và vì vậy nên Ada
yêu cầu định nghĩa trong tệp package-body.adb
. Và các phương thức static method
thực ra vẫn được định nghĩa như bình thường bởi điểm quan trọng là ở thao tác phát động phương thức, chúng ta không tham chiếu từ object
mà là từ tên package
.
with Ada.Text_IO; use Ada.Text_IO; package body Person is Id : Integer := -1; procedure IncreaseId is -- local begin Id := Id + 1; Put_Line ("Person Id: " & Integer'Image (Id)); end IncreaseId; -- ... end Person;
Và như vậy hiển nhiên là chúng ta đang có các static variable
được xem như mặc định là private
và nếu muốn code bên ngoài có thể đọc được giá trị thì chúng ta sẽ phải cung cấp một static method
để hỗ trợ truy xuất.
with Ada.Text_IO; use Ada.Text_IO;
with Person; use Person; procedure Main is -- local
begin Person.IncreaseId; -- Person Id: 0 Person.IncreaseId; -- Person Id: 1 Person.IncreaseId; -- Person Id: 2 Person.IncreaseId; -- Person Id: 3 Person.IncreaseId; -- Person Id: 4 Person.IncreaseId; -- Person Id: 5 Person.IncreaseId; -- Person Id: 6 Person.IncreaseId; -- Person Id: 7 Person.IncreaseId; -- Person Id: 8 Person.IncreaseId; -- Person Id: 9
end Main;
Suspend Sub-Series
Như vậy là chúng ta đã điểm qua đầy đủ các khía cạnh của OOP
được hỗ trợ bởi Ada
và đã có rất đầy đủ kiến thức về mặt cú pháp của ngôn ngữ để tự tìm hiểu thêm về các công cụ khác của Ada
ở cấp độ thư viện library level
. Trước đó thì mình cũng đã giới thiệu sơ lược và trích dẫn các liên kết tham khảo tới các package
trong thư viện tiêu chuẩn standard library
của Ada
, và cũng đã giới thiệu nhóm công cụ hỗ trợ lập trình đa nhiệm multi-tasking
.
Tuy nhiên, sau khi duyệt lại các bài viết trong Sub-Series Procedural
ở lượt tổng kết và điều chỉnh lại nội dung thì mình đã lược bỏ bớt phần giới thiệu sơ lược về các công cụ hỗ trợ lập trình đa nhiệm. Lý do là bởi vì các công cụ này được xây dựng và cung cấp với cú pháp bắt buộc ở dạng OOP
và không phù hợp với trọng tâm của Sub-Series Procedural
. Vì vậy nên ở đây mình xin tạm trích dẫn lại liên kết tham khảo nhóm công cụ multi-tasking
từ tài liệu hướng dẫn của GNAT
tại learn.adacore.com
.
Sub-Series OOP + Ada
này sẽ được dừng lại ở đây bởi đã bổ sung đủ kiến thức căn bản về cú pháp của Ada
, còn về việc áp dụng OOP
và thực hiện một mini project
thì chúng ta sẽ để dành cho Sub-Series tiếp theo.
(chưa đăng tải) [Object-Oriented + Java] Bài 1 - Hello, Java !