Khi nào thích hợp sử dụng lập trình hướng đối tượng / Lập trình hàm?

Chào mọi người, trong diễn đàn mình chắc hẳn ai cũng biết (rõ) về một (vài) ngôn ngữ nào đó, trong đó có cách phân loại rõ ràng nhất về ngôn ngữ sử dụng thành 2 loại là ngôn ngữ hướng đối tượngngôn ngữ hướng chức năng.
Cho đến nay 2 loại ngôn ngữ này tuy khác nhau những vẫn sống tốt sống khỏe song song độc lập với nhau.
Vậy mình muốn làm rõ như tiêu đề là khi nào (hay chương trình như thế nào) thì phù hợp để lập trình hướng đối tượng, và khi nào thì phù hợp để sử dụng lập trình hướng chức năng?
Mời mọi người tham gia thảo luận để tìm ra câu trả lời, có thể dùng ví dụ để chỉ rõ cho mình thì càng tốt, xin chân thành cảm ơn :smile:

2 Likes

Dịch là ngôn ngữ hướng chức năng mình thấy không ổn lắm (dịch theo kiểu word-by-word). Nó là mô hình lập trình hàm (functional programming paradigm) với ngôn ngữ điển hình là Lisp và Haskell, đối nghịch lại là lập trình thủ tục (procedure programming paradigm) với ngôn ngữ là C hay Pascal. Các thành phần xử lý trong functional programming có tính chất tương tự các hàm toán học. Có một blog rất hay nói về haskell: http://quangchien.wordpress.com/2012/04/16/ch1-learn-haskell/

Thực chất các ngôn ngữ hiện nay đều là ngôn ngữ đa mô hình (multi paradigm), điển hình như Scala là hướng đối tượng và hàm, C++ là hướng đối tượng và thủ tục, Java là hướng đối tượng và Java 8bổ sung một số chức năng của lập trình hàm! Khi nào nên sử dụng thì bạn cần tìm hiểu thêm về các mô hình lập trình để nắm vững thêm. Điềm cải thiện quan trọng nhất của lập trình hàm so với thủ tục đó là không bị dính hiệu ứng lề (side effect), blog trên đề cập rất rõ, do đó nó rất phù hợp với các hệ thống song song.

