Các lựa chọn thay thế cho Lập trình hướng đối tượng?


81

OOP có lẽ là mô hình lập trình được sử dụng nhiều nhất trong thiết kế phần mềm ngày nay. Câu hỏi của tôi là - (các) mô hình nào khác có thể cạnh tranh với nó và có thể đứng ở vị trí của OOP ? Để làm rõ câu hỏi đó, tôi không hỏi về những mô hình khác có. Có rất nhiều trong số chúng, nhưng tôi muốn biết cái nào…

  • Đã được sử dụng trong thực tế, không chỉ trên lý thuyết.
  • Có thể cạnh tranh với OOP , vì vậy nó có thể được sử dụng trong một dự án lớn với mức tối thiểu.
  • Có thể được sử dụng để phát triển ứng dụng dành cho máy tính để bàn với logic nghiệp vụ, cơ sở dữ liệu, v.v.
  • Không được sử dụng cùng với OOP, nhưng thay thế cho OOP.

Và nếu có, ưu / nhược điểm của nó là gì, tại sao nó tốt / xấu hơn OOP, những ngôn ngữ nào tốt nhất để sử dụng nó, còn việc sử dụng nó trong các ngôn ngữ phổ biến thì sao, nó có mẫu thiết kế nào không, và nó có thể thay thế hoàn toàn OOP?


1
@Justin Ardini: Tôi biết có rất nhiều, nhưng cái nào có thể cạnh tranh với oop? @Tobiasopdenbrouw & Macros: Ok, đã thay đổi.
Dariusz Woźniak

OOP là phổ biến vì nó là phổ biến, nếu bạn không nuốt OOP Kool-Aid bạn sẽ không có bất kỳ dự án để làm việc trên ...
aoeu256

Lập trình Hướng dữ liệu dễ dàng hơn, trong đó bạn quan tâm đến các tập hợp đối tượng và mối quan hệ của chúng hơn là các đối tượng đơn lẻ, nơi các phương thức "đối tượng db" cung cấp tính năng đóng gói. JSON và sexpressions làm ngọt các tập lệnh SQL, CSS, HTML, Excel, shell là phổ biến và hữu ích, nhưng "lập trình" có nghĩa là OOP hoặc thủ tục. OOP được cảm ơn vì có thể bảo trì các chương trình Python / JavaScript mặc dù OOP là 20% mã. Closures & JSON có thể được sử dụng 90% thời gian thay cho Đối tượng và đơn giản hơn và dễ sử dụng hơn.
aoeu256

Câu trả lời:


50

Lập trình hàm là một mô hình lập trình khác phổ biến, chủ yếu là trong học thuật. Ví dụ tốt nhất về ngôn ngữ lập trình chức năng là HaskellStandard ML .

Sự khác biệt cơ bản giữa lập trình chức năng và lập trình hướng đối tượng là bạn đang lập trình theo nghĩa luồng dữ liệu thay vì luồng điều khiển . Xem bài thuyết trình Thuần hóa Hiệu ứng với Lập trình Chức năng của Simon Peyton-Jones để biết phần giới thiệu hay.

Một ví dụ điển hình về lập trình chức năng được sử dụng trong ngành là Erlang . Nó chủ yếu được sử dụng trong các hệ thống viễn thông, phân tán và hệ thống chịu lỗi. Xem bài thuyết trình Erlang - Phần mềm cho một thế giới đồng thời của Joe Armstrong .

Ngoài ra còn có các ngôn ngữ lập trình chức năng mới hơn kết hợp lập trình chức năng với OOP. Hai ví dụ điển hình là F # cho nền tảng .NET và Scala cho nền tảng Java; họ thường có thể sử dụng các thư viện hiện có trên nền tảng được viết bằng các ngôn ngữ khác.

Xu hướng của các ngôn ngữ lập trình mới hiện nay là Đa mô hình , trong đó nhiều mô hình như lập trình hướng đối tượng và lập trình chức năng được kết hợp trong cùng một ngôn ngữ.


4
Scala nhằm mục đích tích hợp các tính năng của ngôn ngữ chức năng và hướng đối tượng.
Philipp

5
Câu trả lời hay, nhưng tôi nghĩ rằng lập trình hàm và lập trình hướng đối tượng không phải là hai mặt của một tấm huy chương, chúng hoàn toàn có thể cùng tồn tại (như bạn đã đề cập). Nó giống như thế này: Thủ tục VS Hướng đối tượng, Mệnh lệnh VS Chức năng. Lisp là một ngôn ngữ hàm thủ tục phổ biến, Java là một ngôn ngữ mệnh lệnh hướng đối tượng.
fhd

