Czym dokładnie jest programowanie proceduralne? Czym dokładnie różni się od OOP? Czy to to samo, co programowanie funkcyjne?

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 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).

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 …

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *