PL/SQL - Lập trình Hướng đối tượng

Xin chào các bạn đang học lập trình! Hôm nay, chúng ta sẽ bắt đầu một chuyến hành trình thú vị vào thế giới Lập trình Hướng đối tượng (OOP) trong PL/SQL. Đừng lo lắng nếu bạn mới bắt đầu học lập trình - tôi sẽ là người hướng dẫn thân thiện của bạn, giải thích mọi thứ từng bước. Vậy, chúng ta cùng bắt đầu nhé!

PL/SQL - Object Oriented

Lập trình Hướng đối tượng là gì?

Trước khi bắt đầu, hãy hiểu về OOP. Hãy tưởng tượng bạn đang xây dựng một ngôi nhà bằng các khối Lego. Mỗi khối đại diện cho một đối tượng, và bạn có thể kết hợp các khối này theo nhiều cách khác nhau để tạo ra các cấu trúc phức tạp hơn. Đó chính là điều OOP làm trong lập trình - nó cho phép chúng ta tạo ra và manipulates các đối tượng đại diện cho các thực thể thế giới thực.

Tạo một Đối tượng

Bây giờ, hãy học cách tạo (hoặc "khai sinh") một đối tượng trong PL/SQL. Hãy nghĩ về nó như việc mang một nhân vật Lego sống động trong thế giới lập trình của bạn!

CREATE OR REPLACE TYPE person AS OBJECT (
name VARCHAR2(50),
age NUMBER,
MEMBER FUNCTION say_hello RETURN VARCHAR2
);

CREATE OR REPLACE TYPE BODY person AS
MEMBER FUNCTION say_hello RETURN VARCHAR2 IS
BEGIN
RETURN 'Xin chào, tên tôi là ' || name || ' và tôi năm ' || age || ' tuổi.';
END;
END;

DECLARE
john person;
BEGIN
john := person('John Doe', 30);
DBMS_OUTPUT.PUT_LINE(john.say_hello());
END;

Trong ví dụ này, chúng ta đã tạo một kiểu đối tượng person với hai thuộc tính (nameage) và một phương thức (say_hello). Sau đó, chúng ta đã khai sinh một đối tượng john và gọi phương thức say_hello của nó.

Phương thức Thành viên

Phương thức thành viên giống như những kỹ năng đặc biệt mà các đối tượng của chúng ta sở hữu. Hãy thêm một phương thức khác vào đối tượng person:

CREATE OR REPLACE TYPE person AS OBJECT (
name VARCHAR2(50),
age NUMBER,
MEMBER FUNCTION say_hello RETURN VARCHAR2,
MEMBER PROCEDURE have_birthday
);

CREATE OR REPLACE TYPE BODY person AS
MEMBER FUNCTION say_hello RETURN VARCHAR2 IS
BEGIN
RETURN 'Xin chào, tên tôi là ' || name || ' và tôi năm ' || age || ' tuổi.';
END;

MEMBER PROCEDURE have_birthday IS
BEGIN
age := age + 1;
DBMS_OUTPUT.PUT_LINE(name || ' bây giờ ' || age || ' tuổi.');
END;
END;

DECLARE
john person;
BEGIN
john := person('John Doe', 30);
john.have_birthday();
DBMS_OUTPUT.PUT_LINE(john.say_hello());
END;

Ở đây, chúng ta đã thêm một thủ tục have_birthday rằng tăng tuổi của người lên 1. Nó giống như việc cho nhân vật Lego của chúng ta có khả năng庆祝 sinh nhật!

Sử dụng Phương thức MAP

Phương thức MAP được sử dụng để so sánh các đối tượng. Nó giống như việc cấp cho các đối tượng của chúng ta một thẻ ID đặc biệt giúp chúng ta sắp xếp chúng. Hãy xem nó hoạt động như thế nào:

CREATE OR REPLACE TYPE person AS OBJECT (
name VARCHAR2(50),
age NUMBER,
MAP MEMBER FUNCTION get_id RETURN NUMBER
);

CREATE OR REPLACE TYPE BODY person AS
MAP MEMBER FUNCTION get_id RETURN NUMBER IS
BEGIN
RETURN age;
END;
END;

DECLARE
john person := person('John Doe', 30);
jane person := person('Jane Smith', 25);
BEGIN
IF john > jane THEN
DBMS_OUTPUT.PUT_LINE(john.name || ' lớn hơn');
ELSE
DBMS_OUTPUT.PUT_LINE(jane.name || ' lớn hơn');
END IF;
END;

Trong ví dụ này, chúng ta sử dụng age làm ID để so sánh. Nó giống như so sánh các nhân vật Lego dựa trên chiều cao của chúng!

