Dự án của tôi có thể tồn tại mà không cần Định hướng đối tượng không?


9

Tôi đang viết một gói MATLAB nhỏ sẽ giải quyết một số bài toán số nhất định. Có 3 giai đoạn của thuật toán và người dùng có 5 lựa chọn cho mỗi giai đoạn. Tôi đã thực hiện toàn bộ vấn đề bằng cách sử dụng hàm và 3 trường hợp chuyển đổi (một cho mỗi giai đoạn thuật toán). Nó hoạt động tốt nhưng tôi đang xem xét làm cho nó làm được nhiều việc hơn (hơn 5 lựa chọn và thêm một giai đoạn) và cũng tạo ra một cổng Python (một số người quan tâm).20

Tôi đã tự hỏi liệu tôi có nên chuyển đổi sang khung OOP (mà tôi không giỏi chút nào) hay liệu tôi có nên gắn bó với khung thủ tục mà tôi có (mà tôi giỏi). Tôi đã đảm bảo trong mã thủ tục của mình rằng không có hàm nào thực hiện hai điều và có sự chồng chéo tối thiểu (2 phân đoạn mã hầu như không bao giờ làm điều tương tự).

Vui lòng di chuyển cái này sang SO nếu bạn cảm thấy nó phù hợp hơn trong miền của họ.

Câu trả lời:


6

Không cần phải chuyển đổi sang khung OOP, để hưởng lợi từ việc định hướng đối tượng, nơi nó giúp. Lưu ý rằng số lượng chức năng ít hơn một chỉ số so với sao chép mã trong và giữa các chức năng này hoặc độ dài của các chức năng này. (Một hàm có hơn 100 dòng mã sẽ là một dấu hiệu điển hình cho "tiềm năng cải tiến".)

Nếu bạn không thể phát hiện ra các phần mà hướng đối tượng sẽ trợ giúp, chuyển đổi sang khung OOP sẽ không phải là bước đầu tiên tốt nhất. Thay vì hỏi ai đó quen thuộc với định hướng đối tượng những gì có thể được đơn giản hóa hoặc cải thiện, và sau đó cố gắng hiểu tại sao nó là đơn giản hóa hoặc cải tiến.

Nếu bạn muốn sử dụng một khung như deal.II hoặc PETSc, hãy sử dụng chúng nếu chức năng họ cung cấp hữu ích cho bạn, không phải vì bạn nghĩ rằng nó sẽ giúp mã của bạn tốt hơn hoặc dễ bảo trì hơn. Nhưng bạn đã ở trong khung MATLAB, do đó không chắc là bạn muốn thay đổi sang khung COP OOP thay thế. (MATLAB cung cấp hỗ trợ OOP đầy đủ, như bạn có thể đã biết.)

Đối với cổng Python, chỉ cần thực hiện dựa trên kiến ​​thức hiện tại của bạn để bắt đầu và có lần bắt đầu thứ hai sau khi bạn đã học đủ để làm cho nó tốt hơn đáng kể.


Tôi đồng ý với bạn rằng chuyển đổi sang một khung ở đây là quá mức cần thiết. Tôi nghĩ rằng API và kiến ​​trúc của họ là những ví dụ về thiết kế tốt và đáng sử dụng làm hướng dẫn.
Geoff Oxberry

3

Câu hỏi này có thể phù hợp với Stack Overflow. Tôi nghĩ nó cũng phù hợp ở đây vì đây là vấn đề phổ biến trong khoa học tính toán.

Về mặt soạn thảo thuật toán, một ví dụ điển hình của thư viện thực hiện tốt điều này là PETSc, nếu bạn có thể đọc mã C. Phong cách lập trình hướng đối tượng có thể giúp đóng gói dữ liệu, nhưng là bước đầu tiên đơn giản, bạn có thể chỉ muốn thực hiện mỗi lựa chọn cho một giai đoạn một chức năng với giao diện chung. Sau đó, đối với thuật toán của bạn, chuyển một hàm cho từng giai đoạn làm đầu vào và có thuật toán chính gọi hàm cho từng giai đoạn.


Tôi tò mò. Bạn đang đề xuất PETSc như một thư viện tốt để học OOP từ hoặc mã hóa thủ tục? Bạn có biết thư viện nào có thể đọc được OOP không?
Thắc mắc

Tôi nghĩ rằng PETSc là một ví dụ điển hình về phần mềm, và nó thường được ghi chép lại rất tốt. Trong khoa học tính toán, tôi nghĩ PETSc, Trilinos, deal.II và FEniCS làm tốt công việc được ghi chép tốt, và tất cả chúng đều được viết theo phong cách OOP. Tôi ngần ngại nói rằng bạn nên học OOP từ họ; Bạn có lẽ tốt hơn hết là học từ sách giáo khoa trước, sau đó nhìn vào mã thế giới thực.
Geoff Oxberry

2

Không phải tất cả mọi thứ được mô hình tốt bởi các đối tượng. Xem xét1+1, thông thường, một hệ thống OO sẽ coi 1s là các đối tượng và +là một phương thức 1.plus(1), nhưng điều này không tương ứng với cách giải thích tự nhiên của chúng ta về1+1 như một hàm nhị phân plus(1,1) ; nó đưa ra một sự bất đối xứng không tự nhiên giữa cái đầu tiên 1là đối tượng mà phương thức plusđược định nghĩa và cái thứ hai là đối số của phương thức đó (điều này làm phát sinh các loại như __plus____rplus__trong Python).

Vì vậy, đừng cảm thấy rằng bạn cần buộc chốt vuông vào lỗ tròn, nếu thuật toán của bạn trông ổn theo kiểu thủ tục đơn giản thì hãy giữ nó như thế. Nếu nó cần được đưa vào hệ thống OO, bạn luôn có thể đặt giao diện OO trên mã không OO của mình. Các lập trình viên C ++ làm điều này mỗi ngày (và thậm chí được trả tiền cho nó).

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.