2010-08-12 32 views
55

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à - những gì các mô hình khác (s) có thể cạnh tranh với nó và có thể đứng ở vị trí của oop? Để làm sáng tỏ câu hỏi đó, tôi không hỏi về những mô hình khác. Có nhiều người trong số họ và tôi muốn biết cái nào:Lựa chọn thay thế cho lập trình hướng đối tượng?

  • Đã được sử dụng trong thực tế, không chỉ theo 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 mà không có hoặc ít nhất là đau.
  • 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 có thể thay thế oop.

Và nếu có, ưu điểm của nó là gì, tại sao nó tốt hơn/tệ hơn oop, ngôn ngữ nào là tốt nhất để sử dụng, ngôn ngữ phổ biến, mẫu thiết kế, 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. –

+0

OOP phổ biến vì nó phổ biến, nếu bạn không nuốt OOP koolaid, bạn sẽ không có dự án nào để làm việc ... – aoeu256

+0

Lập trình hướng dữ liệu dễ dàng hơn, nơi bạn quan tâm đến bộ sưu tập đối tượng và mối quan hệ của chúng hơn là đơn các đối tượng, nơi các phương thức "đối tượng db" cung cấp đóng gói. JSON và sexpressions làm ngọt SQL, CSS, HTML, Excel, các kịch bản lệnh 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 để duy trì các chương trình Python/JavaScript mặc dù OOP là 20% mã. Đóng cửa & JSON có thể được sử dụng 90% thời gian thay cho các đối tượng và đơn giản hơn và dễ sử dụng hơn. – aoeu256

Trả lời

32

Functional programming là một mô hình lập trình phổ biến, chủ yếu là trong các học giả. 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 chức năng lập trình và lập trình hướng đối tượng là bạn đang lập trình theo nghĩa dữ liệu chảy thay vì kiểm soát dòng chảy. Xem bản trình bày Taming Effects with Functional Programming bởi Simon Peyton-Jones để có phần giới thiệu tốt.

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 phối và chịu lỗi. Xem bản trình bày Erlang - Software for a concurrent World theo Joe Armstrong.

Ngoài ra còn có ngôn ngữ lập trình chức năng mới kết hợp chức năng lập trình với OOP. Hai ví dụ tốt 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 ngôn ngữ lập trình mới bây giờ là Multi-paradigm, trong đó nhiều mô hình như lập trình hướng đối tượng và lập trình hàm được kết hợp trong cùng một ngôn ngữ.

+0

Chương trình chức năng có thể thay thế oop hoặc nó được sử dụng với oop? Có bất kỳ ví dụ thế giới thực nào về các ứng dụng được viết trong mô hình này không? Điều gì về các mẫu thiết kế? –

+4

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

+4

Câu trả lời hay, nhưng tôi nghĩ rằng lập trình chức năng và lập trình hướng đối tượng không phải là hai mặt của một huy chương, họ 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, chức năng bắt buộc VS. Lisp là một ngôn ngữ chức năng thủ tục phổ biến, Java là một ngôn ngữ mệnh lệnh hướng đối tượng. – fhd

1

FP - chức năng lập trình là một mô hình lập trình cực kỳ phổ biến mà đã được khoảng một thời gian rất dài và có, trong những năm gần đây, 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 về tính đột biến, đệ quy và các chức năng 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ố các ngôn ngữ khác).

+1

Scala là một ví dụ tốt về sự kết hợp OOP/FP. –

8

xử lý thủ tục là tất cả mọi thứ trước khi OOP bật lên, đã tạo ra một số ứng dụng thế giới thực lớn (trên thực tế, hầu hết trong số họ 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 tối thiểu là đau đớn, và tối đa là hiệu suất

+4

Vâng, và vô số các nghiên cứu về số liệu đã cho thấy nó hết xăng ở khoảng 150K LOC. Nhìn vào Windows SDK khoảng thời gian của Petzold cho một luận về cách lập trình có cấu trúc tan rã dưới tải phức tạp: chức năng với 8 đối số, 2 là cấu trúc với 6-10 thành viên. Đẩ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. – Rob

+1

OK nhưng - có bao nhiêu ứng dụng nhận được điều này lớn? Vấn đề với OOP là nó rất 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 hơn làm phức tạp các ứng dụng nhỏ hơn không nhất thiết. – niico

+0

Lập trình hướng đối tượng đôi khi làm cho các ứng dụng trở nên lâu hơn do nhu cầu về 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, đóng cửa hoặc cú pháp dễ dàng cho JSON/đại diện dữ liệu chung. C thậm chí không hỗ trợ cho các đối số tùy chọn. Monads và Macros có thể được sử dụng để xây dựng các Ngôn ngữ Cụ thể cho Miền được nhúng mạnh mẽ. – aoeu256

-5

Không có mô hình hiện rằng thực sự có thể thay thế OOP.Vấn đề với (lợi ích của) OOP là nó làm một số lượng lớn công việc để bạn tự động phát hành tài nguyên, xác nhận hợp lệ dữ liệu, v.v. và giúp dễ dàng xác nhận mã - chưa kể rằng 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ế của việc đi cùng mà không có thư viện quy mô lớn như vậy và như vậy là cực kỳ nghi ngờ.

Trong thế giới thích hợp hoặc học thuật, bạn sẽ tìm thấy nhiều Lập trình chức năng. Tuy nhiên, nếu bạn thực sự muốn làm 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 còn trong giai đoạn phát triển và chỉ C++/D cung cấp chương trình thực sự tốt chung chung.

+3

OOP không làm bất cứ đ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. –

+0

Về mặt kỹ thuật, bạn nói đúng. Tuy nhiên, thực tế là tất cả các ngôn ngữ OO phổ biến bao gồm quản lý tài nguyên như một tính năng định hướng đối tượng. Bạn sẽ khó ép để tìm một ngôn ngữ hỗ trợ trực tiếp đối tượ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

+2

quản lý tài nguyên không phải là một tính năng của định 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 bắt buộc, có thể được định hướng đối tượng hay 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 quản lý tài nguyên hệ thống một cách rõ ràng. –

2

Vector mô hình dữ liệu quan hệ được sử dụng để tạo các mô hình thông tin thực thi với ngữ nghĩa có liên quan đến 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ú mạng.