Chính xác thì lập trình thủ tục là gì? Chính xác thì nó khác với OOP như thế nào? Có giống như lập trình chức năng không?


32

Tôi đang lập trình trong Java theo kiểu rất hướng đối tượng (OO). OOP đến với tôi bằng trực giác, nhưng tôi có rất ít kiến ​​thức về các loại lập trình khác.

Chính xác thì lập trình thủ tục là gì? Chính xác thì nó khác với OOP như thế nào? Có phải nó giống như lập trình chức năng ?

Tôi đã từng nghĩ rằng tất cả các chương trình không phải là OO là thủ tục. Nhưng tôi bắt đầu nghĩ rằng điều này không đúng.


9
Chia sẻ nghiên cứu của bạn giúp mọi người. Hãy cho chúng tôi những gì bạn đã cố gắng và tại sao nó không đáp ứng nhu cầu của bạn. Điều này chứng tỏ rằng bạn đã dành thời gian để cố gắng tự giúp mình, nó giúp chúng tôi tránh nhắc lại các câu trả lời rõ ràng và hầu hết nó giúp bạn có được câu trả lời cụ thể và phù hợp hơn. Xem thêm Cách hỏi
gnat

2
Lập trình thủ tục không giống như lập trình chức năng; về cơ bản nó giống như lập trình hướng đối tượng, trừ đi các đối tượng và các lớp.
Mason Wheeler

1
OOP bắt buộc thực sự lập trình thủ tục, vì vậy đó chính xác là những gì bạn đang làm mọi lúc ...
Ingo

Câu trả lời:


68

Wikipedia có giải thích tốt cho các điều khoản này. Bất kể, đây là tóm tắt:


  • Lập trình khai báo ngược lại với lập trình mệnh lệnh - nó chỉ định những gì cần tính toán hơn là cách thức (ví dụ SQL, biểu thức chính quy).

  • Các mô hình lập trình hàm tính toán như các biểu thức (có thể) mang lại các giá trị. Hàm là các giá trị và có thể được truyền đến hoặc trả về từ các hàm khác. Đột biến là không khuyến khích; tất cả các biến là bất biến theo mặc định. Kết quả là, nó mang tính khai báo nhiều hơn là bắt buộc, vì nó nhấn mạnh những gì đang được tính toán thay vì chuỗi các thay đổi trạng thái cần thiết để đạt được nó.

  • Lập trình chức năng thuần túy không cho phép đột biến hoàn toàn (mặc dù trái với niềm tin phổ biến vẫn có cơ chế để đạt được các tác dụng phụ).
  • Tổng số lập trình chức năng cũng cấm các trường hợp ngoại lệ và vòng lặp vô hạn. (Hàm tổng trong toán học là hàm trả về giá trị cho tất cả các đầu vào của nó.)

Mối quan hệ của họ hơi phức tạp vì OOP là một thuật ngữ được tải khá nhiều. Bạn có thể sử dụng các đối tượng trong cả ngôn ngữ chức năng và ngôn ngữ thủ tục, nhưng các ngôn ngữ tự quảng cáo là OO là thủ tục. Để làm rõ thêm vấn đề:

  • Hầu hết mọi người không biết sự khác biệt giữa một đối tượng và một kiểu dữ liệu trừu tượng
  • Các ngôn ngữ OOP chính thống không đề cập đến các ADT, cung cấp hỗ trợ rất kém cho chúng và chào mời các đối tượng là The One True Way.
  • Không ai nói Lập trình hướng dữ liệu trừu tượng (vì đó là một việc ngớ ngẩn phải làm; bạn cần cả ADT và đối tượng.)

Điều này khiến mọi người nghĩ rằng OOP là cách duy nhất để đạt được sự trừu tượng hóa và rằng lập trình chức năng và OOP bằng cách nào đó đối lập hoặc loại trừ lẫn nhau. Nhiều người cũng nghĩ rằng tất cả các ngôn ngữ chức năng là thuần túy và không cho phép đột biến.

Ngoài ra, mọi người thường xoay quanh các mệnh lệnh / thủ tục hoán đổi cho nhau, đôi khi tương phản nó với OOP (ngụ ý mã không trừu tượng, nói chung là C) và đôi khi đối chiếu nó với lập trình chức năng. Thuật ngữ lập trìnhcấu trúc hầu như không được sử dụng theo như tôi có thể nói (có thể bởi vì tại thời điểm này, hầu hết mọi người đều cho rằng goto và toàn cầu được coi là có hại.)


3
"Cấm nhảy" là khá chung chung; bao gồm if / while / etc .. có lẽ "cấm nhảy tùy ý"?
Izkata

@Izkata Điểm tốt, đã thay đổi.
Doval

1
Có thể có giá trị thực sự liên kết đến các mục wikipedia.
haylem

Và đó là lý do tại sao nó được gọi là Object "Định hướng" chứ không phải Object duy nhất.
JeffO

1
@OrangeDog Làm thế nào khác với một loại dữ liệu trừu tượng, cũng xác định một tập hợp dữ liệu và hàm được đóng gói có thể hành động trên nó? Hơn nữa, bạn có thể có những vật thể bất biến, vậy trong trường hợp đó, trạng thái nào?
Doval

12

Lập trình thủ tục là một cách tiếp cận để lập trình là một trong những khối cơ bản của việc xây dựng các khối cho nhiều thiết kế ngôn ngữ khác (chức năng không phải là một).