1
@ ventr1s: Có, lập trình chức năng có thể thay thế OOP nhưng nó có nhiều khả năng được sử dụng cùng với OOP trong các ngôn ngữ như Scala và F #.
Jonas

1
@ ventr1s: Một ví dụ điển hình về lập trình chức năng trong ngành là cơ sở dữ liệu NoSQL phân tán RIAK được viết bằng Erlang. riak.basho.com
Jonas

2
@ ventr1s: Xem câu hỏi này về lập trình chức năng và các mẫu thiết kế: stackoverflow.com/questions/327955/…
Jonas

11

Xử lý thủ tục là tất cả mọi thứ trước khi OOP xuất hiện, đã tạo ra một số ứng dụng lớn trong thế giới thực (trên thực tế, hầu hết trong số chúng ban đầu) và nhiều hệ điều hành.

Nó chắc chắn có thể được sử dụng trong các sản phẩm quy mô lớn với mức tối thiểu và hiệu suất tối đa


4
Vâng, và vô số nghiên cứu về số liệu đã chỉ ra rằng nó hết xăng ở mức khoảng 150 nghìn LOC. Nhìn vào Windows SDK khoảng thời gian của Petzold để biết chuyên luận về cách Lập trình có cấu trúc phân hủy dưới các tải phức tạp: các hàm có 8 đối số, 2 là cấu trúc có 6-10 thành viên. Việc đẩy dữ liệu vào và ra khỏi mọi đơn vị tính toán cuối cùng không hoạt động.
Cướp

1
OK nhưng - có bao nhiêu ứng dụng trở nên lớn như vậy? Vấn đề với OOP là nó cực kỳ phức tạp để hiểu và được thiết kế cho các ứng dụng rộng lớn - nhưng là mặc định ngay cả đối với những ứng dụng nhỏ. Điều này có tác dụng ngược lại là không nhất thiết phải làm phức tạp ứng dụng nhỏ hơn.
niico

Lập trình hướng đối tượng đôi khi khiến các ứng dụng dài hơn vì cần các hàm tạo và các phương thức getter / setter dài. Những ngôn ngữ thủ tục ban đầu như C không có hỗ trợ cho lập trình Meta, không có hệ thống đa hình, bao đóng hoặc cú pháp dễ dàng để biểu diễn dữ liệu JSON / chung. C thậm chí không hỗ trợ cho các đối số tùy chọn. Đơn nguyên và Macro có thể được sử dụng để xây dựng Ngôn ngữ dành riêng cho miền được nhúng mạnh mẽ.
aoeu256

Các hàm với 8 đối số - bạn đã bao giờ nghe đến các đối số mặc định chưa? Còn về hỗ trợ thủ tục + lớp đầu tiên cho HashTables + các bao đóng như JavaScript, Python, v.v.? Chúng có nhiều ưu điểm của OOP mà không cần nhiều mã.
aoeu256

4

Mô hình hóa dữ liệu quan hệ vectơ được sử dụng để tạo các mô hình thông tin thực thi với ngữ nghĩa liên quan miền trong Kiến trúc mạng thông tin toàn cầu, một nhà môi giới mô hình cư trú của mạng.


3

Trước hết, xin lưu ý rằng nhiều ngôn ngữ lập trình hiện đang được sử dụng (đặc biệt là "ngôn ngữ cấp cao hơn") là đa mô hình . Điều đó có nghĩa là bạn không bao giờ xây dựng các chương trình hoàn toàn là OOP (ngoại trừ trường hợp bạn có thể sử dụng Smalltalk hoặc Eiffel để xây dựng các dự án lớn của mình).

Hãy xem PHP chẳng hạn:

  • Có nhiều yếu tố của OOP (kể từ phiên bản 5)
  • Trước đây chủ yếu là thủ tục
  • Có các phần tử của lập trình khai báo (ví dụ: các hàm mảng)
  • Đã triển khai nhiều yếu tố của lập trình chức năng (kể từ phiên bản 5.4)

Về cơ bản, PHP đang dán nhiều mô hình khác nhau lại với nhau (và bản thân nó là một "ngôn ngữ keo").

Ngoài ra Java còn triển khai rất nhiều khái niệm không phải từ mô hình hướng đối tượng (ví dụ: từ lập trình chức năng).

Xem danh sách ngôn ngữ lập trình theo loại trong Wikipedia: https://en.wikipedia.org/wiki/List_of_programming_languages_by_type#Imperative_languages (không chính xác 100%).

Lập trình hàm (tập con của lập trình giải mã)

  • Wideley được sử dụng trong thực tế (nó đã trở thành một phần của các ngôn ngữ gắn kết như PHP , Java và nhiều ngôn ngữ khác đã triển khai các khái niệm về lập trình hàm)
  • Nhiều ý tưởng bắt nguồn từ LISP, điều này chắc chắn đáng xem
  • Bạn có thể xây dựng toàn bộ ứng dụng, ví dụ như với Haskell do đó nó có thể "thay thế" OOP

