Programuję w Javie w bardzo zorientowanym obiektowo (OO) stylu. OOP przychodzi mi bardzo intuicyjnie, ale mam bardzo małą wiedzę na temat innych rodzajów programowania.
Czym dokładnie jest programowanie proceduralne ? Czym dokładnie różni się od OOP? Czy to to samo, co programowanie funkcjonalne ?
Kiedyś myślałem, że każde programowanie, które nie jest „t OO”, jest proceduralne. Zaczynam uważać, że to nieprawda.
Komentarze
- Dzielenie się swoimi badaniami pomaga wszystkim. Powiedz nam, co myślisz ' próbowałem i dlaczego nie spełnia ono Twoich potrzeb. To pokazuje, że poświęciłeś czas, aby spróbować sobie pomóc, oszczędza nam to powtarzania oczywistych odpowiedzi, a przede wszystkim pomaga uzyskać więcej konkretna i odpowiednia odpowiedź. Zobacz także Jak zadawać pytania
- Programowanie proceduralne to nie to samo, co programowanie funkcjonalne; to ' to właściwie to samo, co programowanie obiektowe, bez obiektów i klas.
- Imperatywny OOP w rzeczywistości jest programowaniem proceduralnym, więc jest dokładnie co robisz ' cały czas …
Odpowiedz
Wikipedia zawiera dobre wyjaśnienia tych terminów. Tak czy inaczej, oto podsumowanie:
- Programowanie imperatywne modeluje obliczenia jako sekwencję instrukcji , które zmieniają stan mutowalny.
- Programowanie proceduralne jest koniecznym programowaniem, które dzieli kod na podprocedury.
- Programowanie strukturalne jest bardziej zdyscyplinowanym podejściem do programowania proceduralnego, które zabrania przypadkowych skoków (np. goto) i globalne zmiany stanu.
-
Programowanie deklaratywne jest przeciwieństwem programowania imperatywnego – określa raczej, co należy obliczyć niż jak (np. SQL, wyrażenia regularne).
-
Program funkcjonalny ming modeluje obliczenia jako wyrażenia , które (mogą) dawać wartości. Funkcje są wartościami i mogą być przekazywane lub zwracane z innych funkcji. Mutacja jest odradzana; wszystkie zmienne są domyślnie niezmienne. W rezultacie jest on bardziej deklaratywny niż konieczny, ponieważ kładzie nacisk na to, co jest obliczane, a nie na sekwencję zmian stanu potrzebnych do osiągnięcia tego.
- Programowanie czysto funkcjonalne całkowicie uniemożliwia mutację (chociaż wbrew powszechnemu przekonaniu nadal ma mechanizmy osiągania strony efekty).
- Całkowite programowanie funkcjonalne dodatkowo zabrania wyjątków i nieskończonej pętli (funkcja total w matematyce to funkcja, która zwraca wartość dla wszystkich swoich danych wejściowych).
- Programowanie obiektowe podkreśla użycie obiektów / interfejsów w celu uzyskania abstrakcji i modułowości.
Ich relacje są nieco skomplikowane, ponieważ OOP jest dość obciążony termin. Możesz używać obiektów zarówno w językach funkcjonalnych, jak i językach proceduralnych, ale języki, które ogłaszają się jako OO, są proceduralne. Aby jeszcze bardziej skomplikować problem:
- Większość ludzi nie wie różnic między obiektem a abstrakcyjnym typem danych
- Główne języki OOP nie wspominają o ADT, zapewniają bardzo słabe wsparcie dla nich i reklamują obiekty jako The One True Way.
- Nikt nie mówi Abstrakcyjne programowanie zorientowane na typ danych (ponieważ „byłoby to głupie; potrzebujesz zarówno ADT, jak i obiektów).
To powoduje, że ludzie myślą, że OOP to jedyny sposób na osiągnięcie abstrakcji i że programowanie funkcjonalne i OOP są w jakiś sposób przeciwieństwami lub wzajemnie się wykluczają. Wiele osób uważa również, że wszystkie języki funkcjonalne są czyste i nie pozwalają na mutacje.
Dodatkowo, ludzie generalnie przerzucają imperatyw / procedury zamiennie, czasami przeciwstawiając to OOP (implikując kod bez abstrakcji, ogólnie C), a czasami w przeciwieństwie do programowania funkcjonalnego.Termin programowanie strukturalne w większości wypadł z użycia, o ile wiem (prawdopodobnie dlatego, że w tym momencie większość ludzi przyjmuje za pewnik, że goto i globals są uważane za szkodliwe).
Komentarze
- ” zakazuje skoków ” jest raczej ogólne; zawiera if / while / etc .. być może ” zabrania przypadkowych skoków „?
- @Izkata Dobra uwaga, zmieniony.
- Może faktycznie warto utworzyć link do wpisów na Wikipedii.
- I że ' jest powodem, dla którego ' nazywa się Obiekt ” Zorientowany „, a nie tylko obiekt.
- @OrangeDog Jak to różni się od abstrakcyjnego typu danych, który również definiuje zamknięty zestaw danych i funkcji, które mogą na nim działać? Ponadto możesz mieć niezmienne obiekty, więc w takim przypadku jaki stan ?
Odpowiedź
Programowanie proceduralne to podejście do programowania, które jest jednym z podstawowych elementów składowych wielu innych projektów językowych (a nie jednym z nich jest funkcjonalność).
Większość języków należy do zestawu „Programowanie proceduralne” i jest to prawdopodobnie najbardziej naturalne podejście do projektowania dla większości ludzi (jeśli myślisz w kategoriach OO, to powiedziałbym, że jesteś w mniejszości).
BASIC jest proceduralny.
Jak powiedzieli inni, jest to mechanizm strukturyzacji programów w sposób sekwencyjny.
- Najpierw robię x
- Po drugie robię y
- Po trzecie robię Z
Wymaga mechanizmu definiowania „procedur” – bloków nazwanego kodu podobnego do metod OO, które mogą przyjmować od zera do wielu parametrów i opcjonalnie zwracać wartość (która byłaby wówczas ogólnie nazywana funkcją – prawdopodobnie prowadząc do pomylenia z językami funkcjonalnymi)
Para digm nie dyktuje, jakie będą rzeczy, które będziesz robić, ani sposobu przekazywania rzeczy.
Po prostu opisuje, że program będzie zbudowany jako seria procedur (lub funkcji), które działają w w sposób sekwencyjny. Dane są następnie definiowane niezależnie od procedur.
Różni się to od programowania obiektowego, które tworzy strukturę programu wokół zbiorów danych i metod (nie funkcji), które działają na tych danych.
Można o tym myśleć w kategoriach zakresu danych.
W języku proceduralnym zakres jest dość prosty. Zmienna może znajdować się w zakresie danej procedury (zadeklarowanej lokalnie), aż do poziomu rzeczy wywołującej pierwszą rzecz (zadeklarowanej globalnie), z zagnieżdżonymi zakresami pomiędzy.
W języku zorientowanym obiektowo dodać nowy kontekst określania zakresu, będący kontekstem aktualnie używanego obiektu, który jest ortogonalny w stosunku do powyższego.
Innym sposobem myślenia o procedurze, w porównaniu z zorientowanym obiektowo, jest rozważenie języka zorientowanego obiektowo gdzie wszystkie metody muszą być zadeklarowane jako statyczne. Rezultatem jest język proceduralny, w którym klasy mogą służyć do grupowania procedur razem.
Odpowiedź
Programowanie proceduralne zdecydowanie nie jest programowaniem funkcjonalnym.
Programowanie proceduralne polega na tym, że masz w głowie model komputera jako maszyny i zastanawiasz się, jak to modyfikuje dane w pamięci. Więc najpierw ustawiasz A
na wartość 3, następnie dodajesz 1 i ponownie zapisujesz w lokalizacji pamięci A
(nadpisując poprzednią wartość) .
Programowanie funkcjonalne mogłoby powiedzieć, że A
to 3, a B
to A + 1
, a następnie pozwalając komputerowi dowiedzieć się, jak obliczyć B
. Kiedy już zdefiniujesz A
, powinno być niezmienne (niezmienne). Funkcjonalne pozwala również na takie rzeczy, jak przekazywanie funkcji jako pierwszej – wartość klasy (funkcja może przyjmować funkcję jako argument).
Programowanie zorientowane obiektowo często łączy oba i jest w pewnym sensie ortogonalne do obu. Możesz użyć programowania funkcjonalnego i zwrócić niezmienny obiekt, a to obiekt może mieć metodę, która zwraca jakąś obliczoną wartość, a nawet robi to leniwie – to jest funkcjonalne programowanie obiektowe. Możesz także mieć obiekt, który reprezentuje „repozytorium” (abstrakcyjną wersję bazy danych), i możesz „zapisywać” rzeczy w repozytorium i „pobierać” rzeczy z powrotem i pozwolić temu obiektowi zająć się wszystkimi szczegółami tego ” s gotowe. To jest w zasadzie programowanie proceduralne zorientowane obiektowo.
Odpowiedź
OOP to nic innego jak nieco dopracowana forma programowania proceduralnego , który ponownie należy do większej rodziny programowania imperatywnego.Dowodem na to jest to, że wielu programistów C # / Java ma tendencję do „robienia czegoś” i preferuje metody takie jak:
void doThisAndThat(....) { ... do something ... }
Zatem program składający się z kilku metod void (wcześniej znanych jako procedury (sic!)) i kodu takiego jak:
doThis(); if (state is that) doSomethingElse(); doThat();
jest doskonałym programowaniem proceduralnym.
Komentarze
- doThisAndThat (….) oznacza, że metoda może zrobić więcej niż jedną rzecz, co nie jest ogólnie dobrą praktyką. Programiści Java i C # przeważnie przestrzegają zasady pojedynczej odpowiedzialności. Myślę, że twoja analogia jest błędna. objectmentor.com/resources/articles/srp.pdf
- @JohnK Wiem, że to nie jest dobra praktyka. Jednak powszechny. Zwłaszcza wśród programistów Java, jeśli można osądzić po tym, co widzi się codziennie w SO.
- @JohnK Programiści Java i C # przeważnie przestrzegają zasady pojedynczej odpowiedzialności – usługa Lip?
- Deweloperzy Java przeważnie przestrzegają zasady Single Responsibility? Gdyby tylko to było prawdą w prawdziwym życiu …