Hầu hết các ngôn ngữ rơi vào tập hợp "Lập trình thủ tục" và đó có lẽ là cách tiếp cận thiết kế tự nhiên nhất đối với hầu hết mọi người (nếu bạn nghĩ theo OO, thì tôi sẽ nói bạn thuộc thiểu số).

BASIC là thủ tục.

Như những người khác đã nói, nó là một cơ chế để cấu trúc các chương trình theo cách thức liên tiếp.

  • Đầu tiên tôi làm x
  • Thứ hai tôi làm y
  • Thứ ba tôi làm Z

Nó đòi hỏi một cơ chế để xác định "thủ tục" - các khối mã được đặt tên tương tự như các phương thức OO, có thể chấp nhận 0 cho nhiều tham số và tùy chọn trả về một giá trị (thường được gọi là hàm - có thể dẫn đến sự nhầm lẫn của bạn với các ngôn ngữ chức năng )

Mô hình không cho biết những gì bạn làm sẽ là gì, hoặc cách thức của những điều được thông qua xung quanh.

Nó chỉ đơn giản mô tả rằng chương trình sẽ được cấu trúc như một chuỗi các thủ tục (hoặc hàm) hoạt động theo cách thức liên tiếp. Dữ liệu sau đó được xác định độc lập với các thủ tục.

Điều này khác với lập trình hướng đối tượng, cấu trúc chương trình xung quanh các bộ sưu tập dữ liệu và phương thức (không phải hàm) hoạt động trên dữ liệu đó.

Một cách để nghĩ về nó là về phạm vi dữ liệu.

Trong một phạm vi ngôn ngữ thủ tục là khá đơn giản. Một biến có thể nằm trong phạm vi của một thủ tục nhất định (được khai báo cục bộ), cho đến mức của công cụ gọi thứ hàng đầu (được khai báo trên toàn cầu), với phạm vi lồng nhau giữa.

Trong một ngôn ngữ hướng đối tượng, bạn thêm một bối cảnh phạm vi mới, là bối cảnh của đối tượng hiện đang sử dụng, là trực giao với ở trên.

Một cách khác để nghĩ về thủ tục, khi so sánh với hướng đối tượng là xem xét một ngôn ngữ hướng đối tượng trong đó tất cả các phương thức phải được khai báo là tĩnh. Kết quả là một ngôn ngữ thủ tục trong đó các lớp có thể được sử dụng để nhóm các thủ tục với nhau.


5

Lập trình thủ tục chắc chắn không phải là lập trình chức năng.

Lập trình thủ tục là khi bạn có một mô hình máy tính như một cỗ máy trong đầu và bạn đang suy nghĩ về cách nó sửa đổi dữ liệu trong bộ nhớ. Vì vậy, trước tiên bạn đặt Agiá trị 3, sau đó bạn thêm 1 và lưu Alại vị trí đó trong bộ nhớ (ghi đè giá trị trước đó).

Chức năng lập trình sẽ được nói Alà 3, và BA + 1, và sau đó cho phép hình máy tính hiểu làm thế nào để tính toán B. Khi bạn đã xác định, Asẽ không thay đổi (không thay đổi). Hàm cũng cho phép bạn thực hiện những việc như truyền một hàm xung quanh dưới dạng giá trị hạng nhất (một hàm có thể lấy hàm làm đối số).

Lập trình hướng đối tượng thường kết hợp cả hai và là loại trực giao cho cả hai. Bạn có thể sử dụng lập trình chức năng và trả về một đối tượng bất biến, và đối tượng đó có thể có một phương thức trả về một số giá trị được tính toán và thậm chí thực hiện nó một cách lười biếng - đó là lập trình hướng đối tượng chức năng. Bạn cũng có thể có một đối tượng đại diện cho "kho lưu trữ" (phiên bản trừu tượng của cơ sở dữ liệu) và bạn có thể "lưu" nội dung trong kho lưu trữ và "lấy" nội dung ra và để đối tượng đó xử lý tất cả các chi tiết về cách thực hiện . Đó là cơ bản lập trình hướng đối tượng.


0

OOP không gì khác hơn là một hình thức lập trình thủ tục tinh tế, một lần nữa thuộc về đại gia đình lập trình mệnh lệnh. Bằng chứng về tuyên bố đó là nhiều lập trình viên C # / Java có xu hướng "làm một cái gì đó" và thích các phương thức như:

void doThisAndThat(....) { ... do something ... }

Vì vậy, một chương trình bao gồm một loạt các phương thức void (trước đây gọi là thủ tục (sic!)) Và mã như:

doThis();
if (state is that) doSomethingElse();
doThat();

là chương trình thủ tục hoàn hảo.


do ThisAndThat (....) ngụ ý rằng một phương thức sẽ thực hiện nhiều hơn một điều mà nói chung không phải là một thực tiễn tốt. Các nhà phát triển Java và C # chủ yếu tuân thủ Nguyên tắc Trách nhiệm duy nhất. Tôi nghĩ rằng sự tương tự của bạn là thiếu sót. objectmentor.com/resources/articles/srp.pdf
JohnK

@ John Tôi biết rằng nó không phải là thực hành tốt. Tuy nhiên, một phổ biến. Đặc biệt là trong số các nhà phát triển Java, nếu người ta có thể đánh giá qua những gì người ta thấy hàng ngày trên SO.
Ingo

Các nhà phát triển @JohnK Java và C # hầu hết tuân thủ Nguyên tắc Trách nhiệm duy nhất - Dịch vụ môi?
Ingo

Các nhà phát triển Java chủ yếu tuân thủ Trách nhiệm duy nhất? Giá như đó là sự thật trong cuộc sống thực ...
Sridhar Sarnobat
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.