Làm thế nào để giải thích OOP cho một lập trình viên MATLAB? [đóng cửa]


8

Tôi có rất nhiều người bạn đến từ nền tảng kỹ thuật điện / vật lý / cơ khí, và tò mò về "OOP" là gì. Tất cả họ đều biết Matlab khá tốt, vì vậy họ có nền tảng lập trình cơ bản; nhưng họ có một thời gian rất khó nắm bắt một hệ thống loại phức tạp có thể hưởng lợi từ các khái niệm mà OOP giới thiệu.

Bất cứ ai có thể đề xuất một cách tôi có thể cố gắng để giải thích nó cho họ? Bản thân tôi không quen với Matlab, vì vậy tôi gặp khó khăn khi tìm kiếm sự tương đồng. Tôi nghĩ rằng việc sử dụng các ví dụ đơn giản như hình dạng hoặc động vật là một chút quá trừu tượng đối với những kỹ sư đó. Cho đến nay tôi đã thử sử dụng giao diện Ma trận so với triển khai dựa trên mảng / thưa thớt / bất cứ điều gì, nhưng điều đó không hoạt động tốt, có lẽ vì các loại ma trận khác nhau đã được hỗ trợ tốt trong Matlab.


1
Vì lợi ích của bạn, bạn có thể giả định rằng MATLAB giống như C, ngoại trừ nó có thư viện đa dạng hơn, tài liệu dễ dàng hơn và cú pháp hơi khác.
PearsonArtPhoto

3
Nếu họ tò mò, điều gì ngăn họ googling một chút và đọc bất kỳ giới thiệu ngắn gọn? Tôi không thể tưởng tượng một kỹ sư giỏi thực sự tò mò về điều gì đó và không theo đuổi sở thích đó.

2
@Pear Tôi nghĩ vấn đề không chỉ là ngôn ngữ, mà là việc sử dụng chúng tạo ra nó. Ví dụ, như tôi hiểu, thực tế họ không bao giờ định nghĩa các loại mới. Tuy nhiên, đó là một bản tóm tắt ngắn tốt :)
Oak

4
Chạy trốn! Chạy trốn!
Công việc

3
Đừng làm hỏng chúng. Họ sẽ tốt hơn nhiều nếu không có OOP vô dụng.
SK-logic

Câu trả lời:


14

Từ năm 2008, Matlab hỗ trợ lập trình hướng đối tượng. Vì vậy, nếu họ muốn tìm hiểu về OOP theo cách họ quen thuộc, họ có thể muốn xem tài liệu Matlab về OOP , đặc biệt là các ví dụ .

Cách đây một thời gian, tôi đã giới thiệu một số đồng nghiệp sử dụng Matlab của mình cho OOP. Dưới đây là một số ví dụ tôi đã sử dụng.

Điều quan trọng, mọi thứ bạn làm với OOP, bạn cũng có thể làm khác. Những gì OOP cho phép bạn là (1) tạo ra các cấu trúc tuyệt vời hơn, (2) mã gói và (3) giúp dễ dàng mô đun hóa mã và lập trình nhanh hơn.

  1. Cấu trúc với các trường tự động cập nhật chính họ. Ví dụ: bạn lưu trữ tọa độ bằng pixel (vì bạn đo nó trên hình ảnh), nhưng để tính toán khoảng cách, bạn muốn có nó bằng micron. Lưu trữ cả hai trong một cấu trúc là có vấn đề, bởi vì nếu bạn thay đổi một, bạn không được quên thay đổi cái khác (và bạn sẽ). Do đó, bạn chọn lưu trữ tất cả các tọa độ tính bằng micron, điều đó có nghĩa là mỗi khi bạn cần nó bằng pixel, bạn phải chuyển đổi, điều này gây khó chịu và có thể dễ bị lỗi.
     
    Với một đối tượng, bạn biến "tọa độ theo pixel" thành thuộc tính phụ thuộc, chuyển đổi sẽ tự động và bạn không phải lo lắng về việc cập nhật hai tọa độ cùng một lúc. Tất nhiên, bạn có thể làm nhiều hơn nữa. Ví dụ: cấu trúc của bạn có thể có phương thức 'chỉnh sửa', mở ra GUI, để bạn có thể dễ dàng chỉnh sửa các giá trị. Hoặc nó có thể có một phương thức lưu được gọi bất cứ khi nào một giá trị trong cấu trúc thay đổi.

  2. Bạn có thể gói các chức năng với cấu trúc dữ liệu của bạn. Ví dụ: bạn có thể có chức năng vẽ biểu đồ tùy chỉnh cho dữ liệu mà bạn gọi plot(myDataStructure). Tương tự, bạn có thể có dispcác phương thức tùy chỉnh hoặc thậm chí có các phương thức xử lý dữ liệu của bạn được đính kèm với dữ liệu của bạn.


