Loading Now

Ngoài OOP thì còn gì nữa nhỉ?

Ngay từ thời ngồi ghế nhà trường thì tôi đã được nghe OOP (Object-oriented programming), được anh em hiểu nôm na là lập trình hướng đối tượng. Rồi sau đó tôi chọn ngành lập trình hệ thống nhúng thì lại được biết thêm một thằng nữa POP (Procedure Oriented Programming), hiểu nôm na là lập trình hướng thủ tục/cấu trúc. Tôi băn khoăn chúng là gì, ngoài hai hướng đó thì còn có những hướng đi nào nữa không. Bài viết hôm nay tôi sẽ cùng các bạn làm rõ hơn về điều đó.

Programming Paradigms

Tôi chưa tìm được từ sát nghĩa trong tiếng việt cho từ này, tạm dịch là mô hình lập trình

Vậy mô hình lập trình là gì?

Không có định nghĩa chính thức cho nó nhưng mọi người hiểu rằng thuật ngữ này được sử dụng để nói đến một phong cách lập trình (style of programming). Nó không dùng cho một ngôn ngữ lập trình cụ thể mà nó đề cập đến cách bạn lập trình, cách bạn giải quyết vấn đề (solve some problem).

Có nhiều ngôn ngữ lập trình hiện nay nào là C, C++, Java, C#, PHP, javascript,… nhưng tất cả chúng khi xây dựng đều phải chọn lựa cho mình một hoặc vài chiến lược (strategy) và chiến lược đó là mô hình lập trình. Còn ngôn ngữ A chọn mô hình B nào thì hồi sau sẽ rõ. 

Có bao nhiêu loại mô hình lập trình?

Câu trả lời là có rất nhiều, nhưng bài viết này chỉ viết đến các mô hình lập trình phổ biến hiện nay thôi. 

Nguồn: www.geeksforgeeks.org

Có thể chia mô hình lập trình thành 2 nhóm như sau:

Nhóm 1: Mô hình lập trình mệnh lệnh (Imperative programming paradigm)

Cũng giống như các thuật ngữ trong bài viết này thì không có định nghĩa chính thức cho nó nhưng tôi sẽ cố gắng tìm những định nghĩa mà theo tôi là dễ hiểu nhất và dễ so sánh được với nhóm còn lại.

Imperative Programming: telling the “machine” how to do something, and as a result what you want to happen will happen.

Dịch nôm na lập trình mệnh lệnh là bạn bảo máy tính hãy làm việc A, B, C … X, Y, Z đi. Kết quả thì bạn nghĩ ra trong đầu rồi, giờ là xem máy có trả ra kết quả như bạn muốn không.

Theo kinh nghiệm của bản thân tôi thì đa số là không, sau khi debug n lần thì mới được như ý muốn. Cái này do trí não con người cao siêu quá chứ không phải máy tính chạy sai đâu.

Nhóm này có 3 loại nhỏ mà bạn gặp hàng ngày, có thể là hàng năm, từ khi bạn bắt đầu học lập trình luôn ấy chứ. 

Lập trình hướng cấu trúc (Procedure Oriented Programming/Procedural programming paradigm)

Đây chính là con đẻ của mô hình lập trình mệnh lệnh, kế thừa hoàn toàn nguyên lý của mô hình lập trình mệnh lệnh. Ở mô hình này bạn sẽ sử dụng 3 cấu trúc chính để làm việc:

  1. Tuần tự: Các câu lệnh được thực hiện theo trình tự nhất định (Đa số là trên xuống dưới, thỉnh thoảng gặp thằng goto trong C thì nó mới hay chạy lung tung khó kiểm soát thôi nên lời khuyên của chuyên gia là bạn quên từ khoá này luôn đi)
  2. Quyết định: Chương trình chạy phụ thuộc vào điều kiện nhất định nào đó. (If, Else là từ khoá đại diện của cái này)
  3. Vòng lặp: Các mệnh lệnh được lặp đi lặp lại khi điều kiện nào đó vẫn được thoả mãn (For, While đây chứ đâu)

Với 3 yếu tố cơ bản trên bạn kết hợp với việc phân tích theo kiểu Top-Down để xây dựng chương trình mong muốn. Tức là bạn chia chương trình thành các hàm (function) chính, rồi từ hàm chính lại chia nhỏ ra các hàm khác sao cho chia nhỏ đến mức mà các hàm thực hiện các công việc cụ thể nhất. 

Ví dụ về bài toán sắp xếp:

// C program for insertion sort 
#include <math.h> 
#include <stdio.h> 
  
/* Function to sort an array using insertion sort*/
void insertionSort(int arr[], int n) 
{ 
    int i, key, j; 
    for (i = 1; i < n; i++) { 
        key = arr[i]; 
        j = i - 1; 
  
        /* Move elements of arr[0..i-1], that are 
          greater than key, to one position ahead 
          of their current position */
        while (j >= 0 && arr[j] > key) { 
            arr[j + 1] = arr[j]; 
            j = j - 1; 
        } 
        arr[j + 1] = key; 
    } 
} 
  