Sử dụng Phương thức ORDER

Phương thức ORDER là một cách khác để so sánh các đối tượng, nhưng nó cho chúng ta nhiều sự linh hoạt hơn phương thức MAP. Nó giống như việc có một người thẩm phán đặc biệt để so sánh các nhân vật Lego của chúng ta:

CREATE OR REPLACE TYPE person AS OBJECT (
name VARCHAR2(50),
age NUMBER,
ORDER MEMBER FUNCTION compare(p person) RETURN INTEGER
);

CREATE OR REPLACE TYPE BODY person AS
ORDER MEMBER FUNCTION compare(p person) RETURN INTEGER IS
BEGIN
IF self.age < p.age THEN
RETURN -1;
ELSIF self.age > p.age THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END;
END;

DECLARE
john person := person('John Doe', 30);
jane person := person('Jane Smith', 30);
BEGIN
IF john > jane THEN
DBMS_OUTPUT.PUT_LINE(john.name || ' lớn hơn');
ELSIF john < jane THEN
DBMS_OUTPUT.PUT_LINE(jane.name || ' lớn hơn');
ELSE
DBMS_OUTPUT.PUT_LINE('Họ cùng tuổi');
END IF;
END;

Phương thức này cho phép chúng ta định nghĩa logic so sánh tùy chỉnh. Nó đặc biệt hữu ích khi chúng ta muốn so sánh các đối tượng dựa trên nhiều thuộc tính.

Kế thừa cho Đối tượng PL/SQL

Kế thừa giống như việc tạo ra một cây gia đình cho các đối tượng của chúng ta. Chúng ta có thể tạo ra các kiểu đối tượng mới kế thừa các thuộc tính và phương thức từ các đối tượng hiện có. Hãy xem cách nó hoạt động:

CREATE OR REPLACE TYPE employee UNDER person (
job_title VARCHAR2(50),
salary NUMBER,
MEMBER FUNCTION get_annual_salary RETURN NUMBER
);

CREATE OR REPLACE TYPE BODY employee AS
MEMBER FUNCTION get_annual_salary RETURN NUMBER IS
BEGIN
RETURN salary * 12;
END;
END;

DECLARE
emp employee := employee('Alice Johnson', 35, 'Manager', 5000);
BEGIN
DBMS_OUTPUT.PUT_LINE(emp.say_hello());
DBMS_OUTPUT.PUT_LINE('Lương hàng năm: $' || emp.get_annual_salary());
END;

Ở đây, employee là con của person, kế thừa các thuộc tính và phương thức của nó trong khi thêm các thuộc tính và phương thức riêng. Nó giống như việc tạo ra một loại nhân vật Lego đặc biệt có thể làm mọi thứ mà nhân vật bình thường có thể làm, cộng thêm nhiều khả năng hơn!

Đối tượng Trừu tượng trong PL/SQL

Đối tượng trừu tượng giống như một bản vẽ cho các đối tượng khác. Chúng xác định một cấu trúc nhưng không thể được khởi tạo trực tiếp. Hãy tạo một đối tượng trừu tượng:

CREATE OR REPLACE TYPE shape AS OBJECT (
name VARCHAR2(50),
MEMBER FUNCTION get_area RETURN NUMBER
) NOT INSTANTIABLE NOT FINAL;

CREATE OR REPLACE TYPE circle UNDER shape (
radius NUMBER,
OVERRIDING MEMBER FUNCTION get_area RETURN NUMBER
);

CREATE OR REPLACE TYPE BODY circle AS
OVERRIDING MEMBER FUNCTION get_area RETURN NUMBER IS
BEGIN
RETURN 3.14159 * radius * radius;
END;
END;

DECLARE
c circle := circle('My Circle', 5);
BEGIN
DBMS_OUTPUT.PUT_LINE('Diện tích của ' || c.name || ': ' || c.get_area());
END;

Trong ví dụ này, shape là một đối tượng trừu tượng xác định một cấu trúc chung cho tất cả các hình dạng. circle là một thực hiện cụ thể của shape. Nó giống như việc có một hướng dẫn Lego chung (đối tượng trừu tượng) và sau đó tạo ra các mô hình Lego cụ thể dựa trên nó!

Và đó là tất cả! Chúng ta đã bao gồm các nguyên tắc cơ bản của Lập trình Hướng đối tượng trong PL/SQL. Nhớ rằng, thực hành là chìa khóa để thành thạo, vì vậy đừng ngần ngại thử nghiệm với các khái niệm này. Chúc các bạn may mắn trong việc lập trình!

Credits: Image by storyset