Tôi nhớ từ năm 2008, rằng OOP trong Matlab rất chậm.
quant_dev

@quant_dev: Mọi thứ đã tốt hơn (năm 2008 là lần đầu tiên họ cung cấp tính năng này, đã có một số tối ưu hóa kể từ đó), mặc dù vẫn có một chi phí lớn hơn khi gọi một phương thức của đối tượng do người dùng xác định so với gọi hàm. Nếu bạn không sử dụng OOP toàn diện như trong C ++, nhưng trộn OOP và các chức năng bình thường, trong đó đối tượng đóng vai trò là giao diện giữa người dùng và các chức năng thực hiện công việc thực tế, hệ thống hoạt động khá tốt.
Jonas

Mặc dù tôi thích các ví dụ của bạn, nhưng chúng thực sự không có ích trừ khi bạn đang tìm kiếm việc sử dụng lại chính (đó là những gì OOP vượt trội). Nếu tôi sẽ chuyển đổi từ pixel thành micron rất nhiều và không sử dụng OOP, thì việc gọi hàm microns = convert_to_microns (pixel) sẽ có vẻ dễ dàng và quen thuộc hơn so với việc xây dựng một số cấu trúc OOP chính xung quanh các cuộc gọi lớp . Sử dụng sự trừu tượng là rất tốt, nhưng với việc học OOP trong một môi trường thủ tục hơn, cần phải có một động lực mạnh mẽ về lý do tại sao quá trình suy nghĩ của họ nên thay đổi.
Jeff Langemeier

Tôi có một câu hỏi nghiêm túc. Tại sao đồ chơi đó trong Matlab được gọi là OOP nhưng trong C thì nó không phải là OOP? Ngôn ngữ AC structvới các phương thức hấp dẫn hơn nhiều so với ngôn ngữ trong Matlab.
ar2015

@ ar2015: bạn có hỏi tại sao bất kỳ tính năng nào trong Matlab được xử lý như thể Matlab là ngôn ngữ lập trình nghiêm túc không? Hoặc bạn có tin structvào C có các tính năng OOP cơ bản mà các lớp Matlab thiếu?
Jonas

4

Đừng cố gắng tìm một ví dụ bắc cầu. OOP rất phù hợp trong các lĩnh vực hoàn toàn khác so với 'mã kiểu matlab' là (và ngược lại). Tôi sẽ đưa ra một lời giải thích tương tự mà tôi sẽ trao cho một người biết một chút về lập trình thủ tục nhưng chưa bao giờ làm việc với các cấu trúc hoặc cấu trúc dữ liệu tương tự.


2

Mã MATLAB được Vector hóa có cảm giác khai báo, có chức năng mạnh mẽ, trong đó ma trận thường được xem là mẫu trong một số không gian và hoạt động trên các ma trận đó như là các phép biến đổi của không gian đó. Khi một hiện tượng, quá trình hoặc thực thể được mô hình hóa bằng cách sử dụng MATLAB (vector hóa), thường tồn tại một biểu diễn số rõ ràng hoạt động như một trung gian giữa logic chương trình và các yếu tố khái niệm của thực thể được mô hình hóa. Kết quả là, độ phức tạp trong miền vấn đề có xu hướng được phản ánh là độ phức tạp số, thay vì độ phức tạp của logic chương trình hoặc luồng điều khiển.

