Gdy czytam niektóre podręczniki algorytmów, są one pełne sprytnych procedur dla niektórych problemów (sortowanie, najkrótsza ścieżka) lub niektórych ogólnych metod (algorytmy rekurencyjne, dzielenie i podbijanie, programowanie dynamiczne ...). Znalazłem tam niewiele śladów programowania obiektowego; (Dlaczego są bardziej zorientowane na procedury?).
Potem pomyślałem:
- Jaki jest związek między algorytmami a OOP? Czy to dwa niezależne tematy?
- Czy są jakieś problemy, które OOP może przedstawić i rozwiązać?
- W jaki sposób OOP może pomóc algorytmom? Lub w jakim kierunku może to wpłynąć?
object-oriented
algorithms
Ahmad
źródło
źródło
Odpowiedzi:
Po pierwsze, zdefiniujmy, co rozumiemy przez OOP. Przez OOP mam na myśli przede wszystkim:
Teraz, aby odpowiedzieć na twoje pytanie:
Tak.
Nie. OOP podstawowy oferuje wygodę i możliwość wnioskowania o kodzie dla programisty. Nie zwiększa twojej siły wyrazu.
Tak jak powiedziałem powyżej. Oba punkty, które opisałem OOP jako obowiązujące tutaj. Umiejętność ukrywania szczegółów algorytmów i ich struktur danych może pomóc w uzasadnieniu całości. Wiele algorytmów zawiera szczegóły, z którymi użytkownik tego algorytmu nie powinien się bawić. Ukrywanie tych szczegółów bardzo pomaga.
Świetna jest także zdolność do zachowania polimorficznego.
List
definiuje się jako możliwość dodawania / usuwania / usuwania elementów w dowolnym miejscu w kolekcji. Ale można go zaimplementować jako tablicę o zmiennym rozmiarze, podwójnie połączoną lub pojedynczo połączoną itp. Posiadanie jednego interfejsu API dla wielu implementacji może pomóc w ponownym użyciu.Jak powiedziałem, OOP nie jest konieczne do implementacji algorytmu. Ponadto wiele algorytmów jest starych i utworzonych, gdy OOP wciąż nie było rozpowszechnione. Może to być także kwestia historyczna.
źródło
Algorytmy i OOP są dwoma odmiennymi terminami, które mają tylko wspólną cechę, że są terminami CS . Po prostu - algorytm jest jak przepis na gotowanie : aby zrobić x , potrzebujesz następujących składników i wykonaj kroki 1,2,3,4,5,6 ... następnie przygotujesz swój posiłek.
To powiedziawszy, wydaje się naturalne, że algorytmy można opisać w sposób proceduralny . Procedura oznacza nic innego jak: najpierw zrób x, a następnie zrób y .
Częstym problemem jest: »Jak posortować zestaw x ?«. Łatwe do zrozumienia rozwiązanie to
bubble-sort
:To jest algorytmiczny / słowny opis
bubblesort
algorytmu.Nadchodzi implementacja proceduralna / pseudokod
To było łatwe.
Jak to się ma do OOP ? Możesz użyć tego algorytmu do traktowania kolekcji (samego obiektu) obiektów :
Przykład w Javascripcie (chociaż nie ma czystego OO-Lingo , ale prawie nie ma płyty kotłowej i jest łatwy do zrozumienia)
Mamy a) kolekcję
objects
, b) metodę wspólną dla tej kolekcji,sort
która zawiera / streszcza algorytm sortowania oraz c) nasze obiekty: Piotr , Paweł i Maryja . Specyfikacja sortowania znajduje się tutaj .Z tego, co zostało powiedziane, powinno być jasne, odpowiedź powinna brzmieć: tak, są niezależni.
OOP to tylko jeden styl programowania. Nie może pomóc w żaden sposób. W przeciwnym razie można by zaimplementować algorytm w języku OO, aby zrobić coś z obiektami (jak pokazano)
Nie mogę myśleć o jednym (ale to nie znaczy, że jest to niemożliwe). Ale jeśli spojrzysz na to odwrotnie: OOP jest przydatne, jeśli chcesz modelować niektóre problemy i rozwiązywać je za pomocą odpowiedniego algorytmu. Załóżmy, że masz rejestr
friends
was mógłby modelować je jakoobjects
zeproperties
i jeśli chceszlist
zfriends
posortowane w jakikolwiek sposób, można użyć przykładowy kod podany wyżej dokładnie to zrobić.Jak powiedziano: jest to bardziej naturalne , ponieważ procedura ma charakter algorytmów.
źródło
masz problem.
Model domeny biznesowej opisuje twój problem i pojęcia z dziedziny problemu, z którą zamierzasz się zmierzyć.
Algorytmy opisują sposób, w jaki zamierzasz rozwiązać swoje problemy, koncepcyjnie; jak będzie wyglądać twoja implementacja; i jak radzisz sobie z problemem po przetłumaczeniu go na terminy „Informatyka”.
Paradygmat programowania, niezależnie od tego, czy jest to OOP, funkcjonalne, logiczne, proceduralne, a nawet niestrukturalne, opisuje, w jaki sposób zamierzasz ustrukturyzować swoje rozwiązanie, jaką formę przyjmie, jakie koncepcje inżynierii oprogramowania zastosujesz, a które „ Programowanie teorii języka ”, które zamierzasz zastosować.
Mówiąc prościej, algorytmy ogólnie opisują twoje rozwiązanie problemu („To właśnie zamierzam zrobić”). Podczas programowania paradygmat dotyczy twojej faktycznej implementacji („Tak właśnie to zrobię”).
źródło
Algorytmy = opowiadanie historii „ jak ” (tj. Jak manipulować danymi wejściowymi za pomocą struktur danych w czasie, aby uzyskać pożądane wyniki)
OOP = „ metodologia ” obsługiwana przez języki OO do pisania programów (= algorytmy + struktury danych), która zapewnia bezpieczeństwo pamięci i abstrakcję
OOP to tylko paradygmat implementacji algorytmów.
Dobra analogia : filmy
Możesz nagrywać sceny, korzystając z kaskadera lub nie. Scenariusz (algorytm) się nie zmienia. Ludzie nie powinni widzieć żadnej różnicy w końcowym wyniku.
EDYCJA: możesz wypróbować dobrej jakości MOOC: https://www.coursera.org/course/algs4partI, który przeplata omawiane tematy (zwłaszcza podejście OOP) i daje istotę tego, o co tutaj pytasz.
źródło
Alexander Stepanov jest oryginalnym twórcą biblioteki standardowych szablonów C ++ (STL), która jest podstawową biblioteką algorytmów dla C ++. C ++ jest językiem opartym na wielu paradygmatach, który zawiera funkcje „Object Objected”, ale Alexander Stepanov ma to do powiedzenia na temat Object Orientation:
http://www.stlport.org/resources/StepanovUSA.html
Stepanov wyraził swoją bibliotekę algorytmów nie za pomocą Objects, ale Generic Iterators .
źródło
Algorytmy opisują, co powinien zrobić komputer. Struktura opisuje sposób rozmieszczenia algorytmu [w kodzie źródłowym]. OOP to styl programowania, który wykorzystuje pewne struktury „obiektowe”.
Książki o algorytmach często unikają OOP, ponieważ koncentrują się na algorytmie, a nie na strukturze. Fragmenty kodu, które w dużym stopniu opierają się na strukturze, są raczej złymi przykładami do umieszczenia w książce algorytmów. Podobnie książki OOP często unikają algorytmów, ponieważ zaśmiecają historię. Zaletą OOP jest jego płynność, a powiązanie go z algorytmem sprawia, że wydaje się on sztywniejszy. Chodzi bardziej o temat książki niż o cokolwiek innego.
W prawdziwym kodzie będziesz używać obu stron obok siebie. Z definicji nie można rozwiązać problemów z komputerem bez algorytmów i trudno będzie napisać dobre algorytmy bez struktury (OOP lub w inny sposób).
Jako przykład tego, gdzie się rozmazują, weź Programowanie dynamiczne. W książce algorytmów opisałbyś, jak wziąć jednorodny zestaw danych do tablicy i użyć programowania dynamicznego, aby znaleźć rozwiązanie. W książce OOP możesz natknąć się na strukturę taką jak Visitor, która jest sposobem na wykonywanie dowolnych algorytmów na zbiorze heterogenicznych obiektów. Przykład książki DP można uznać za bardzo prostego gościa działającego na obiektach w ogólnie oddolnej kolejności. Wzorzec gościa można uznać za szkielet problemu DP, ale brakuje mu mięsa i ziemniaków. W rzeczywistości często okazuje się, że często potrzebujesz obu razem: używasz wzorca gościa, aby radzić sobie z heterogenicznością w zestawie danych (DP jest w tym zły), i używasz DP w strukturze gościa, aby zorganizować algorytm w celu zminimalizowania czasu działania (odwiedzający nie robi
Widzimy także algorytmy działające ponad wzorami projektowymi. Przykłady trudniejsze do sformułowania na małej przestrzeni, ale kiedy już masz strukturę, zaczynasz chcieć manipulować tą strukturą i używasz do tego algorytmów.
To trudniejsze pytanie, niż ci się wydaje. W pierwszym rzędzie nie ma żadnego obliczeniowego powodu, dla którego potrzebujesz OOP do rozwiązania jakiegokolwiek problemu. Prostym dowodem jest to, że każdy program OOP jest kompilowany do asemblera, który jest zdecydowanie językiem innym niż OOP.
Jednak w szerszym schemacie rzeczy odpowiedź zaczyna być nieśmiała w kierunku „tak”. Rzadko jesteś ograniczony po prostu metodami obliczeniowymi. Przez większość czasu na takie równanie wpływają potrzeby biznesowe i umiejętności programistyczne. Wiele aplikacji dzisiaj nie mogłoby być napisanych bez OOP, nie dlatego, że OOP jest w jakiś sposób fundamentalny dla zadania, ale dlatego, że struktura dostarczona przez OOP była niezbędna do utrzymania projektu na właściwym poziomie i budżetu.
Nie oznacza to, że nigdy nie porzucimy OOP w przyszłości z powodu jakiejś śmiesznej nowej struktury. Mówi jedynie, że jest to jedno z najskuteczniejszych narzędzi w naszym zestawie narzędzi dla zaskakująco dużej części zadań programistycznych. Przyszłe problemy mogą skłonić nas do podejścia do rozwoju przy użyciu różnych struktur. Po pierwsze, oczekuję, że sieci neuronowe będą wymagały zupełnie innego podejścia programistycznego, które może, ale nie musi, być „obiektowe”.
Nie widzę, aby OOP znikało w najbliższej przyszłości ze względu na sposób myślenia projektantów algorytmów. Do tej pory zwykłym wzorem jest to, że ktoś projektuje algorytm, który nie wykorzystuje OOP. Społeczność OOP zdaje sobie sprawę, że algorytm tak naprawdę nie pasuje do struktury OOP i naprawdę nie musi tego robić, więc zawijają cały algorytm w strukturę OOP i zaczynają go używać. Zastanów się
boost::shared_ptr
. Algorytmy zliczania referencji, które znajdująshared_ptr
się w środku, nie są zbyt przyjazne dla OOP. Jednak wzorzec ten nie stał się popularny, dopóki nieshared_ptr
utworzono wokół niego opakowania OOP, które ujawniło możliwości algorytmów w formacie strukturalnym OOP. Teraz jest tak popularny, że stał się najnowszą specyfikacją dla C ++, C ++ 11.Dlaczego to tak udane? Algorytmy świetnie sprawdzają się w rozwiązywaniu problemów, ale często wymagają znacznych inwestycji początkowych w badania, aby zrozumieć, jak z nich korzystać. Rozwój zorientowany obiektowo jest bardzo skuteczny w pakowaniu takich algorytmów i zapewnianiu interfejsu, który wymaga mniejszej inwestycji początkowej.
źródło
Oprócz świetnych odpowiedzi wspomnę o dodatkowej pojęciowej podobieństwie między OOP i algorytmami.
Zarówno OOP, jak i Algorytmy silnie podkreślają użycie warunków wstępnych i końcowych w celu zapewnienia poprawności kodu.
Zasadniczo jest to standardowa praktyka we wszystkich obszarach informatyki; jednak ta zasada przewodnia prowadzi do ewolucyjnej ścieżki w OOP, co sprawia, że wzajemnie korzystne jest wdrażanie algorytmów w środowisku OOP.
W OOP można stworzyć grupę obiektów, które mogą spełnić ten sam kontrakt (warunki wstępne i dodatkowe) w celu implementacji interfejsu. Użytkownik takiego interfejsu nie będzie musiał wiedzieć, która implementacja jest używana w obiekcie bazowym, z wyjątkiem niektórych rzadkich sytuacji (w których występuje nieszczelna abstrakcja).
Algorytm jest implementacją kroków służących do wykonania obliczeń, które wezmą warunek wstępny i wytworzą warunek końcowy.
Dlatego można zapożyczyć ideę abstrakcji na zasadzie warunków wstępnych i następczych i zastosować ją do algorytmów. Przekonasz się, że czasami skomplikowane algorytmy można rozłożyć na mniejsze etapy, a te mniejsze etapy mogą pozwolić na różne strategie implementacyjne, o ile zostaną spełnione te same warunki wstępne i końcowe.
Implementując algorytmy w OOP, można uczynić te mniejsze kroki wymiennymi.
Na koniec należy pamiętać, że FP i OOP nie wykluczają się wzajemnie. Wszystko opisane powyżej może mieć również zastosowanie do FP.
źródło
Algorytmy dotyczą sposobu rozwiązania problemu (generowania danych wyjściowych na podstawie danych wejściowych), OOP polega na tym, jak sformułować lub wyrazić nasze rozwiązanie (etapy algorytmu).
Algorytm można opisać w języku naturalnym lub asemblerze, ale pojęcia, które mamy w języku naturalnym, pomagają nam pisać i rozumieć go lepiej. Na przykład algorytm sortowania bąbelkowego mógłby wyglądać następująco:
Aby ukryć szczegóły
swap
i odnieść je doA
zastosowanej składni i funkcji OOP, OO przybliża algorytm do naszego naturalnego języka i zrozumienia.Nie, jeśli uważasz, że dowolny program (lub algorytm) na komputerze zostanie przetłumaczony na zestaw instrukcji wykonywanych na procesorze ( maszynie Turinga ) i jeśli uznamy te instrukcje za ostateczny algorytm rozwiązujący problem na komputerze , wówczas OOP nie mogę zrobić nic więcej. Po prostu przybliża to ludzkie rozumienie i rozumowanie. To sposób na spakowanie naszych procedur i struktur danych.
Może pomóc w określeniu lub sformułowaniu algorytmu łatwiejszym lub bardziej zrozumiałym. Może ukrywać szczegóły i zapewniać duży obraz rozwiązania.
Teoretycznie algorytm jest pierwszy, a implementacja drugi . Ale w rzeczywistości nie możemy być pewni, że nasz algorytm działa zgodnie z oczekiwaniami, dopóki go nie prześledzimy lub nie wygenerujemy oczekiwanego wyniku. Komputery pomagają nam to zrobić, ale nie spodziewasz się, że napiszesz je w języku maszynowym (asembler).
W związku z tym OOP ułatwia wdrożenie, testowanie i udoskonalenie naszego algorytmu na komputerach i napisanie go dla komputera w języku zbliżonym do naszego języka naturalnego.
źródło