Lập trình thủ tục

  • C (như một ngôn ngữ chủ yếu là thủ tục) vẫn là một trong những ngôn ngữ được sử dụng rộng rãi nhất
  • Nhiều ngôn ngữ keo hiện đại là thủ tục vào thời kỳ đầu
  • Vẫn còn nhiều chương trình chủ yếu là thủ tục (vì vậy nếu bạn muốn nó có thể "thay thế" OOP)

Lập trình logic

  • Ví dụ nổi bật nhất là Prolog. Điều này được sử dụng cho các tác vụ cụ thể được hưởng lợi từ các truy vấn logic dựa trên quy tắc
  • Không thể "thay thế" OOP trong điều kiện xây dựng một dự án lớn nhưng có thể thay thế nó trong điều kiện khác

Ngôn ngữ khai báo / ngôn ngữ dành riêng cho miền nói chung

  • Sử dụng SQL trong các dự án của bạn? Sau đó, chúng không hoàn toàn là OOP, SQL về cơ bản là khai báo.
  • Nhiều ngôn ngữ dành riêng cho miền (như CSS) là ngôn ngữ khai báo

Lập trình mệnh lệnh nói chung

Danh sách này không hoàn chỉnh, nó sẽ chỉ đưa ra một ý tưởng. Chỉ cần lưu ý rằng bạn thường sử dụng nhiều mô hình khác nhau khi viết một ứng dụng lớn và thậm chí mỗi ngôn ngữ bạn đang sử dụng đang triển khai nhiều mô hình.

OOP thường được coi là một lựa chọn tốt để cấu trúc các mối quan hệ lớn, phức tạp khi mô hình hóa dữ liệu. Nó không phải lúc nào cũng đồng hành với nhiều nhiệm vụ khác.


1

FP - Lập trình chức năng là một mô hình lập trình cực kỳ phổ biến đã có từ rất lâu và trong những năm gần đây, nó bắt đầu ngày càng trở nên nổi bật hơn. FP ủng hộ tính bất biến hơn khả năng thay đổi, đệ quy và các chức năng mà không có tác dụng phụ. Một số ví dụ về các ngôn ngữ fp phổ biến là Erlang, Scala, F #, Haskell và Lisp (trong số những ngôn ngữ khác).


-5

Hiện tại không có mô hình nào có thể thay thế OOP thực sự. Vấn đề với (lợi ích của) OOP là nó thực hiện rất nhiều công việc cho bạn - tự động giải phóng tài nguyên, xác thực dữ liệu, v.v. và giúp dễ dàng xác thực mã - chưa kể đến phần lớn các thư viện hiện có trên thế giới được viết bằng ngôn ngữ OOP như C ++, C # hoặc Java. Thực tế để hòa hợp mà không có những thư viện quy mô lớn và như vậy là cực kỳ đáng nghi ngờ.

Trong thế giới thích hợp hoặc học thuật, bạn sẽ tìm thấy rất nhiều Lập trình chức năng. Tuy nhiên, nếu bạn thực sự muốn thực hiện một dự án lớn, OOP là cách duy nhất để đi.

Tôi nghĩ rằng lập trình chung sẽ trở thành một mô hình mới. Tuy nhiên, nó thực sự vẫn đang trong giai đoạn phát triển và chỉ C ++ / D cung cấp chương trình chung thực sự tốt.


3
OOP không làm bất kỳ điều gì trong số đó. Nó có thể làm cho chúng dễ dàng hơn, nhưng chỉ khi thiết kế của khung công tác OO bao gồm chúng, như trong .Net, hoặc nếu bạn sẵn sàng viết chúng.
Matt Ellen

Về mặt kỹ thuật, bạn đúng. Tuy nhiên, thực tế là tất cả các ngôn ngữ OO phổ biến đều bao gồm quản lý tài nguyên như một tính năng của hướng đối tượng. Bạn sẽ khó tìm thấy một đối tượng trực tiếp hỗ trợ ngôn ngữ không bao gồm nó. Và OP rõ ràng quan tâm đến thực hành chứ không phải lý thuyết.
Puppy

3
quản lý tài nguyên không phải là một tính năng của hướng đối tượng - quản lý tài nguyên là một tính năng của ngôn ngữ lập trình mệnh lệnh, có thể là hướng đối tượng hoặc không. Tôi không biết bất kỳ ngôn ngữ chức năng thuần túy nào buộc bạn phải quản lý tài nguyên hệ thống một cách rõ ràng.
Matthew J Morrison
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.