[Object-Oriented + Ada] Bài 6 – Shared Class Members

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

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.

classPerson{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 !

Nguồn: viblo.asia

Bài viết liên quan

WebP là gì? Hướng dẫn cách để chuyển hình ảnh jpg, png qua webp

WebP là gì? WebP là một định dạng ảnh hiện đại, được phát triển bởi Google

Điểm khác biệt giữa IPv4 và IPv6 là gì?

IPv4 và IPv6 là hai phiên bản của hệ thống địa chỉ Giao thức Internet (IP). IP l

Check nameservers của tên miền xem website trỏ đúng chưa

Tìm hiểu cách check nameservers của tên miền để xác định tên miền đó đang dùn

Mình đang dùng Google Domains để check tên miền hàng ngày

Từ khi thông báo dịch vụ Google Domains bỏ mác Beta, mình mới để ý và bắt đầ