Hạ Cánh Nơi Mô Hình Lập Trình Khai Báo
Vừa xem xong tập đầu tiên của bộ phim dài tập nên tôi lại tiếp tục ngồi viết cho anh em về phần tiếp theo của mô hình lập trình.
Tổng kết lại phần 1: ngoài OOP ra thì còn gì nữa nhỉ?, Anh em đã hiểu nôm na được mô hình lập trình là gì, mô hình lập trình mệnh lệnh là thế nào, OOP nằm đâu trong thế giới mô hình lập trình này. Vậy hôm nay tôi sẽ hạ cánh chuỗi bài mô hình lập trình (Nói cho oai chứ được 2 bài thôi) là về mô hình lập trình khai báo (Declarative programming paradigm).
Mô hình lập trình khai báo là gì?
Cho 2 nhóm mô hình đứng gần nhau cho dễ so sánh:
- Imperative programming: telling the “machine” how to do something, and as a result what you want to happen will happen.
- Declarative programming: telling the “machine” what you would like to happen, and let the computer figure out how to do it.
Khác với mô hình lập trình mệnh lệnh thì mô hình lập trình khai báo được hiểu nôm na là anh em mình sẽ nói cho máy tính biết rằng mình muốn cái gì và sau đó máy tính sẽ tìm cách thực hiện nó cho mình.
Định nghĩa là thế rồi nhưng nói ra được điều mình muốn cho máy hiểu cũng đâu phải dễ, ví thế các ngôn ngữ lập trình được sinh ra làm cầu nối cho anh em chúng ta nói chuyện với máy tính.
Mô hình lập trình này anh em cũng gặp nhiều chỉ là anh em ít gọi tên nó ra thôi. Ví dụ một câu lệnh SQL anh em có lẽ gặp hàng ngày.
SELECT CustomerName FROM Customers
WHERE Country='Korean';
Trong bối cảnh dịch COVID-19 hoành hành thể này thì có lẽ đây là một câu lệnh sẽ dùng thường xuyên. Với cú pháp đơn giản trên anh em bảo với máy tính rằng là tôi muốn lấy ra tên những đồng chí khách hàng có quốc tịch là Hàn Quốc. Thế là anh em chả cần quan tâm nó dùng for hay while, if hay else , DBMS sẽ lo việc đó cho anh em, đưa ra danh sách tên các đồng chí đó một cách chính xác và nhanh chóng nhất.
Trên chỉ là một ví dụ nhỏ cho anh em dễ tưởng tượng và nóng não thôi để cùng tôi tìm hiểu tiếp về nhóm mô hình này.
Nhóm mô hình lập trình khai báo có những mô hình lập trình nào?
Có 3 mô hình phổ biến trong nhóm mô hình này:
- Mô hình lập trình logic (Logic programming paradigms)
- Mô hình lập trình chức năng (Functional programming paradigms)
- Mô hình lập trình hướng dữ liệu (Database/Data driven programming approach)
Mô hình lập trình logic/Logic programming paradigms
Mô hình này tôi ít khi sử dụng nên không thể chia sẻ được cho anh em nhiều về điều. Mô hình logic thường được sử dụng để giải quyết các bài toán logic như là các câu đố. Trong lập trình logic này thì người ta sẽ tạo ra một thế giới đóng, tức là lập trình viên phải cung cấp cho máy tính về các điều kiện tiên đề, các dữ kiện của bài toán, ... từ đó máy tính sẽ tìm cách giải bài toán trong thế giới đóng đó để đưa ra kết quả.
Tưởng chừng mô hình phức tạp này khá mới và vừa được ứng dụng được trong AI nhưng thực ra mô hình này đã được phát triển vào những năm 1972. Nhưng vì thời kỳ trước đây máy tính còn chưa phát triển, các bộ vi xử lý chưa đủ mạnh nên mô hình này ít được áp dụng. Nhưng với các công nghệ tiến bộ hiện nay thì việc sử dụng mô hình này ngày càng được quan tâm.
Ví dụ bài toán tháp Hà Nội viết bằng Prolog
hanoi(N):- move(N, left, centre, right).
move(0, _, _, _):-!.
move(N, A, B, C):-
M is N-1,
move(M, A, C, B), inform(A, B), move(M, C, B, A).
inform(X, Y):-
write([move, a, disc, from, the, X, pole, to, the, Y, pole]),
nl.
Ngôn ngữ lập trình logic phổ biến:
- Prolog
Mô hình lập trình chức năng/Functional programming paradigms
Một thế lực mới đang được hỗ trợ mạnh ở hiện tại để cạnh tranh chức vô địch với OOP chính là đây. Mô hình lập trình chức năng (Functional programming) là một phương pháp lập trình dựa trên các hàm toán học (mathematical functions), tránh việc thay đổi giá trị của dữ liệu. Nó có nhiều lợi ích như: các khối xử lý độc lập dễ tái sử dụng, thuận lợi cho việc thay đổi logic hoặc tìm lỗi chương trình.
Trước khi làm quen với mô hình lập trình này chắc bạn hãy làm sạch não khỏi các keyword thường sử dụng trong các mô hình mệnh lệnh như for, while, var,... Vì với mô hình này anh em cần có cách tiếp cận bài toán khác đi. Lập trình chức năng xét về lý tưởng thì chỉ có hàm và chuỗi các hàm thôi. Không lệnh gán, không cần tới các biến, không lưu giữ trạng thái toàn cục. Trong lập trình chức năng anh em biến hoá chương trình như một môn võ công, với các chiêu thức là các hàm, anh em cần phối hợp chúng lại để giải quyết được bài toàn và hiệu quả tốt nhất. Anh em có thể tung chiêu các functions qua lại, nhận vào function, nhả ra function, lồng ghép, xâu chuỗi, biến hóa chúng theo mọi cách có thể nghĩ ra.
Giống như OOP, mô hình lập trình chức năng cũng có những đặc trưng của nó.
Đầu tiên là tính bất biến(Immutable): cái nào đã khai báo một lần thì mãi mãi như vậy, không bao giờ thay đổi nữa. Các biến hoặc đối tượng trong kịch bản Functional Programming nếu có thì phải immutable.
Ví dụ trong Javascript
const person = Object.freeze({
name: 'Anh',
age: 28
});
Thứ hai là tính thuần khiết (Purity): tất cả các hàm đều phải là pure function, không có hiệu ứng phụ (side effect), không được tác động lên bất cứ giá trị nào bên ngoài nó, cũng nói không với chỉnh sửa tham số input. Vì dựa trên hàm toán học nên với mỗi tập giá trị đầu vào nhất định, luôn có một và chỉ một kết quả trả về tương ứng.
Dưới đây là một số hàm không thuần khiết nằm trong Javascript:
- Math.random
- Date.now
Hàm thuần khiết kinh điển là đây:
const add = (a, b) => {
return a + b;
};
Hiện nay có các ngôn ngữ lập trình chức năng phổ biến sau:
- JavaScript : developed by Brendan Eich
- Haskwell : developed by Lennart Augustsson, Dave Barton
- Scala : developed by Martin Odersky
- Erlang : developed by Joe Armstrong, Robert Virding
- Lisp : developed by John Mccarthy
- ML : developed by Robin Milner
- Clojure : developed by Rich Hickey
Mô hình lập trình hướng dữ liệu (Database/Data driven programming approach)
Mô hình lập trình này dựa trên dữ liệu và luồng hoạt động của nó. Ở mô hình này thay vì cung cấp các bước để thực hiện chương trình thì anh em cung cấp cho nó dữ liệu cần lấy và các xử lý cần thiết.
Với một doanh nghiệp thì cơ sở dữ liệu là nguồn tài nguyên quan trọng, vì thể để đảm bảo tính ổn định, nhanh chóng cũng như xử lý được với kho dữ liệu khổng lồ thì các hệ thống cơ sở dữ liệu đều được cung cấp ngôn ngữ lập trình phù hợp dành riêng cho nó. Ví dụ như ngôn ngữ SQL dành cho như hệ thống cơ sở dữ liệu có cấu trúc. Và để làm việc với ngôn ngữ này anh em cần nắm được mô hình lập trình hướng dữ liệu.
Ví dụ tạo một bảng với ngôn ngữ SQL:
CREATE DATABASE databaseAddress;
CREATE TABLE Addr (
PersonID int,
LastName varchar(200),
FirstName varchar(200),
Address varchar(200),
City varchar(200),
State varchar(200)
);
Kết luận
Bài viết vừa chỉ lướt qua cho anh em đồng đạo về các mô hình lập trình phổ biến hiện nay, nội dung bài viết như là cưỡi ngựa xem hoa cho anh em xem mặt các thiếu nữ mà mình thấy ưng ý thôi. Còn để tìm hiểu và tìm được người thương cho từng bài toán cụ thể thì tôi sẽ cố gắng trình bày cho những bài kế tiếp.
Chào thân ái và quyết thắng.