6

Tôi biết rằng về nguyên tắc có thể chuyển ngay cả các ngôn ngữ thủ tục như C hoặc MATLAB thành các ngôn ngữ hướng đối tượng. Câu hỏi này đã được thảo luận khá tốt herehere.Nguyên tắc hướng đối tượng có nên được áp dụng trong các ngôn ngữ thủ tục không?

Những gì tôi thấy bị thiếu trong các cuộc thảo luận này và các tham chiếu trong đó là giải thích về việc một trong các có nên áp dụng các nguyên tắc như vậy không. Có điều gì cụ thể để đạt được khi làm như vậy không? Rõ ràng là có thể, nhưng có phải là khuyến khích làm như vậy không? Có bất kỳ ví dụ nào trong số các dự án nguồn mở nơi thực hành này dẫn đến những lợi thế rõ ràng không?

Làm rõ

Có lẽ một ví dụ là theo thứ tự.

Tôi đã thừa hưởng một số mã MATLAB thực hiện một số thuật toán học máy. Có cơ bản là một chức năng duy nhất building_model đó, tùy thuộc vào một lá cờ được thông qua, hoặc sẽ đào tạo một mô hình hoặc sử dụng nó để dự đoán một giá trị tương lai:

building_model('train', ...) % ... stands for the data with which the model is trained 

Các mô hình chính nó được thực hiện với MATLAB biến cố định bên trong building_model.

Tôi đã tách rời building_model thành hai chức năng, một cho đào tạo và một để dự đoán. Các mô hình được sử dụng để được thực hiện như biến dai dẳng hiện đang ra ngoài, có thể nói:

model = new_model() 
model = model_train(model, ...) 
prediction = model_predict(model) 

này, nói đại khái, như xa như tôi có thể quản lý bắt chước một số tính năng của OOP trong MATLAB. Mô hình mô hình xây dựng của tôi hiện hoạt động khá giống với một lớp, với một hàm tạo và hai phương thức model_trainmodel_predict. Tôi đã đạt được một số mức độ đóng gói (mặc dù không có gì ngăn cản người gọi từ fiddling với internals của model), và đa hình về nguyên tắc cũng có thể được cung cấp. Là một phần thưởng thêm, tôi nhận được lệnh tách/truy vấn gần như miễn phí vì model_predict không trả lại model và do đó không thể thay đổi model.

(độc giả Astute sẽ chỉ ra rằng MATLAB đã có một hệ thống hướng đối tượng. Vì những lý do khác nhau, bao gồm cả hiệu suất và khả năng tương thích với các phiên bản cũ, tôi không thể sử dụng nó.)

tôi có thể tưởng tượng một cơ chế tương tự trong C nơi bạn sẽ thiết kế một số cấu trúc dữ liệu và các hàm viết có đối số đầu tiên sẽ là một cá thể của cấu trúc dữ liệu đó.

Điều tôi muốn biết là, tôi có thể đẩy cách lập trình này đến mức nào? Đây có phải là mẫu được chấp nhận phổ biến không (ở đó, tôi đã nói từ đó)? Có bất kỳ vấn đề về hiệu suất nào tôi nên chú ý không?

+1

Đó là điều thường thiếu trong các cuộc thảo luận về thực tiễn hướng đối tượng nói chung. Bạn vẫn phải quyết định nếu OOP là thiết kế phù hợp, cho dù nó được xây dựng trong ngôn ngữ hay chỉ đơn giản là một phương pháp thiết kế mà bạn cố gắng áp dụng mà không cần bất kỳ sự trợ giúp nào từ ngôn ngữ. Các ưu điểm (và nhược điểm) tương tự cũng áp dụng theo cách nào đó. –

Trả lời

2

Tôi nghĩ rằng đây là một cuộc thảo luận thực sự quan trọng. Tôi nghĩ rằng nó là an toàn để nói, rằng OOP không phải luôn luôn là giải pháp tốt nhất trong tất cả các ngôn ngữ. Ví dụ: C++ hoặc Python, OOP thường là cách tự nhiên để ví dụ: đóng gói dữ liệu. Những ngôn ngữ này được thiết kế để tập trung vào các lớp học. Trong các ngôn ngữ khác, việc tạo mã chất lượng tốt có thể dễ dàng hơn theo những cách khác.

Tôi nghĩ Lisp thường là một ví dụ hay. Nó có một hệ thống OOP thực sự tốt (CLOS) mà tôi sẽ nói là thực sự hoàn chỉnh. Nhưng vẫn còn, OOP không được sử dụng gần như nhiều trong Common Lisp như trong Python hay C++, vì nó là một tính năng tiện lợi hơn là cái gì đó là cần thiết để cung cấp các khối xây dựng phần mềm cơ bản.

Cho dù bạn nên sử dụng OOP hay không thực sự phụ thuộc vào vấn đề bạn đang cố giải quyết. Đối với một ví dụ, tôi nghĩ rằng các công cụ GUI có thể thực sự hữu ích để giải quyết với OOP.

+0

+1 "Tôi nghĩ rằng các công cụ GUI có thể thực sự hữu ích để giải quyết với OOP." Đây là cách Tiến sĩ Stroustrup giới thiệu OOP cho học sinh của mình. – AraK

-1

Hướng đối tượng là một phương tiện để đạt được các mục tiêu kỹ thuật phần mềm.

Mục tiêu: Dễ bảo trì, Khả năng mở rộng, Mã nguồn được tổ chức (khả năng tìm kiếm, v.v ...)
OO Thi công: Đóng gói (chỉ phương pháp thuộc sở hữu của 'kiểu dữ liệu/cấu trúc' có thể hoạt động trên dữ liệu của nó)

Mục tiêu: Khả năng phát triển các tính năng mới mà không sửa đổi những cái hiện có, Mã tái sử dụng
OO Thi công : thừa kế thực hiện, Polymorphism

Mục tiêu: Abstractions (bạn không cần phải cam kết một loại đặc biệt hoặc các hoạt động, sự thay đổi thực hiện mà không thay đổi khách hàng)
OO thi công: giao diện thừa kế, giao diện, lớp trừu tượng

Mục tiêu không cần biện minh. Cho dù bạn muốn/cần sự hỗ trợ của một ngôn ngữ OO hay không là phụ thuộc vào tình hình cụ thể của bạn. Nếu bạn cần sử dụng C, bạn vẫn có thể bắt chước một số cấu trúc OO, và hy vọng tận hưởng những lợi ích của nó.

Hãy nhớ rằng bạn hoàn toàn có thể phát triển một mớ hỗn độn mã lớn với việc tuân thủ tất cả các nguyên tắc OO.

tôi chắc chắn rằng những người khác có thể liệt kê các mục tiêu và các ví dụ khác (và biết làm thế nào để chỉnh sửa bảng trong bài viết stackoverflow)

+3

Tôi thực sự không đồng ý rằng OO là * * có nghĩa là để đạt được các mục tiêu trên. Tất cả điều này là thực sự có thể trước khi phát minh ra OO. –