Lập trình hướng sự kiện (event driven) có gì khác với các kiểu lập trình khác

Cháu chào các chú,

Cháu muốn hỏi là lập trình hướng sự kiện là gì? lập trình hướng sự kiện có gì khác so với các paradigm lập trình khác (cháu cũng không biết rõ nên so sánh với cái gì, có thể là OOP, functional programming, …)

Cháu đang học ngôn ngữ functional programming là pascal, cũng đú trend trên mạng học javascript vài ngày nên bỏ, bây giờ cháu tự học lua nhưng cảm thấy kiểu lập trình hướng sự kiện nó quá khác với cách học pascal trong trường. Cháu cảm giác như nó có một thế lực vô hình nào đó nằm chờ sẵn (listenning) để bắt sự kiện (event) do một cái gì đó phát ra event.

Cháu có đoạn code ngắn viết bằng lua như này không biết là giống kiểu lập trình hướng sự kiện chưa?

while(true)
    do
       s = io.read("*n")   --Lấy số nguyên từ bàn phím
       print("Bạn vừa nhâp: " .. s)
    end

Chương trình này chạy mãi mãi, chỉ chờ con người ấn phím thì mới xử lý tiếp. Nhưng cháu không hiểu tại sao không viết kiểu chạy đồng bộ từ trên xuống dưới như học pascal trong trường.

chương trình main chính/
├─ code xử lý khi user ấn phím
├─ code xử lý khi user di chuột
├─ code N

Tại sao không chia code ra thành cách file tĩnh như này.
chương trình main chính sẽ thực thi lời gọi hàm đến một hàm tĩnh được viết ở đâu đó rồi truyền đối số vào là xong.

Các chú có lòng thì cho cháu xin luôn video, sách vở về vấn đề này với.

2 Likes

Thực tế thì đúng là có “thế lực vô hình” đã hỗ trợ ngồi nghe các event và gọi các hàm xử lý event tuỳ chỉnh do mình viết.
Mình sẽ code các phần để xử lý event.

5 Likes

Pascal có chỗ nào là functional nhỉ?

1 Like

Bạn đã tìm hiểu được gì chưa?
Cách học là đi tìm tài liệu học, hoặc ít nhất là gõ một cái câu y chang như vậy và thử đọc vài kết quả
Chứ không phải là muốn học cái gì đó thì lên mạng đặt câu hỏi và chờ người ta gõ câu trả lời, đọc xong câu trả lời là đủ kiến thức

Khi bạn đặt câu hỏi, bạn cần phải có mục đích, nếu đã không có lý do để hỏi thì đặt câu hỏi làm gì?
Xét về nội dung câu hỏi, bạn đã có tư duy sai lệch, thay vì hỏi câu như thế này, thì tại sao bạn không tìm hiểu những loại kia là gì, đặc trưng có từng loại
Câu hỏi này cũng có thể tự trả lời được khi bạn chịu tìm hiểu, key word google “đặc điểm của lập trình x”
“các tính chất của lập trình x” “đặc trưng của lập trình x”

Mục đích học lập trình của bạn là gì?
Bạn đang có tư tưởng là đọc code mẫu, sau đó biết được 1 chút cú pháp thì là “biết lập trình”?
tư tưởng này cực kì sai lầm, nó giống như bạn không học mà vào làm bài tập, làm không được thì lại hỏi đáp án, và sau đó thì coi như mình đã giải quyết được bài tập đó, biết làm bài tập đó

Như câu trên, bạn cần biết lập trình hướng sự kiện là gì

Cái này giống như hỏi sao người ta không dùng iphone hết luôn mà lại có người dùng iphone, người dùng samsung galaxy, ngừoi lại dùng xiaomi
Bạn hãy hỏi những ngừoi xung quanh bạn, sao không xài iphone, sao không xài xe honda mà lại xài hãng khác, rồi tự rút ra câu trả lời

