Phân biệt các mô hình lập trình phần mềm
Khi bạn là một lập trình viên mới, các mô hình lập trình không quan trọng lắm. Nhưng khi bạn bắt tay vào xây dựng các chương trình và phần mềm phức tạp, thì điều quan trọng là phải hiểu mô hình lập trình nào phù hợp nhất cho dự án. Trước khi chúng ta bắt đầu, điều quan trọng là phải biết chính xác mô hình là gì. Theo nhiều định nghĩa được trích dẫn, một mô hình là “một tập hợp các giả định, khái niệm, các giá trị và các thực tiễn hình thành từ cách nhìn thực tế do cộng đồng chia sẻ chúng“.
Trong bài viết này, chúng tôi sẽ thảo luận về các mô hình trong lập trình (Programming Paradigm) chính, với trọng tâm đặc biệt về mô hình lập trình hướng thủ tục và lập trình hướng đối tượng (OOP).
Mô hình lập trình (Programming Paradigm) là cách phân loại các ngôn ngữ lập trình dựa trên đặc điểm của chúng. Các ngôn ngữ lập trình có thể phân loại vào nhiều mô hình lập trình.
Một số mô hình lập trình thông dụng:
- Lập trình mệnh lệnh (imperative programming) là một mẫu hình lập trình sử dụng câu lệnh để thay đổi trạng thái của chương trình.
- Lập trình hướng thủ tục thực hiện nhóm các câu lệnh trong các thủ tục/các hàm
- Lập trình hướng đối tượng thực hiện code tạo ra các đối tượng để trừu tượng hóa các đối tượng,
- Lập trình khai báo (declarative programming) trong đó lập trình viên khai báo các thuộc tính của kết quả mong muốn, nhưng không thực hiện tính toán nó.
- Lập trình hướng chức năng (functional programming): kêt quả mong muốn là được khai báo như dãy giá trị của chức năng ứng dụng.
- Lập trình logic (logic programming): dựa trên logic toán trong các mối quan hệ và các suy luận
- Lập trình tính toán (mathematical programming) mà kết quả mong muốn là giải các bài toán tối ưu
Ví dụ: so sánh lập trình mệnh lệnh và lập trình khai báo với ngôn ngữ C#, cho một tập hơp, tìm các số không chia hết cho 2:
- Với Lập trình mệnh lệnh, sử dụng các câu lệnh để duyệt qua danh sách các phần tử
List collection = new List { 1, 2, 3, 4, 5 };
List results = new List();
foreach(var num in collection)
{
if (num % 2 != 0)
results.Add(num);
}
- Với lập trình khai báo
List collection = new List { 1, 2, 3, 4, 5 };
var results = collection.Where( num => num % 2 != 0);
Lập trình hướng thủ tục là gì?
Lập trình hướng thủ tục (Procedural Programming) có thể là mô hình lập trình đầu tiên mà người lập trình viên mới sẽ học. Về cơ bản, code theo hướng thủ tục là code trực tiếp chỉ dẫn thực hiện hoàn thành một công việc nào đó theo các bước hợp lý. Mô hình này sử dụng cách tiếp cận tuyến tính từ trên xuống, coi dữ liệu và thủ tục là hai thực thể khác nhau. Dựa trên khái niệm về lời gọi đến thủ tục, Lập trình hướng thủ tục chia chương trình thành các thủ tục, còn được gọi các hàm (functions), chỉ đơn giản chứa một loạt các bước sẽ được thực hiện.
Nói một cách đơn giản, Lập trình hướng thủ tục liên quan đến việc viết ra một danh sách các chỉ dẫn để nói với máy tính những gì cần làm từng bước để hoàn thành nhiệm vụ.
Các tính năng chính của lập trình hướng thủ tục
- Các chức năng được xác định trước: Một chức năng được xác định trước thường là một chỉ dẫn được xác định bởi một tên. Thông thường, các hàm được xác định trước được tích hợp vào các ngôn ngữ lập trình bậc cao, nhưng chúng thường được kế thừa từ các thư viện thay vì chương trình. Một ví dụ về hàm được xác định trước là ‘charAt ()’, tìm kiếm vị trí ký tự trong chuỗi.
- Biến cục bộ : Biến cục bộ là biến được khai báo trong cấu trúc chính của phương thức và được giới hạn trong phạm vi cục bộ mà nó được đưa ra. Biến cục bộ chỉ có thể được sử dụng trong phương thức được định nghĩa và nếu nó được sử dụng bên ngoài phương thức đã xác định, code sẽ không chạy được.
- Biến toàn cục: Biến toàn cục là biến được khai báo bên ngoài mà mọi hàm khác có thể sử dụng nó. Do đó, các biến toàn cục có thể được sử dụng trong tất cả các hàm, không giống như biến cục bộ.
- Tính mô đun : Tính mô đun là quá trình phân chia một chương trình máy tính thành các chương trình con riêng biệt. Một mô đun là một thành phần phần mềm riêng biệt. Nó thường được sử dụng trong nhiều ứng dụng và chức năng với các thành phần khác của hệ thống.
- Truyền tham số: Truyền tham số là một cơ chế được sử dụng để truyền tham số cho các hàm, chương trình con hoặc thủ tục. Việc truyền tham số có thể được thực hiện thông qua ‘truyền theo giá trị’, ‘truyền theo tham chiếu’, ‘truyền theo kết quả’, ‘truyền theo kết quả giá trị’ và ‘truyền theo tên’.
Ưu điểm và nhược điểm của lập trình hướng thủ tục
Lập trình thủ tục đi kèm với các ưu và nhược điểm riêng, một số trong đó được liệt kê dưới đây.
Ưu điểm
- Lập trình hướng thủ tục là tuyệt vời cho lập trình đa mục đích.
- Sự đơn giản được mã hóa cùng với việc dễ dàng thực hiện các trình biên dịch và trình thông dịch
- Một lượng lớn sách và tài liệu khóa học trực tuyến đã viết các thuật toán theo hướng thủ tục, giúp bạn dễ dàng học.
- Mã nguồn là linh động (portable), do đó, nó cũng có thể được sử dụng để nhắm mục tiêu một CPU khác
- Mã có thể được sử dụng lại trong các phần khác nhau của chương trình, mà không cần phải sao chép nó
- Thông qua kỹ thuật lập trình hướng thủ tục, yêu cầu bộ nhớ cũng bị giảm
- Luồng chương trình có thể được theo dõi dễ dàng
Nhược điểm
- Code chương trình lớn khó viết hơn, khó bảo trì, lỗi nhiều hơn.
- Code thủ tục thường không thể sử dụng lại được, điều này có thể đặt ra yêu cầu tạo viết lại mã nếu cần sử dụng trong ứng dụng khác
- Khó mô tả với các đối tượng trong thế giới thực
- Chương trình hướng thủ tục tập trung vào thao tác thay vì dữ liệu, điều này có thể gây ra sự cố trong một số trường hợp nhạy cảm với dữ liệu
- Dữ liệu được hiển thị cho toàn bộ chương trình, làm cho việt bảo mật dữ liệu không được tốt lắm.
Có nhiều loại mô hình lập trình khác nhau như chúng tôi đã đề cập trước đây, không có gì khác ngoài đây là một phong cách lập trình. Điều quan trọng là phải hiểu rằng mô hình không phục vụ cho một ngôn ngữ cụ thể mà là cách viết chương trình. Dưới đây là so sánh giữa lập trình hướng thủ tục và lập trình hướng đối tượng.
Lập trình hướng đối tượng (OOP) là gì?
Lập trình hướng đối tượng (OOP) là một mô hình lập trình dựa trên khái niệm lớp (class) và đối tượng (object). Nó được sử dụng để tổ chức một chương trình phần mềm thành các bản thiết kế mã nguồn đơn giản, có thể tái sử dụng (thường được gọi là các lớp) được sử dụng để tạo các bản sao riêng lẻ của các đối tượng. Vì OOP là một mô hình lập trình, có nhiều ngôn ngữ lập trình hướng đối tượng bao gồm: C++, C#, Java và Python…
Ưu điểm và nhược điểm của lập trình hướng đối tượng
Ưu điểm
- Do tính mô đun và đóng gói, OOP cung cấp sự quản lý dễ dàng
- OOP bắt chước các đối tượng thế giới thực, giúp dễ hiểu hơn
- Vì các đối tượng được chứa hoàn toàn trong chúng nên có thể được sử dụng lại trong các chương trình khác
Nhược điểm
- Các chương trình hướng đối tượng có xu hướng chậm hơn và sử dụng nhiều bộ nhớ
- Quá khái quát
- Các chương trình được xây dựng theo mô hình này có thể mất nhiều thời gian hơn
So sánh Lập trình hướng thủ tục và lập trình hướng đối tượng
Lập trình hướng thủ tục không giống như OOP, nó tập trung vào các bước sẽ được thực hiện để hoàn thành một nhiệm vụ, thay vì tương tác giữa các đối tượng. Các tác vụ được chia thành các chương trình con, biến và cấu trúc dữ liệu. Tại bất kỳ thời điểm nào, các thủ tục này có thể được gọi trong khi thực hiện chương trình.
Lập trình hướng thủ tục | Lập trình hướng đối tượng |
Sử dụng dữ liệu bất biến | Sử dụng dữ liệu có thể thay đổi |
Mở rộng hỗ trợ cho lập trình song song | Không phù hợp với lập trình song song |
Thứ tự thực hiện của các câu lệnh không phải là trọng tâm chính | Trình tự thực hiện của các câu lệnh là rất quan trọng |
Luồng điều khiển được thực hiện bằng các lệnh gọi hàm | Luồng điều khiển được thực hiện thông qua các câu lệnh điều kiện và vòng lặp |
Sử dụng khái niệm đệ quy để tương tác với dữ liệu dạng tập hợp (collection) | Sử dụng khái niệm lặp để tương tác dữ liệu tập hợp |
Không có hiệu ứng lề (side effect) của các hàm của nó | Phương pháp này có thể có hiệu ứng lề |
Trọng tâm trong Lập trình thủ tục là về ‘Bạn đang làm cái gì’ | Trọng tâm trong Lập trình hướng đối tượng là ‘Bạn làm như thế nào’ |
Một hàm hay biểu thức được cho là có hiệu ứng lề (side effect) nếu nó thay đổi một số trạng thái ngoài phạm vi của nó.
Lập trình hướng chức năng là gì?
Một mô hình lập trình được sử dụng nhiều khác là Lập trình hướng chức năng (Functional Programming). Lập trình hướng chức năng khác với cả Lập trình hướng thủ tục và Lập trình hướng đối tượng. Thông qua đó, các thao tác chỉ được thực hiện trên cơ sở các đầu vào được nhập và chúng không dựa vào các biến tạm thời hoặc ẩn.
Ưu điểm
- Lập trình hàm cung cấp một môi trường được bảo vệ
- Trong khi nhiều ngôn ngữ khác yêu cầu một lượng thông tin đáng kể để thực hiện các thao tác đúng cách, lập trình hướng chức năng loại bỏ một lượng lớn code cần thiết để xác định trạng thái
- Vì mô hình này chỉ phụ thuộc vào các đối số đầu vào, không có hiệu ứng lề
Nhược điểm
- Không nên sử dụng lập trình chức năng trong phát triển phần mềm thương mại
- Nó đòi hỏi một lượng lớn bộ nhớ và thời gian
- Nó có thể chứng minh là kém hiệu quả hơn các mô hình lập trình khác
Phần kết luận
Như chúng tôi đã trình bày trong suốt bài viết này, Lập trình hướng thủ tục hướng tới mục đích “Bạn đang làm cái gì” chứ không phải là “Bạn làm như thế nào“. Đó là cách tiếp cận chuẩn được sử dụng trong nhiều ngôn ngữ máy tính như C, Pascal và BASIC. Không có mô hình lập trình hoàn hảo, nhưng điều quan trọng là phải hiểu chính xác từng mô hình lập trình và sẽ đi với nó là loại ngôn ngữ bạn sử dụng và chương trình bạn muốn tạo. Lời khuyên để có kết quả tối đa và lý lịch tốt, bạn nên thành thạo cả ba mô hình lập trình chính này.
Tham khảo thêm
https://en.wikipedia.org/wiki/Programming_paradigm
https://hackr.io/blog/procedural-programming