Czy mój projekt może przetrwać bez Object Orientation?

9

Piszę mały pakiet MATLAB, który rozwiąże pewne problemy numeryczne klasy. Istnieją 3 etapy algorytmu, a użytkownik ma 5 opcji do wyboru dla każdego etapu. Zaimplementowałem cały problem za pomocą funkcji i 3 skrzynek przełączników (po jednym dla każdego etapu algorytmu). Działa dobrze, ale zastanawiam się nad tym, aby zrobić więcej rzeczy (więcej niż 5 opcji i jeszcze jeden etap), a także zrobić port Python (niektórzy ludzie są zainteresowani).20

Zastanawiałem się, czy powinienem przejść na strukturę OOP (w której wcale nie jestem dobry), czy też powinienem trzymać się proceduralnych ram, które mam (w których jestem dobry). Upewniłem się w moim kodzie proceduralnym, że żadna funkcja nie robi dwóch rzeczy i że zachodzi minimalne nakładanie się (2 segmenty kodu prawie nigdy nie robią tego samego).

Przeprowadź migrację do SO, jeśli uważasz, że bardziej pasuje do ich domeny.

MATLABOOP
źródło

Odpowiedzi:

6

Nie ma potrzeby konwersji na platformę OOP, aby skorzystać z orientacji obiektowej tam, gdzie to pomaga. Należy zauważyć, że liczba funkcji jest mniejsza niż wskaźnik niż duplikacja kodu w obrębie tych funkcji i pomiędzy nimi lub długość tych funkcji. (Funkcja zawierająca ponad 100 wierszy kodu byłaby typowym wskaźnikiem „potencjału poprawy”).

Jeśli nie będziesz w stanie dostrzec części, w których orientacja obiektowa mogłaby pomóc, konwersja do struktury OOP nie byłaby najlepszym pierwszym krokiem. Zapytaj raczej kogoś, kto zna orientację obiektową, co można uprościć lub ulepszyć, a następnie spróbuj zrozumieć, dlaczego jest to uproszczenie lub ulepszenie.

Jeśli chcesz użyć frameworka takiego jak deal.II lub PETSc, użyj ich, jeśli oferowana przez nich funkcjonalność jest dla Ciebie przydatna, a nie dlatego, że uważasz, że sprawi, że Twój własny kod będzie lepszy lub łatwiejszy w utrzymaniu. Ale jesteś już w ramach MATLAB, więc jest mało prawdopodobne, że chcesz zamiast tego przejść na platformę OOP C ++. (MATLAB oferuje pełne wsparcie OOP, jak zapewne już wiesz.)

W przypadku portu Python po prostu zrób to na podstawie bieżącej wiedzy na początek, a potem zacznij od nowa po tym, jak nauczysz się wystarczająco, aby znacznie poprawić.

Thomas Klimpel
źródło
Zgadzam się z tobą, że przejście na ramy tutaj jest przesadą. Myślę, że ich interfejsy API i architektura są przykładami dobrego projektu i warto je wykorzystać jako przewodnik.
Geoff Oxberry
3

To pytanie może być odpowiednie w przypadku przepełnienia stosu. Myślę, że jest to również dobre dopasowanie, ponieważ jest to powszechny problem w nauce obliczeniowej.

Jeśli chodzi o algorytmy komponowania, dobrym przykładem biblioteki, która robi to dobrze, jest PETSc, jeśli umiesz czytać kod C. Obiektowy styl programowania może pomóc w enkapsulacji danych, ale jako prosty pierwszy krok możesz chcieć, aby każdy wybór na scenie był funkcją ze wspólnym interfejsem. Następnie, dla swojego algorytmu, wprowadź funkcję dla każdego etapu jako dane wejściowe i niech główny algorytm wywoła funkcję dla każdego etapu.

Geoff Oxberry
źródło
Jestem zaintrygowany. Czy proponujesz PETSc jako dobrą bibliotekę do nauki OOP lub kodowania proceduralnego? Czy znasz jakąś czytelną bibliotekę, która dobrze radzi sobie z OOP?
Zapytanie
Myślę, że PETSc jest dobrym przykładem dużego oprogramowania i ogólnie jest bardzo dobrze udokumentowane. W dziedzinie informatyki myślę, że PETSc, Trilinos, deal.II i FEniCS dobrze sobie radzą z dobrą dokumentacją, a wszystkie są napisane w stylu OOP. Z wahaniem stwierdzam, że powinieneś nauczyć się od nich OOP; prawdopodobnie lepiej jest najpierw uczyć się z podręcznika, a potem przyjrzeć się kodowi z prawdziwego świata.
Geoff Oxberry
2

Nie wszystko jest dobrze modelowane przez obiekty. Rozważmy , zwykle system OO będzie traktował s jako obiekty, a jako metodę , ale to nie odpowiada naszej naturalnej interpretacji jako funkcji binarnej poprawki ; wprowadza nienaturalną asymetrię między pierwszym jako obiektem, dla którego metoda jest zdefiniowana, a drugim, który jest argumentem dla tej metody (daje to kludges podobne i w Pythonie).1+11+1.plus(1)1+1plus(1,1)1plus__plus____rplus__

Więc nie uważaj, że musisz wcisnąć kwadratowy kołek w okrągły otwór, jeśli algorytm wygląda dobrze w zwykły sposób proceduralny, zachowaj go w ten sposób. Jeśli konieczne jest włączenie go do systemu OO, zawsze możesz umieścić interfejs OO w kodzie innym niż OO. Koderzy C ++ robią to codziennie (a nawet otrzymują za to wynagrodzenie).

n00b
źródło