Programuję w Javie w bardzo obiektowym stylu (OO). 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 wszystkie programy, które nie są OO, są proceduralne. Ale zaczynam myśleć, że to nieprawda.
object-oriented
procedural
Aviv Cohn
źródło
źródło
Odpowiedzi:
Wikipedia ma dobre wyjaśnienia dla tych terminów. Bez względu na to, oto podsumowanie:
Programowanie deklaratywne jest przeciwieństwem programowania imperatywnego - określa, co należy obliczyć, a nie jak (np. SQL, wyrażenia regularne).
Obliczenia modeli programowania funkcjonalnego jako wyrażeń, 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 bardziej deklaratywny niż imperatywny, ponieważ podkreśla to, co jest obliczane, a nie sekwencję zmian stanu niezbędnych do jego osiągnięcia.
Ich relacje są nieco skomplikowane, ponieważ OOP jest dość obciążonym terminem. Możesz używać obiektów zarówno w językach funkcjonalnych, jak i językach proceduralnych, ale języki reklamujące się jako OO są proceduralne. Aby dodatkowo pomieszać problem:
To powoduje, że ludzie myślą, że OOP jest jedynym sposobem na uzyskanie abstrakcji, a programowanie funkcjonalne i OOP są w jakiś sposób przeciwieństwami lub wykluczają się wzajemnie. Wiele osób uważa również, że wszystkie języki funkcjonalne są czyste i nie pozwalają na mutację.
Dodatkowo, ludzie przerzucają się imperatywnie / proceduralnie zamiennie, czasami porównując go z OOP (implikując kod pozbawiony abstrakcji, ogólnie C), a czasem porównując go z programowaniem funkcjonalnym. O ile mogę powiedzieć, pojęcie programowania strukturalnego w większości przestało być używane (prawdopodobnie dlatego, że w tym momencie większość ludzi przyjmuje za pewnik, że goto i globale są uważane za szkodliwe).
źródło
Programowanie proceduralne jest podejściem do programowania, które jest jednym z podstawowych elementów składowych wielu innych projektów językowych (funkcjonalność nie jest jednym).
Większość języków mieści się w zestawie „Programowania proceduralnego” i jest to prawdopodobnie najbardziej naturalne podejście do projektowania dla większości ludzi (jeśli myślisz o OO, to powiedziałbym, że jesteś w mniejszości).
BASIC ma charakter proceduralny.
Jak powiedzieli inni, jest to mechanizm do sekwencjonowania programów.
Wymaga mechanizmu do definiowania „procedur” - bloków o nazwanym kodzie podobnym do metod OO, które mogą przyjmować od zera do wielu parametrów i opcjonalnie zwracać wartość (która wówczas byłaby na ogół nazywana funkcją - prawdopodobnie prowadząc do pomylenia z językami funkcjonalnymi )
Paradygmat nie dyktuje, jakie będą twoje rzeczy ani sposób, w jaki rzeczy będą przekazywane.
Po prostu opisuje, że program będzie się składał z szeregu procedur (lub funkcji), które działają sekwencyjnie. Dane są następnie definiowane niezależnie od procedur.
Różni się to od programowania obiektowego, które konstruuje program wokół zbiorów danych i metod (nie funkcji), które działają na tych danych.
Jednym ze sposobów myślenia o tym jest zakres danych.
W języku proceduralnym ustalanie zakresu jest dość proste. Zmienna może znajdować się w zakresie danej procedury (deklarowana lokalnie), aż do poziomu najważniejszej rzeczy wywołującej (deklarowanej globalnie), z zasięgami zagnieżdżonymi pomiędzy.
W języku obiektowym dodajesz nowy kontekst zakresu, będący kontekstem aktualnie używanego obiektu, który jest prostopadły do powyższego.
Innym sposobem myślenia proceduralnego w porównaniu do obiektowego jest rozważenie języka zorientowanego obiektowo, w którym wszystkie metody muszą być zadeklarowane jako statyczne. Rezultatem jest język proceduralny, w którym klasy mogą być używane do grupowania procedur razem.
źródło
Programowanie proceduralne zdecydowanie nie jest programowaniem funkcjonalnym.
Programowanie proceduralne ma miejsce, gdy masz w głowie model komputera jako maszyny i zastanawiasz się, jak modyfikuje on dane w pamięci. Najpierw ustaw
A
wartość 3, a następnie dodaj 1 i zapisz jąA
ponownie w pamięci (nadpisując poprzednią wartość).Programowanie funkcjonalne powiedziałoby, że
A
jest 3, iB
jestA + 1
, a następnie pozwala komputerowi wymyślić, jak obliczyćB
. Po zdefiniowaniuA
to powinna być niezmienna (nie zmienia). Funkcjonalność pozwala również na wykonywanie takich czynności, jak przekazywanie funkcji jako wartości pierwszej klasy (funkcja może przyjmować funkcję jako argument).Programowanie obiektowe często łączy oba te elementy i jest swego rodzaju ortogonalne dla obu. Możesz użyć programowania funkcjonalnego i zwrócić niezmienny obiekt, a ten obiekt może mieć metodę, która zwraca pewną obliczoną wartość, a nawet zrobić to leniwie - jest to programowanie obiektowe funkcjonalne. Możesz również mieć obiekt reprezentujący „repozytorium” (abstrakcyjną wersję bazy danych), możesz „zapisywać” rzeczy w repozytorium i „pobierać” rzeczy z powrotem, a ten obiekt może obsłużyć wszystkie szczegóły tego, jak to się robi . Zasadniczo jest to programowanie proceduralne zorientowane obiektowo.
źródło
OOP to nic innego jak nieco wyrafinowana forma programowania proceduralnego, która ponownie należy do większej rodziny programowania imperatywnego. Dowodem tego twierdzenia jest to, że wielu programistów C # / Java ma tendencję do „robienia czegoś” i woli metody takie jak:
Tak więc program składający się z kilku metod void (wcześniej znanych jako procedury (sic!)) I kodu takiego jak:
to idealne programowanie proceduralne.
źródło