Một thống kê gần đây về tính ổn định, lỗi trong phát triển phần mềm: Ngôn ngữ static (java, c#) thường ít dính lỗi hơn ngôn ngữ dynamic (python, ruby), ngôn ngữ lập trình hàm thường ít lỗi hơn ngôn ngữ hướng thủ tục và thuần hướng đối tượng thông thường. (Link tới bài báo: http://macbeth.cs.ucdavis.edu/lang_study.pdf , nếu không truy cập được có thể xem tạm tại google cache http://webcache.googleusercontent.com/search?q=cache:0EticyDacHgJ:macbeth.cs.ucdavis.edu/lang_study.pdf+&cd=1&hl=en&ct=clnk)

8 Likes

Đồng ý với @Itachi_Citus, Đạt sửa lại title.

Bổ sung thêm cái link tới thống kê luôn @Itachi_Citus.


Cá nhân Đạt đã thử học Haskell thì thấy cú pháp cũng gọn, nhưng tư duy của ngôn ngữ dạng này nó hơi ngược so với những gì mình được học ở các ngôn ngữ static như C.

2 Likes

Hôm trước em có đọc một bài viết về ngôn ngữ Erlang cũng bảo nó là lập trình hàm, cái này đặc biệt là không có vòng lặp :smiley:, và nó bá ở lĩnh vực Game online, hoặc những phần mềm cần độ “chịu đựng cao”

2 Likes

Erlang hỗ trợ concurrent, đặc biệt hữu ích đối với các ứng dụng yêu cầu phục vụ nhiều người dùng một lúc. Telecom là lĩnh vực đầu tiên mà nó được áp dụng. Ở VN có công ty D.E.K viết Erlang đấy. Đạt có bạn làm Erlang, để Đạt hỏi xem họ có nhận xét gì không.

3 Likes

Em đọc báo gần đây nhớ vậy, không biết có kiếm lại được bài báo đó không, để em thử :cry:
Được rồi á anh, lần sau em cẩn thận hơn :p.

2 Likes

Cái nào cũng tốt :smile: Hiện giờ thì mình kết hợp sử dụng OOP cùng với Functional Programming cũng như Functional Reactive Programming trong 1 chương trình.

3 Likes

Dùng nhiều ngôn ngữ khác nhau hả @huyle?

À không, mình dùng Objective-C là ngôn ngữ OOP.

  • Cấu trúc backend của App theo OOP

  • Functional thì mình xử lý ở các Array thôi, vì mình cũng chưa làm nhiều về functional, qua Swift làm tiện hơn Objective-C.

  • Còn Functional Reactive Programming (FRP) là dựa trên framework ReactiveCocoa của Github, các thành phần View, Layout thì mình xử lý bằng dạng này nó sẽ nhanh và đơn giản hơn.

3 Likes

Cái này có hỗ trợ được IOS 7.0 ko?

Thực ra mình lập topic này để tham khảo mọi người về mặt thực tế sử dụng trong từng lĩnh vực cụ thể của 2 mô hình lập trình phổ biến hiện nay là OOP và functional programming, nhưng thu được về lại được nhiều kiến thức khá tổng quát.
Cảm ơn mọi người nhiều, cũng khó mà chỉ ra được cụ thể nên dùng cái nào trong việc nào, vì thực tế mình cũng thấy kết hợp là chính.

iOS7.0 bạn tham khảo ReactiveCocoa 2.x nhé https://github.com/ReactiveCocoa/ReactiveCocoa
Bản 3.x thì đang beta và sử dụng cho Swift

Ưu điểm của ReactiveCocoa là bạn sẽ remove khoảng 50% code bạn sử dụng :smile: rút ngắn thời gian, làm rất là nhanh, đặc biệt là những behavior của View càng phức tạp, càng nhiều state thì thấy càng hiệu quả.

Khuyết điểm: Khó khăn khi học lúc đầu, vì nó không phải đơn giản là 1 framework, nó sẽ thay đổi hoàn toàn mind set khi bạn lập trình. Không phải suy nghĩ theo hướng Object nữa.

Bạn có thể tham khảo ở 1 số blog:


http://www.sprynthesis.com/2014/12/06/reactivecocoa-mvvm-introduction/

http://www.teehanlax.com/blog/getting-started-with-reactivecocoa/

Nếu bạn cảm thấy có hứng thú học, thì cứ đọc mấy cái block trên trước rồi có thể liên hệ mình.

P/S: Hiện giờ thì nếu viết app mới thì mình không support 7.0, vì khi làm xong app, release thì 9.0 chuẩn bị ra rồi :smile: Mình chỉ support 2 version mới nhất

3 Likes

@huyle Đang sử dụng Swift à, làm vài cái tut về ngôn ngữ này + với Cocoa đi. Nghe rất thú vị.
@ChienCG Hiện nay OOP vẫn phổ biến nhất

1 Like

@ltd: Huy vẫn đang sử dụng Objective-C, vì team vẫn chưa sẵn sàng để làm 1 project bằng Swift, nếu làm dự án tiếp theo thì có lẽ sẽ chuyển dần qua Swift.

Huy không thích làm các hướng dẫn dạng Step by Step như Tut+ hay Raywenderlich.

  • Thứ nhất, các Tut, Article hay Blog về Swift + Cocoa có quá nhiều người làm rồi, cả 1 cộng đồng lớn, giờ đọc còn chưa có thời gian đọc hết :smile:
  • Thứ hai, Huy nghĩ các Tut không hẵn là có đường tốt nhất để phát triển kỹ năng lap trình.

Huy nghĩ nguồn tài liệu thì không thiếu, cái mà dev VN và sinh viên VN đang thiếu đó là động lực, hướng đikhả năng tự học.

4 Likes

Để tương tác nhiều bạn nên viết kiểu OOP
Còn để rộng rãi tiết kiệm hiệu năng viết kiểu FUNCTIONAl
Nhìn thấy rõ vấn đề rồi thực hiện là quan trọng
Bạn đặt cầu hỏi tại sao các ngôn ngữ đều có các Hàm sẵn???
Giả định của bài toán đặt ra yêu cầu gì mà cần phải dùng đến Class?

I will suggest you to start from OOP (Object Oriented Programming) and then jump to functional programming, Once all your OOP concept gets cleared functional programming will not take much time to learn and implement.


https://www.codenewbie.org/blogs/object-oriented-programming-vs-functional-programming

Hope above links will help you to understand what i said in better ways.

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