Mô hình hướng đối tượng có một cảm giác rất khác: Nó thường được sử dụng kết hợp với cách tiếp cận trực tiếp hơn nhiều để mô hình hóa các mối quan hệ cấu trúc trên thế giới. Trong nhiều trường hợp, chương trình OO là mô hình trực tiếp của một thực thể, trong đó logic chương trình xây dựng nhân bản, trực tiếp hoặc gián tiếp, các thuộc tính và thuộc tính của hệ thống được mô hình hóa. Do đó, logic chương trình OO có xu hướng có "chiều sâu" cấu trúc hơn (và có thể phức tạp), vì nó phản ánh trực tiếp hơn những rắc rối của hệ thống đang được thử nghiệm.

Phải nói rằng, có nhiều tình huống trong đó mô hình Mô hình hóa đối tượng rất phù hợp với cách hiểu và mô tả một vấn đề cụ thể. Đây là trường hợp đặc biệt khi một người đang cố gắng mô hình hóa các thực thể rời rạc với phạm vi thuộc tính và hành vi đa dạng hơn, như vậy việc xem xét từng thực thể riêng lẻ và riêng rẽ có nhiều thông tin hơn so với việc xem xét từng thuộc tính riêng lẻ và các thực thể với nhau như một quần thể.

Với OOP, bạn dành thời gian suy nghĩ về các thực thể riêng lẻ và các thuộc tính của chúng. Hành vi tập thể khó hình dung & quan sát hơn. Cấu trúc và mối quan hệ có xu hướng được thể hiện rõ ràng trong mã.

Với MATLAB được vector hóa, bạn dành thời gian suy nghĩ về quần thể các thực thể. Hành vi tập thể dễ quan sát hơn. Các cấu trúc và các mối quan hệ có xu hướng được thể hiện ngầm trong mã.


1

Hầu hết các lập trình viên đều quen thuộc với một khía cạnh chính của lập trình hướng đối tượng, cấu trúc. Tôi sẽ giải thích rằng một đối tượng giống như một cấu trúc, nhưng có các lệnh gọi hàm riêng để xử lý dữ liệu bên trong cấu trúc. Sau đó từ từ thêm vào các chi tiết bổ sung, như kế thừa, chuyển các hàm cùng, v.v.


Tôi đã thử cách tiếp cận "các cấu trúc với các chức năng riêng của chúng" và sau đó giải thích rằng tùy thuộc vào việc thực hiện cấu trúc, hành vi của các chức năng đó có thể thay đổi. Điều đó mang lại cho tôi một vẻ ngoài rất "tốt cho nó" ...
Oak

Nếu họ là nhà toán học, hãy sử dụng từ "tuple" thay vì "cấu trúc".
Ingo

1
Matlab không giải quyết các bộ dữ liệu, nhưng ...
PearsonArtPhoto

1

Họ đều biết Matlab khá rõ

Sau đó, nó khá đơn giản: hãy để họ thử simulink. Mô hình Simulink là trong tinh thần OOP. Nếu họ hiểu cách tạo mô hình simulink và nếu họ biết simulink hoạt động như thế nào, thì họ đã biết OO là gì.


0

Matlab chỉ là một ngôn ngữ. OOP là khái niệm.

Hãy thử giải thích các khái niệm bằng cách sử dụng một lời giải thích ít dẫn dắt hơn. Các kỹ sư chắc chắn hiểu các miền và đơn vị khác nhau (ví dụ: thêm nhiệt độ vào khoảng cách sẽ là số lẻ), vì vậy họ nên hiểu trực giác về đóng gói và đa hình mà không cần các ví dụ cụ thể trong Matlab. Bạn sẽ có thể giải thích trừu tượng đủ dễ dàng. Kế thừa và thành phần sẽ khó giải thích hơn nếu không có ví dụ, nhưng giải thích khái niệm rõ ràng và họ nên hiểu.