// A utility function to print an array of size n 
void printArray(int arr[], int n) 
{ 
    int i; 
    for (i = 0; i < n; i++) 
        printf("%d ", arr[i]); 
    printf("\n"); 
} 
  
/* Driver program to test insertion sort */
int main() 
{ 
    int arr[] = { 12, 11, 13, 5, 6 }; 
    int n = sizeof(arr) / sizeof(arr[0]); 
  
    insertionSort(arr, n); 
    printArray(arr, n); 
  
    return 0; 
} 

Ngôn ngữ lập trình hướng cấu trúc phổ biến:

  • C
  • Pascal (Nỗi ám ảnh của không ít bạn thời trung học)
  • C++

Lập trình hướng đối tượng (Object-oriented programming)

Không cần phải giới thiệu vì mô hình này là mô hình lập trình phổ biến nhất hiện nay rồi. Anh em nào ra trường cũng được đặt cho một câu hỏi phỏng vấn kinh điển “Em hãy nêu các đặc trưng của lập trình hướng đối tượng?”

Ở đây tôi xin nêu quan điểm của tôi về câu hỏi trên. Tôi thấy lên mạng mà search câu trả lời cho câu hỏi trên thì lúc nào cũng có đáp án là 4 tính chất: bao đóng, kế thừa, đa hình và trừu tượng. Kèm theo giải thích cho từng ý đó. Còn tôi thì thích các giải thích theo anh Microsoft đính kèm theo link này: (Các bạn tự dịch nhé) https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/object-oriented-programming

Sau đây ví dụ về class diagram thường được sử dụng trong phát triển theo mô hình OOP

Ngôn ngữ lập trình hướng đối tượng phổ biến:

  • C++
  • C#
  • Java

Ba đại ca lâu năm của ngành phát triển phần mềm bảo sao OOP không thành mô hình phổ biến nhất được. 

Ở đây bạn có thể nhận thấy rằng lập trình cấu trúc cũng có C++, lập trình hướng đối tượng cũng có C++. Vậy là sao nhỉ?

Thuật ngữ ở đây là multi-paradigm, nghĩa là ngôn ngữ C++ hỗ trợ đa mô hình lập trình. Bạn có thể lựa chọn là lập trình theo hướng cấu trúc hoặc là lập trình theo hướng đối tượng trên ngôn ngữ lập trình này. Lời khuyên là nên chọn 1 trong 2 thôi, đừng kết hợp cả 2 là hơi mệt cho mấy anh em sau này đi đọc lại code của bạn đó. 

Với mô hình lập trình này thì anh em có thể tìm hiểu thêm về Object Oriented Architecture và các Object-Oriented Design Patterns.

Lập trình song song (Parallel processing approach)

Với mô hình này thì bạn phải chia nhỏ bài toán làm sao có thể để tính toán song song trên nhiều bộ xử lý được. 

Cái mà anh em hay gặp nhất là kỹ thuật multithreading và multiprocessing nhưng ở đây mình nói đến bài toán tổng quát hơn. Khi mà định hướng ban đầu  việc giải quyết bài toán đã là chia nhỏ bài toàn làm sao có thể làm song song được.

Anh em thao khảm ví dụ kinh điển này nhé.

https://medium.com/@saadmahmud14/parallel-programming-with-cuda-tutorial-part-2-96f6eaea2832

Ngôn ngữ lập trình song song phổ biến:

  • NESL
  • C
  • C++

Với xu hướng phát triển hiện tại khi mà AI, Machine learning, Big Data phát triển thì mô hình lập trình song song cũng đang có sự phát triển rất mạnh mẽ. Các công ty công nghệ hàng đầu đã cung cấp các giải pháp để hỗ trợ cho việc lập trình song song này, chẳng hạn OpenCL framework, CUDA platform (Nvidia). Tạo điều kiện thuận lợi cho anh em lập trình viên có thể xây dựng ứng dụng theo mô hình lập trình song song, tận dụng tài nguyên tính toán của hàng trăm đến hàng nghìn core trên GPU, FPGA.

Thế Javascript, Python, SQL cũng là các ngôn ngữ lập trình phổ biến sao bài này chưa thấy nhắc đến nhỉ. Chúng nằm ở đâu trong các mô hình này?

Tạm kết ở đây. Hẹn anh em ở phần 2 chúng ta sẽ cũng tìm hiểu về mô hình lập trình khai báo (declarative programming) sẽ có câu trả lời cho anh em. 

Bài viết tham khảo:

https://www.geeksforgeeks.org/introduction-of-programming-paradigms/  

Post Comment

Contact