nếu bạn có đi học thì bạn có đặt ra vấn đề với trường học rằng, tại sao không cho học sinh mặc quần ngắn, áo thun màu, dép lào không?

5 Likes

Trong lập trình máy tính, lập trình hướng sự kiện (tiếng Anh: Event-driven programming) là một mô hình lập trình trong đó luồng của chương trình được xác định bởi các sự kiện như hành động người dùng (nhấp chuột, bấm phím), đầu ra cảm biến, hoặc thông điệp từ các chương trình hoặc các luồng. [0]

Event driven programming (EDP) trong JS là đơn giản hơn so với nhiều ngôn ngữ khác vì nó sinh ra để phục vụ cho các tác vụ liên quan tới GUI, EDP trong Lua còn khó hơn nhiều, Lua cũng không được sử dụng nhiều nên minh khuyên bạn nên học ngôn ngữ đơn giản hơn, nhiều tài liệu hơn.

Không đây vẫn là Procedure programming paradigm sử dụng vòng lặp vô thời hạn.

Chương trình chạy mãi do vòng lặp while, nếu không có vòng lặp thì chương trình cũng vẫn chạy từ trên xuống, rồi exit khi stack rỗng.

7 Likes

Đầu tiên, tớ rất ngưỡng mộ công sức tìm hiểu và cách đặt câu hỏi của cậu. Việc tìm hiểu và đưa ra câu hỏi như vậy rất có ích, dù sau này cậu làm bất cứ nghề gì. Keep it up! :smile:

Tớ không rõ cậu đã tìm thấy câu trả lời mà cậu mong muốn chưa, nên tớ sẽ thử trả lời cho cậu nhé! :smile:

Event-driven programming là gì?

Cháu muốn hỏi là lập trình hướng sự kiện là gì? lập trình hướng sự kiện có gì khác so với các paradigm lập trình khác (cháu cũng không biết rõ nên so sánh với cái gì, có thể là OOP, functional programming, …)

Về định nghĩa Event-driven programming, cậu có thể tham khảo comment của @doanguyen.
Một cách đơn giản, cậu có thể hiểu Event-driven programming là mô thức hướng tới việc xây dựng hệ thống phản ứng lại các sự kiện bên ngoài trong 1 khoảng thời gian ngắn. Chẳng hạn:

  • Một phần mềm có giao diện phản ứng lại các tương tác từ người dùng.
  • Một website phản ứng lại các sự kiện gửi request từ client.
  • Một hệ thống realtime phản ứng lại các sự kiện thu được qua các sensor.
  • Etc.

Tớ đoán cậu sẽ thắc mắc “hệ thống nào chẳng phản ứng với sự kiện bên ngoài?”. Không hẳn là vậy đâu :smile: Cậu có thể có các phần mềm được kích hoạt để chạy tại một thời điểm, và tắt đi sau khi xong việc, mà không phản ứng với sự kiện gì. Script, batch,… là những phần mềm như vậy.

Event-driven programming khác gì với các mô thức khác?

Cậu có thể thấy rõ Event-driven programming được dùng để giải quyết vấn đề hoàn toàn khác với các mô thức lập trình khác.

  • Event-driven programming là mô thức giải quyết vấn đề “phản ứng” lại một “sự kiện” nào đó. Nền tảng hỗ trợ mô thức này sẽ đảm bảo cho cậu cơ chế để kết nối “sự kiện” và “phản ứng thích hợp” (cơ chế này là “thế lực vô hình” mà cậu băn khoăn. Tớ sẽ nói rõ nó hơn ở đoạn sau).
  • Object-oriented programming hướng tới việc cậu tổ chức chương trình thành các đối tượng một cách logic, với các hành vi và dữ liệu mà nó có. Điều này đặc biệt có lợi khi cậu có lượng code lớn trong project.
  • Functional programming hướng tới việc trừu tượng hóa quá trình dữ liệu thay đổi qua các bước. Nó đặc biệt hữu dụng khi cậu có một process phức tạp để xử lý dữ liệu, khi đó cậu không phải viết quá nhiều code để đạt được mục đích của mình => code của cậu dễ đọc và hiểu hơn rất nhiều.
  • Procedural programming (Pascal của cậu thuộc loại này) hướng tới việc chia nhỏ chương trình của cậu thành các procedure/sub routine. Kết hợp tất cả lại sẽ cho cậu một chương trình hoàn chỉnh.
    Tớ không phải đề cập tới lợi ích của nó nữa nhỉ, nó tương đối tự nhiên mà? :smile:

Cậu thấy đó, mỗi mô thức lập trình hướng tới việc giải quyết vấn đề khác nhau.
Điều đó đồng nghĩa với việc, nếu chương trình của cậu lớn, có “phản ứng” lại các sự kiện, có việc xử lý dữ liệu qua nhiều bước, thì cậu hoàn toàn có thể áp dụng cả 3 mô thức Event-driven programming, Object-oriented programming, và Functional programming để hoàn thành chương trình của cậu.

Chương trình event-driven programming

Cháu có đoạn code ngắn viết bằng lua như này không biết là giống kiểu lập trình hướng sự kiện chưa?..

Đoạn code trên cho thấy cậu hiểu cách tạo ra 1 chương trình sử dụng mô thức event-driven programming rồi đó.
Mô thức này đúng là có 1 vòng lặp vô hạn, với vai trò lắng nghe sự kiện, và một đoạn code để xử lý/phản ứng lại sự kiện đó. Tuy nhiên, cậu có thể thấy một vài điểm đáng chú ý:

  • Vòng lặp vô hạn, lắng nghe sự kiện là quy chuẩn chung cho tất cả các chương trình áp dụng EDP.
    Vậy nên, thường các framework support cho cậu phần này rồi, cậu không phải viết lại vòng lặp nữa. Framework cũng sẽ cho cậu một người phân phối sự kiện, để đảm bảo một sự kiện bất kỳ sẽ được kết nối với đúng thành phần xử lý nó. Cậu chỉ cần khai báo “kiểu sự kiện gì” và “ai xử lý sự kiện đó”, framework sẽ giúp cậu làm phần khó khăn hơn đó.
    Đó là “thế lực vô hình” mà cậu cảm thấy, nhưng chưa sờ vào đấy! :smile:
  • Chương trình của cậu chỉ phản ứng với 1 loại event duy nhất (nhập từ bàn phím), và phản ứng với nó theo 1 cách duy nhất (in ra màn hình). Cậu không có cách nào phản ứng thêm với các loại event khác, hay phản ứng theo 1 cách khác, mà không phải sửa vòng lặp chính.
    Một framework EDP sẽ thường sẽ hỗ trợ cậu khả năng xử lý nhiều loại event khác nhau, và cho phép cậu định nghĩa các logic xử lý cho từng loại event, mà không phải sửa vòng lặp chính.
    Mọi framework EDP đều có một thành phần gọi là event dispatcher. Anh bạn này có trách nhiệm phân phối event tới thành phần có trách nhiệm xử lý/tiêu thụ event đó (có thể là 1 thread nào đó, hoặc một đoạn code nào đó). Event dispatcher cũng là nơi quyết định các event được phân bố thế nào (cậu có thể broadcasting event tới nhiều thành phần, hay đưa nó tới 1 thành phần xác định thôi).
    Đó là thứ cậu không có trong đoạn code của cậu :smile:

Cậu có thể đoán được lý do sao cậu không code thế này:

chương trình main chính/
├─ code xử lý khi user ấn phím
├─ code xử lý khi user di chuột
├─ code N