Generics so với tính đặc hiệu của loại nên được thúc đẩy thông qua các ví dụ từ nền tảng toán học của họ. Lập trình hàm, truyền các hàm và lambdas không phải là OOP per se, và điều đó khó giải thích hơn nếu không có nền tảng toán học trừu tượng hơn thường được trình bày cho các kỹ sư (đã nghiên cứu cả kỹ thuật, phần mềm và toán học, tôi có một số hiểu biết sâu sắc về các chuyên ngành khác nhau của họ).

Bạn có thể không thể cung cấp các ví dụ trực tiếp bằng Matlab, nhưng bạn chắc chắn có thể giải thích sự trừu tượng hóa và đóng gói bằng các ví dụ bao gồm các cấu trúc. Ngay cả trong các ngôn ngữ mà bạn không thể gói gọn các hàm (phương thức) với dữ liệu của mình, bạn vẫn có thể giải thích cách các hàm nhất định chỉ được xác định cho các miền nhất định.

Xem xét rằng nhiều nhà phát triển coi trọng thành phần hơn sự kế thừa, bạn có thể giải thích sự kế thừa, thành phần và giá trị tương đối của cả hai.

Bạn có thể thúc đẩy tính đa hình một cách tự nhiên bằng cách xem xét sự khác biệt giữa các số nguyên, số hữu tỷ, số thực và số phức, sau đó giải thích cách các toán tử số học "bình thường" là các hàm (phương thức), nhưng ngay cả khi toán tử (ex '+') trông giống nhau, nó là một chức năng khác nhau khi được sử dụng với các tên miền khác nhau.

Chúc may mắn!


-1

Tôi là một kỹ sư điện, nhưng tôi có nhiều điểm chung với các lập trình viên CS hơn là lập trình viên EE. Cụ thể, tôi đã cố gắng, nhưng không thành công, để thuyết phục các sinh viên của mình viết ít nhất một nửa mã có cấu trúc và mô đun, chứ đừng nói đến mã hướng đối tượng.

Khi tôi cố gắng sử dụng các tính năng OO của MATLAB, tôi nhanh chóng gặp phải các vấn đề rất khó chịu. Một phương thức trong một lớp ĐÃ lấy một đối tượng của lớp đó làm đối số đầu tiên của nó và HAS trả về đối tượng nếu nó sửa đổi đối tượng. Điều đó làm cho mã như

methods
     function obj_new = modi_object(obj,some_other_data)
     ...
     end
...
end

và cách sử dụng như

new_obj = objec.modi_object(some_piece_of_data);

Tôi đã gần như từ bỏ. Tôi đề nghị bạn để chúng một mình, cho đến khi một số hỗ trợ OO phong nha đi vào MATLAB. Thay vào đó, hãy yêu cầu họ từ bỏ MATLAB và thử sử dụng Python hoặc tương tự. Tôi đang cố gắng (và thất bại) để làm điều đó.

Ít nhất, MATLAB OO hoàn toàn không phải là một cổng tốt để học OO. Bạn có thể đặt chúng ra cho cuộc sống.


Tại sao các downvote?
Milind R

Tôi nhận ra điều này đã cũ, nhưng với những gì đáng giá, điều đầu tiên bạn đề cập đến là một tính năng và nó phải được thực hiện với công văn động . Thứ hai là không cần thiết; nếu bạn muốn thay đổi đối tượng hiện tại thay vì gán lại, tất cả những gì bạn phải làm là kế thừa từ siêu lớp Xử lý. Đối với python, tôi thấy việc triển khai một lớp trông tệ hơn / xấu hơn nhiều so với MATLAB, không biết tại sao bạn lại nói như vậy.
Tasos Papastylianou
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.