Phân biệt functional programming và procedural programming

Hi there :wave:
Object-Oriented Programming thì em đã hiểu rồi, còn functional programming và procedural programming thì em cứ thấy nó giống nhau, em muốn xin ví dụ và giải thích dễ hiểu tí ạ. Có phải ngôn ngữ gần bậc thấp như C là procedural, còn ngôn ngữ bậc cao kiểu script như PHP, javascript, python, lua, … đều là functional programming?

bạn hãy chia sẻ xem, bạn thấy nó giống nhau như thế nào?

Khi bạn đặt ra giả thuyết gì, cung nên có cơ sở suy luận
bạn đựa vào đâu để đưa ra giả thuyết này?

học mà tự chế ra kiến thức như này thì rất nguy hiểm nha

mình không đi vào câu trả lời của bài viết này, vì trên mạng đã quá nhiều bài viết định nghĩ và ví dụ, không cần phải gõ lại làm gì, gõ lại cũng chưa chắc gì câu cú hay hơn người ta

bạn đọc tài liệu ở đâu và thấy có gì không hiểu thì show lên đây, chứ đừng tự “chế” ra kiến thức rồi chờ người ta sửa sai cho mình

8 Likes

Dạ nếu làm app máy tính bỏ túi, khi lập trình theo tư tưởng OOP thì sẽ viết như này:

class Casio {
    private int result = 0; 

    public void cong(int a) {
        this.result+=a;
    }

    public void tru(int a ) {
        this.result-=a;
    }

    public void nhan(int a) {
        this.result*=a;
    }

    public int chia(int a) {
            this.result = this.result / a;
      }
}

Sử dụng

Casio casio = new Casio();
// (1+1+2)*5/3
casio.cong(1);
casio.cong(1);
casio.cong(2);
casio.nhan(5);
casio.chia(3);

Còn đây là tư duy functional và procedural

function cong(a, b) {
    return a + b;
}

function tru(a, b) {
    // tru 2 so
}

function nhan(a, b) {
    // nhan 2 so
}

function chia(a, b) {
    // chia 2 so
}
//CÓ THỂ DÙNG REST ĐỂ KHÔNG GIỚI HẠN THAM SỐ

Khi sử dụng

chia(nhan(cong(cong(1,1),2), 5), 3)

PP mục đích là giúp chương trình có cấu trúc, nó thường gom các bước hay lặp lại thành những chương trình con, và gọi đoạn chương trình con nhiều lần khi cần.
PP giống như công thức nấu một món ăn vậy.

FP thì có nguyên tắc tổ chức chương trình thành những hàm và các hàm này có đặc điểm

  1. Đầu vào giống nhau sẽ luôn cho đầu ra giống nhau
  2. Hàm chỉ tính toán ra kết quả đầu ra mà không thay đổi các trạng thái khác.
    VD: function cong(a, b) { return a + b; } không thay đổi biến toàn cục, cũng như không thay đổi giá trị của a và b
  3. Hàm không có tác dụng khác ngoài việc trả kết quả.
    VD:
    function cong(a, b) {
    console.log('Kết quả của phép cộng là", a + b); // dòng này là tác dụng ngoài
    return a + b;
    }

Thực hiện nguyên tắc FP giúp các chương trình chạy đồng thời được thuận lợi ko bị lỗi, vì như hàm cong trên, dù bao nhiêu luồng gọi hàm trên cùng a và b đều ra kết quả đúng.

Không phải các ngôn ngữ bậc cao thì sẽ FP mà phần lớn các ngôn ngữ hiện nay đều hỗ trợ multiparadigm chứ không buộc phải theo một nguyên tắc cứng nào.

Anh nghĩ FP cũng chưa chủ đạo vì các ngôn ngữ theo trường phái FP như Haskell, Clojure… đều xếp hạng thấp trong danh mục các ngôn ngữ phổ biến.

C cũng có thể viết theo phong cách FP nếu tuân thủ các nguyên tắc của FP.

3 Likes

Chuẩn luôn ạ. Đây gọi là pure function.


Anh cho em xin code ví dụ về procedural được không ạ. Nếu lập trình web, desktop, mobile có cần học procedural programming không anh?

1 Like

PP có lẽ là dễ hiểu nhất trong 3 cái PP, OOP, và FP

Em cứ xem các ví dụ bài tập trong sách dạy Pascal ý, toàn PP cả.

Nói chung cũng chả có gì để nói nhiều về PP cả, tóm gọn lại “những bước liên quan và lặp lại thì gộp vào 1 chương trình con” để sau này sử dụng lại hay là rõ nghĩa thôi.

2 Likes

Có vẻ như OOP và procedural bị ngược nhỉ? đáng lẽ OOP phải ở cuối dãy tiến hoá🤔

1 Like

Ohm, thực ra hình ảnh mà cậu đưa ra nó không hợp logic lắm đâu :smile:
Machine và Assembly không phải mô thức lập trình, và người vẽ overrate functional programming như sự thay thế của OOP và procedure programming :smile:

6 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?