Lý do tớ đã đề cập, EPD hướng tới việc tạo ra 1 framework để cậu chỉ cần định nghĩa loại sự kiện cậu muốn xử lý, và cách xử lý sự kiện đó. Cậu không cần phải quan tâm, hay sửa vòng lặp chính để làm điều này, nên code của cậu lúc đó sẽ rất dễ bảo trì, đơn giản để viết và dễ hiểu.

Tớ hi vọng cậu đã hiểu thêm về EDP qua bài viết rất dài này. Tớ rất muốn trả lời câu hỏi này sớm hơn, nhưng vì thời gian không cho phép, nên bây giờ tớ mới có thời gian hoàn thiện câu trả lời. Hi vọn nó không quá trễ :smile:

7 Likes

Cháu cảm ơn chú @library nhiều, nhờ chú nói cháu mới để ý, nhà cháu có một cái tủ lạnh thông minh có kết nối điện thoại qua wifi, code bên trong nó chạy 24/7 lúc nào cũng chờ cháu ra lệnh trên app điện thoại, trên giao diện ứng dụng điện thoại cháu có thể tạo và truyền event tăng giảm nhiệt độ, ra lệnh tự đóng chặt cửa cho tủ lạnh xử lý. Nếu để thức ăn nóng thì tủ lạnh tự biết luôn, nó tự giảm nhiệt độ và gửi cảnh báo qua app. Theo như cách mà chú nói và của chú doannguyen bên trên thì cảm biến tủ lạnh nó tự phát ra event cho code đang chực chờ bên trong tủ lạnh. Còn cái máy giặt của mẹ cháu thì không phải lập trình hướng sự kiện rồi, chương trình trong máy giặt cháu thấy nó chạy không khác gì đoạn code pascal cả, là chạy từ trên xuống dưới (bấm start thì chạy, chạy hết code là tự kết thúc) Ấn nút bắt đầu giặt thì nó chạy theo chế độ đã lập trình sẵn, chạy theo thứ tự, lúc nó đang giặt nếu đổi ý muốn tăng giảm thời gian, thay đổi tốc độ quay cũng không được vì code đã nhận input 1 lần ban đầu rồi, giặt xong là máy giặt tự kết thúc chương trình và tắt điện luôn, cháu chả thấy cái máy giặt nhận event giống tủ lạnh gì cả.

6 Likes

Đúng rồi, cậu hiểu được khái niệm rồi đó :+1:
Good job!

1 Like

Dạ cho em hỏi ké, có phải tất cả website đều theo paradigm event-driven programming không vậy bác? Spring boot (java), ASP,NET (.NET), laravel (PHP), … đều theo paradigm EDP đúng không? các framework được build trên nodeJS, deno thì chắc chắn là EDP rồi.
Em cảm ơn.

Uhm, cậu không đang hỏi ké đâu, đó là câu hỏi mở rộng và liên quan tới chủ đề mà :smile:

Dạ cho em hỏi ké, có phải tất cả website đều theo paradigm event-driven programming không vậy bác?

Cậu đúng rồi đó, cơ mà sẽ tốt hơn nếu cậu hiểu chính xác phần nào ở website theo paradigm này.
Cậu có thể đã trải nghiệm khi lập trình website, cậu chỉ quan tâm tới việc mô tả ứng dụng của cậu phản ứng sao với request tới endpoint nào đó, nhưng không quan tâm tới việc ai thực hiện việc match request với code thực hiện ở endpoint đó. EDP được dùng ở đoạn match request với endpoint phù hợp.

Spring boot (java), ASP,NET (.NET), laravel (PHP), … đều theo paradigm EDP đúng không?

Hay nói đúng hơn, các framework đó đều có thành phần sử dụng EDP. Điều tương tự với các framework trên nodejs.

5 Likes

Tại sao lại không nhỉ? ý bác pascal là procedural programming như user library đã nói bên trên?

Đúng rồi đó cậu :smile: Pascal không hỗ trợ functional programming natively đâu, dù cậu có tự triển khai theo các nguyên tắc của functional progranming :smile:

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