Sự khác biệt giữa các mô hình lập trình này là gì và chúng có phù hợp hơn với các vấn đề cụ thể hoặc có trường hợp sử dụng nào ưu tiên cái này hơn các trường hợp khác không?
Ví dụ kiến trúc đánh giá cao!
Sự khác biệt giữa các mô hình lập trình này là gì và chúng có phù hợp hơn với các vấn đề cụ thể hoặc có trường hợp sử dụng nào ưu tiên cái này hơn các trường hợp khác không?
Ví dụ kiến trúc đánh giá cao!
Câu trả lời:
Tất cả chúng đều tốt theo cách riêng của chúng - Chúng đơn giản là những cách tiếp cận khác nhau cho cùng một vấn đề.
Trong một phong cách thủ tục thuần túy, dữ liệu có xu hướng tách rời khỏi các chức năng hoạt động trên nó.
Trong một phong cách hướng đối tượng, dữ liệu có xu hướng mang theo nó một tập hợp các hàm.
Trong một kiểu chức năng, dữ liệu và chức năng có xu hướng có nhiều điểm chung với nhau (như trong Lisp và Scheme) trong khi cung cấp sự linh hoạt hơn về cách các chức năng thực sự được sử dụng. Các thuật toán cũng có xu hướng được xác định theo thuật ngữ đệ quy và thành phần hơn là các vòng lặp và lặp.
Tất nhiên, bản thân ngôn ngữ chỉ ảnh hưởng đến phong cách nào được ưa thích. Ngay cả trong một ngôn ngữ chức năng thuần túy như Haskell, bạn có thể viết theo kiểu thủ tục (mặc dù điều đó rất nản lòng) và ngay cả trong ngôn ngữ thủ tục như C, bạn có thể lập trình theo kiểu hướng đối tượng (như trong GTK + và API EFL).
Để rõ ràng, "lợi thế" của mỗi mô hình chỉ đơn giản là trong việc mô hình hóa các thuật toán và cấu trúc dữ liệu của bạn. Nếu, ví dụ, thuật toán của bạn liên quan đến danh sách và cây, thuật toán chức năng có thể là hợp lý nhất. Hoặc, nếu, ví dụ, dữ liệu của bạn có cấu trúc cao, việc kết hợp nó thành đối tượng sẽ hợp lý hơn nếu đó là mô hình nguyên gốc của ngôn ngữ của bạn - hoặc, nó có thể dễ dàng được viết như một sự trừu tượng hóa chức năng của các đơn nguyên, là mô hình bản địa của các ngôn ngữ như Haskell hoặc ML.
Sự lựa chọn mà bạn sử dụng chỉ đơn giản là những gì có ý nghĩa hơn cho dự án của bạn và sự trừu tượng mà ngôn ngữ của bạn hỗ trợ.
Tôi nghĩ rằng các thư viện, công cụ, ví dụ và cộng đồng có sẵn hoàn toàn vượt qua mô hình ngày nay. Ví dụ, ML (hoặc bất cứ điều gì) có thể là ngôn ngữ lập trình đa năng cuối cùng nhưng nếu bạn không thể có được bất kỳ thư viện tốt nào cho những gì bạn đang làm thì bạn sẽ bị lừa.
Ví dụ: nếu bạn đang tạo một trò chơi video, có nhiều ví dụ mã và SDK tốt hơn trong C ++, vì vậy bạn có thể tốt hơn với điều đó. Đối với một ứng dụng web nhỏ, có một số khung công tác Python, PHP và Ruby tuyệt vời sẽ giúp bạn thoát khỏi và chạy rất nhanh. Java là một lựa chọn tuyệt vời cho các dự án lớn hơn vì các thư viện và nền tảng kiểm tra thời gian biên dịch và thời gian biên dịch.
Nó đã từng là trường hợp các thư viện tiêu chuẩn cho các ngôn ngữ khác nhau khá nhỏ và dễ dàng sao chép - C, C ++, Trình biên dịch, ML, LISP, v.v. đi kèm với những điều cơ bản, nhưng có xu hướng phát triển khi chuẩn hóa mọi thứ như truyền thông mạng, mã hóa, đồ họa, định dạng tệp dữ liệu (bao gồm cả XML), thậm chí các cấu trúc dữ liệu cơ bản như cây cân bằng và hashtables đã bị bỏ qua!
Các ngôn ngữ hiện đại như Python, PHP, Ruby và Java giờ đây đi kèm với một thư viện tiêu chuẩn tốt hơn rất nhiều và có nhiều thư viện bên thứ ba tốt mà bạn có thể dễ dàng sử dụng, nhờ một phần lớn vào việc áp dụng các không gian tên để giữ cho các thư viện không bị va chạm với nhau, và thu gom rác để chuẩn hóa các sơ đồ quản lý bộ nhớ của các thư viện.
Những mô hình này không phải loại trừ lẫn nhau. Nếu bạn nhìn vào python, nó hỗ trợ các hàm và các lớp, nhưng đồng thời, mọi thứ đều là một đối tượng, bao gồm các hàm. Bạn có thể trộn và kết hợp tất cả các kiểu chức năng / oop / thủ tục trong một đoạn mã.
Ý tôi là, trong các ngôn ngữ chức năng (ít nhất là trong Haskell, người duy nhất tôi đã nghiên cứu) không có tuyên bố nào! các chức năng chỉ được phép một biểu thức bên trong chúng !! NHƯNG, các chức năng là công dân hạng nhất, bạn có thể chuyển chúng xung quanh dưới dạng tham số, cùng với một loạt các khả năng khác. Họ có thể làm những việc mạnh mẽ với vài dòng mã.
Mặc dù trong ngôn ngữ thủ tục như C, cách duy nhất bạn có thể chuyển các hàm xung quanh là sử dụng các con trỏ hàm và một mình nó không cho phép nhiều tác vụ mạnh mẽ.
Trong python, một hàm là một công dân hạng nhất, nhưng nó có thể chứa số lượng câu lệnh tùy ý. Vì vậy, bạn có thể có một hàm chứa mã thủ tục, nhưng bạn có thể chuyển nó xung quanh giống như các ngôn ngữ chức năng.
Tương tự với OOP. Một ngôn ngữ như Java không cho phép bạn viết các thủ tục / hàm bên ngoài một lớp. Cách duy nhất để vượt qua một chức năng xung quanh là bọc nó trong một đối tượng thực hiện chức năng đó, và sau đó truyền đối tượng đó xung quanh.
Trong Python, bạn không có hạn chế này.
Đối với GUI, tôi muốn nói rằng Nghịch lý hướng đối tượng là rất phù hợp. Cửa sổ là một Đối tượng, Hộp văn bản là Đối tượng và Nút Okay cũng vậy. Mặt khác, các công cụ xử lý chuỗi như Xử lý chuỗi có thể được thực hiện với chi phí thấp hơn nhiều và do đó đơn giản hơn với mô hình thủ tục đơn giản.
Tôi không nghĩ đó là một câu hỏi về ngôn ngữ. Bạn có thể viết chức năng, thủ tục hoặc hướng đối tượng trong hầu hết mọi ngôn ngữ phổ biến, mặc dù nó có thể là một số nỗ lực bổ sung trong một số.
Để trả lời câu hỏi của bạn, chúng tôi cần hai yếu tố:
Một danh sách các kiểu / kiểu kiến trúc phần mềm được hiển thị trên bài viết kiến trúc phần mềm trên Wikipeida. Và bạn có thể nghiên cứu về chúng một cách dễ dàng trên web.
Tóm lại và nói chung, Thủ tục là tốt cho một mô hình tuân theo quy trình, OOP tốt cho thiết kế và Functional tốt cho lập trình cấp cao.
Tôi nghĩ bạn nên thử đọc lịch sử trên mỗi mô hình và xem tại sao mọi người tạo ra nó và bạn có thể hiểu chúng một cách dễ dàng.
Sau khi hiểu cả hai, bạn có thể liên kết các mục của kiểu / mẫu kiến trúc với mô hình lập trình.
Một người bạn của tôi đang viết một ứng dụng đồ họa bằng NVIDIA CUDA . Ứng dụng phù hợp rất tốt với mô hình OOP và vấn đề có thể được phân tách thành các mô-đun gọn gàng. Tuy nhiên, để sử dụng CUDA, bạn cần sử dụng C, không hỗ trợ kế thừa . Do đó, bạn cần phải khéo léo.
a) Bạn nghĩ ra một hệ thống thông minh sẽ mô phỏng sự kế thừa ở một mức độ nhất định. Nó có thể được thực hiện!
i) Bạn có thể sử dụng hệ thống hook , mong muốn mọi đứa trẻ C của cha mẹ P có một ghi đè nhất định cho chức năng F. Bạn có thể khiến trẻ đăng ký phần ghi đè của chúng, sẽ được lưu trữ và gọi khi được yêu cầu.
ii) Bạn có thể sử dụng tính năng căn chỉnh bộ nhớ cấu trúc để đưa trẻ em vào cha mẹ.
Điều này có thể gọn gàng nhưng không dễ để đưa ra giải pháp đáng tin cậy trong tương lai. Bạn sẽ dành nhiều thời gian để thiết kế hệ thống và không có gì đảm bảo rằng bạn sẽ không gặp phải vấn đề nửa chừng trong dự án. Thực hiện nhiều kế thừa thậm chí còn khó hơn, nếu không muốn nói là gần như không thể.
b) Bạn có thể sử dụng chính sách đặt tên nhất quán và sử dụng phương pháp phân chia và chinh phục để tạo chương trình. Nó sẽ không có bất kỳ sự kế thừa nào nhưng vì các chức năng của bạn nhỏ, dễ hiểu và được định dạng nhất quán nên bạn không cần nó. Số lượng mã bạn cần viết tăng lên, rất khó để tập trung và không chịu thua các giải pháp dễ dàng (hack). Tuy nhiên, cách mã hóa ninja này là cách mã hóa C. Giữ cân bằng giữa tự do cấp thấp và viết mã tốt. Cách tốt để đạt được điều này là viết nguyên mẫu bằng ngôn ngữ chức năng. Ví dụ, Haskell cực kỳ tốt cho các thuật toán tạo mẫu.
Tôi có xu hướng tiếp cận b. Tôi đã viết một giải pháp khả thi bằng cách sử dụng phương pháp a, và tôi sẽ thành thật, nó cảm thấy rất không tự nhiên khi sử dụng mã đó.