Dlaczego musimy uczyć się programowania proceduralnego, zanim nauczymy się programowania obiektowego [zamknięte]

10

Jestem teraz na 4 roku na uniwersytecie informatycznym, a kiedy rozmawiam z moim profesorem na ten temat, odrzuca moją opinię i bardzo ostro krytykuje (na mojej uczelni uczyliśmy się języka C (ANSI) (w procedurze Zajęcia z programowania - na pierwszym roku na uniwersytecie) przed C ++ (w zajęciach OOP na drugim roku) i inne ...

Ale w wieku 13 lat mój brat nauczył mnie przede wszystkim Javy i nic więcej. Teraz może zrobić prawie wszystko, co normalny student drugiego roku może zrobić z Javą.

Dla was, profesjonalistów, chciałbym wiedzieć, dlaczego według was powinniśmy nauczyć się programowania proceduralnego.

Łukasz
źródło
8
Ponieważ asembler nie ma obiektów.
9
To tak, dlaczego powinniśmy nauczyć się poprawnie obliczać, zanim nauczymy się korzystać z kalkulatora.
22
Ponieważ projektowanie obiektowe jest wadliwe. Programy to zbiór zachowań, które działają na danych. Obiekty często wprowadzają niepotrzebną złożoność. Przeczytaj „Jak projektować programy: wprowadzenie do programowania i komputerów”.
8
Jak powiedział ktoś inny: „Nie rozpraszaj nowych programistów za pomocą OOP”: prog21.dadgum.com/93.html - w zasadzie wszystko, co OOP przeszkadza w nauczaniu nowych programistów podstaw. Uczysz ich jednocześnie dwóch naprawdę trudnych pojęć.
John Ripley
7
@juxstapose - mówienie, że programowanie obiektowe wprowadza niepotrzebną złożoność jest jak mówienie, że powinniśmy rzeźbić pojazdy z jednego bloku stali. Tylko moja opinia.

Odpowiedzi:

23

Szybkie podsumowanie:

  1. Ponieważ w prawdziwym świecie prędzej czy później musisz pracować z kodem proceduralnym.

  2. Ponieważ języki proceduralne mogą działać jak rozszerzenie lub wprowadzenie do języków zorientowanych obiektowo, zamiast po prostu być alternatywą.

  3. Uzupełnienie do odpowiedzi 2. Ponieważ OOP jest bardziej złożony niż programowanie proceduralne, dlatego lepiej najpierw nauczyć się programowania proceduralnego.

  4. Ponieważ w prawdziwym świecie programiści pracują i łączą kilka sposobów rozwiązywania problemów, AKA „programowanie wieloparadigmowe”, a nie tylko jeden paradygmat.

  5. Większość języków programowania jest wieloparadigmowych, nawet na pewnym poziomie, nawet jeśli ich projektanci lub zwykli programiści mówią inaczej.

  6. [NOWOŚĆ] Ponieważ programowanie modułowe, które jest często mieszane i mylone z programowaniem proceduralnym, może zostać zastosowane do OOP. Dlatego pytanie można odczytać jako „Dlaczego musimy uczyć się programowania modułowego, zanim nauczymy się programowania obiektowego”

Rozszerzony nudny opis:

Punkt 1 jest bardzo jasny, bez dalszych wyjaśnień.

Punkt 2, Klasy, Dziedziczenie, Polimorfizm, Interfejsy itd.

Punkt 3, koduję Procedural Pascal, zanim nauczyłem się Object Oriented Pascal, kiedy tam dotarłem, powiedziałem: „patrz, klasy są jak małe programy proceduralne ... ... i możesz sprawić, żeby ze sobą rozmawiały, spoko !!! „.

To samo słyszałem od ludzi, którzy przeszli od zwykłego C do C plus.

Punkt 4: W większości przypadków programiści łączą kilka technik programowania lub paradygmatów lub sposobów rozwiązania problemu. Funkcjonalne, proceduralne, OOP, logiczne.

Nawet Java „Pure OO” nie jest tak prostym programowaniem obiektowym, jak mówi.

+1 punkt za powiedzenie „Programowanie proceduralne” zamiast „Programowanie strukturalne”. Lub programowanie modułowe. To jest ważne.

Pomyślałem, że wiele razy te terminy uczą się razem i są używane zamiennie, nie są. Programowanie strukturalne obejmuje wiele pojęć, nie tylko stosowanie procedur, a jednym z nich jest spowodowanie, że program nie wygląda jak „Kod Spaghetti”.

Dzisiaj czytam kilka „czystych” programów OO, które wyglądają jak „Object Spaghetti Code”, co oznacza, że ​​programista używał OOP, ale jego kod wygląda jak bałagan.

Wiele razy mogę odczytać kod OO i powiedzieć, że programista nauczył się programowania strukturalnego przed OOP, ponieważ kod jest przejrzysty i uporządkowany.

A w przypadku programowania modułowego widziałem kilka aplikacji. w C ++ i PHP, które nie używają modułów. *

umlcat
źródło
18

Myślę, że analogia byłaby podobna do matematyki. Najpierw musisz nauczyć się podstawowych pojęć (dodawanie / odejmowanie / ...), a następnie przejść do bardziej złożonych tematów (algebra / rachunek różniczkowy). Program proceduralny jest bardzo liniowy i łatwiej jest zrozumieć przepływ kontroli podczas nauki składni. Być może uważa się, że OOP jest bardziej złożona, opiera się na prostszych konstrukcjach używanych w językach proceduralnych, ale jest bardziej abstrakcyjna i trudniejsza do zrozumienia. Zaczynając od języków takich jak C, przybliżasz się również do sprzętu i sprawia, że ​​radzisz sobie z problemami z alokacją pamięci i wskaźnikami, które musisz zrozumieć, ale tak naprawdę nie można ich używać w językach takich jak Java / C #. Narażenie się na to w szkole ma pewną wartość, niezależnie od tego, czy jest to pierwsze, czy drugie.

FWIW, to się ostatecznie zmieni. Kiedy zaczynałem szkołę, uczyliśmy się w Pascal i PL / 1. Nie dotarliśmy do C, dopóki klasa zaawansowanych języków (która się ze mną umawiała). Nie kupiłem Javy, dopóki nie ukończyłem szkoły - jeszcze jej nie wynaleziono!

tvanfosson
źródło
+1 - rodzaj paradoksu intencji ... „bardziej abstrakcyjne i trudniejsze do zrozumienia” :)
10
@Spacemoses - nie tak naprawdę, im bardziej coś jest abstrakcyjne, tym łatwiejsza jest dyskusja, ale trudniej jest zrozumieć rzeczywistość omawianego tematu.
zgadzam się, rozumiem teraz twój punkt widzenia.
ses011
12

Programowanie obiektowe jest zbiorem fragmentów proceduralnych w zorganizowany sposób. Myślę, że lekcją, której się uczysz, jest to, że metodologia obiektowa pomaga utrzymać organizację i łatwość konserwacji. Jest wielu programistów, którzy nie potrafią tego rozróżnić i twierdzą, że ich programy są zorientowane obiektowo, gdy są bardziej proceduralne.

ses011
źródło
3
ale funkcje + stan = obiekty
Dan D.
4
Orientacja obiektowa często utrudnia konserwację, ponieważ powoduje zawyżenie bazy kodu. Systemy oparte na Javie są koszmarem do utrzymania ze względu na poziom czystości OO i wzorowe wzorce występujące w tej społeczności.
bit-twiddler
1
„Wzorce projektowe znalezione w tej społeczności” - brzmi jak osobisty problem w „społeczności Java”, jeśli takie jest Twoje stanowisko.
ses011
1
@Dan D: orientacja obiektu to znacznie więcej niż łączenie funkcji i stanu w obiekcie ...
Marjan Venema
4
@Spacemoses: Mam problem z każdą społecznością programistów, która nie przestrzega zasady KISS. Najlepszym rozwiązaniem problemu jest często najprostsze rozwiązanie.
bit-twiddler
11

Ty nie.

Najpierw nauczyliśmy się programowania funkcjonalnego ze Scheme. Następnie przeszliśmy do programowania proceduralnego, potem OOP, a następnie programowania deklaratywnego. I wierzcie lub nie, choć już znałem programowanie, myślę, że było to również łatwiejsze dla innych ludzi: ponieważ FP jest jak matematyka! Więc znasz już podstawy.

Dyskutowałem o tym ze sobą wiele razy i ostatecznie doszedłem do wniosku, że to naprawdę zależy od tego, jak dobrze twój nauczyciel uczy cię pojęć.

Nie ma jednej odpowiedzi, ponieważ:

  • Rozpoczęcie od czegoś proceduralnego, takiego jak C (a nawet asembler), może być dobrym wyborem, ponieważ dowiadujesz się, jak naprawdę działają komputery

  • Rozpoczęcie od czegoś zorientowanego obiektowo Java może być dobrym wyborem, ponieważ jest stosunkowo łatwe do nauczenia się i zastosowania OOP w prawdziwym życiu, i ponieważ uczy cię ** formowania

  • Rozpoczęcie od programowania funkcjonalnego, takiego jak Scheme, może być dobrym wyborem, ponieważ uczy, jak myśleć bardziej abstrakcyjnie (pod względem funkcji zamiast zmiennych), co ostatecznie czyni cię lepszym programistą

Jeśli twój nauczyciel nie uczy tego dobrze, to nie ma znaczenia, od czego zaczynasz; okażą się takie same.

użytkownik541686
źródło
4
+1 uderz i nie mogę uwierzyć, że musiałem przewinąć tak wiele kiepskich odpowiedzi, aby je znaleźć!
jk.
Przez jakiś czas miałem problemy z czytaniem funkcji matematycznych, ponieważ najpierw nauczyłem się trochę kodowania, a zaskoczyło mnie pojęcie funkcji, która „jest” zamiast „robić rzeczy”. : 3
StarWeaver
6

Język może być obiektowy, taki jak C ++, Java lub C #. I możesz zacząć od tych języków. Ale chodzi o to, że nawet w przypadku tych języków OO najpierw musisz nauczyć się programowania proceduralnego, a potem OOP. Myślę, że to samo zrobiłeś swojemu bratu.

Gulszan
źródło
3
+1 Dokładnie. Każda metoda OOP jest krótkim programem proceduralnym. Jeśli nie wiesz jak połączyć małe kawałki (typy, wartości literałów, zmiennych, operatorów, =zadania, if, foritp) w większych kawałkach (metody), jak można kiedykolwiek nadzieję zrozumieć OOP. Podobnie jak w przypadku większości umiejętności, bycie bardzo inteligentnym, zmotywowanym i / lub dostęp do instrukcji jeden na jednego może pozwolić ci na naukę wielu powiązanych tematów jednocześnie.
David Harkness
3

Programowanie proceduralne, przynajmniej w języku takim jak C, rozbija programowanie na praktykę bardzo nagich kości: algorytmy i struktury danych oraz na poziomie abstrakcji, który jest szczęśliwym medium między zrozumiałym dla człowieka kodem źródłowym a kodem asemblera.

W ten sposób uczniowie mogą jednocześnie nauczyć się nieco nauk ścisłych (algorytmów, struktur danych) i inżynierii (kompilacja źródłowa> obiektowa> komputerowa, architektura von neumana (prawdopodobnie)).

OOP poprzez C ++ / obj-C wprowadza wzorzec organizacji kodu, który jest jeszcze jedną rzeczą do nauczenia się. Może to utrudnić naukę powyższych koncepcji.

OOP przez Javę (między innymi) idzie jeszcze dalej, odciągając sprzęt i środowisko. Teraz podstawowym produktem nie jest kod maszynowy, ale jakiś pośrednik, który nie ujawnia, jak działa podstawowy sprzęt, ale efekt polega na tym, że pozwala on uczniowi skoncentrować się na wzorcach organizacji kodu.

W końcu myślę, że jest to kompromis między nauczeniem się, jak działa sprzęt, a uczeniem się wzorca organizacji kodu. Co jest ważniejsze, tak naprawdę nie wiem. Prawdziwy świat wymaga znajomości obu, przynajmniej do pewnego stopnia.

Zgaduję, że program licencjacki rozpoczynający się od programowania na niskim poziomie prawdopodobnie produkuje informatyków / inżynierów komputerowych, a program, który rozpoczyna się od koncepcji wyższego poziomu, wytwarza inżynierów / programistów / programistów.

Curtis Batt
źródło
3

Jelita obiektów OOP składają się z programowania proceduralnego.

Jeśli nie możesz wykonać pętli for, użyj poprawnie wskaźników, zadeklaruj swoje typy i funkcje, że nie będziesz w stanie pisać interfejsów dla swoich klas, a tym bardziej sprawić, że wnętrze zrobi coś, co warto zrobić.

I tak naprawdę nie uczyłbyś się OOP w klasie wprowadzającej, byłaby to po prostu składnia - przeskakiwanie prosto do OOP sprawiłoby, że rzeczy byłyby trudniejsze do uchwycenia (na początku) niż już są.

OOP nie polega na deklarowaniu składni do tworzenia klas, dotyczy struktur danych, wzorców projektowych, polimorfizmu, dziedziczenia i kompozycji.

Aby zrobić wszystkie te rzeczy, które musisz znać programowanie proceduralne, coś, co łatwo zrobić w C. Możesz przenieść większość wszystkiego, czego uczysz się w C, do Javy lub C ++ i tak, być może będziesz musiał przemyśleć niektóre rzeczy, które wziąłeś za pewnik w C, ALE ... Musisz znać gramatykę (gdzie jesteś we wprowadzeniu C), aby pisać zdania (musisz pisać procedury, aby zdefiniować interfejsy), a następnie akapity (musisz znać struktury danych), a następnie znać pewne wzorce projektowe (tragedia, komedia, wady bohater, ich interakcje i kiedy ich nie używać), zanim będzie można napisać kompletne powieści (kompletny system OOP).

Gdybym był tobą chciałbym podnieść niektóre z następujących książek: Język ANSI C , Java Programming Language , wzorce projektowe , Gang of Four i wzoru kreskowania . Zdecydowanie wybrałbym kopię The C Programming Language, gdybym poważnie mówił o C / C ++.

Jeśli chcesz przejść na całość Java (i zrobić to za $), wybierz kilka książek o wzorcach projektowych Java i jak używać Java z serwerami WWW Apache i Tomcat oraz kilka książek o programowaniu w bazie danych SQL. Przykro mi, ale Java ma w historii mnóstwo dziur w zabezpieczeniach, co sprawia, że ​​jest to tak samo bolesne jak Windows, aby powstrzymać się od zrootowania serwera lub wstrzyknięcia baz danych SQL.

Powinieneś również poświęcić trochę czasu na naukę SQL, Oracle MySQL Postgresql i MSSQL mają ze sobą wiele wspólnego pod względem składni, ale gdybym musiał po prostu wybrać jeden dla siebie, wybrałbym Postgresql tylko dlatego, że ma licencję BSD zamiast GPL (powinieneś sprawdzić porównanie i kontrast również z licencjami GPL / BSD)

Hategrin
źródło
2

Muszę powiedzieć, że większość kodu napisanego w językach obiektowych, takich jak Java, nie jest w rzeczywistości obiektowa. Naprawdę zrozumienie idei stojących za OO jest trudne, w wyniku czego najbardziej podobno kod OO jest naprawdę w większości proceduralny.

Nie jest to jednak nic złego w pisaniu kodu proceduralnego w Javie. Tak, korzystanie z OO ma wiele zalet, ale nie chcę tego mylić początkującego programisty. Na tej podstawie nie widzę nic złego w nauczaniu języka Java. Nie oczekuj od tego prawdziwego OO, ale działa.

Jednak Java ukrywa wiele szczegółów niskiego poziomu na temat tego, co dzieje się wewnątrz komputera. C pozostawia te znacznie bardziej otwarte. Można zrobić dobry przypadek, że uczniowie powinni nauczyć się, jak działają te szczegóły niskiego poziomu, przed użyciem języka, który się nimi zajmuje. Ale możesz również uzasadnić, że powinieneś zignorować te szczegóły i nauczyć się ich później.

Winston Ewert
źródło
2

Kilka innych osób już odpowiedziało na ten temat, ale myślę, że warto to wyrazić bardziej jednoznacznie.

Nawet jeśli zaczniesz uczyć się programowania z językiem obiektowym, takim jak Java, zacznij od nauki procedur programowania, zanim przejdziesz do koncepcji OO . Ucząc nowego programistę Java, nie wprowadzasz ich najpierw do obiektów i klas, lecz do instrukcji i zmiennych. Do czasu, gdy uczeń będzie w stanie wiele nauczyć o przedmiotach i klasach, ma już przynajmniej podstawy programowania proceduralnego.

Przynajmniej musisz nauczyć się programowania proceduralnego w Javie, a następnie nauczyć się programowania obiektowego w Javie. Niezależnie od tego, czy spędzasz cały rok na programowaniu proceduralnym, czy po prostu spędzasz pierwsze tygodnie kursu programowania i czy używasz do tego innego języka, czy nie, to tylko spiera się o szczegóły.

Ben
źródło
0

Mówiąc wprost, uważam, że impet ten pochodzi przede wszystkim od starych programistów pragnących dawnych czasów.

Zanim powiem cokolwiek innego, absolutnie nie utrzymuję żadnej rywalizacji ze strony starszych programistów, wielu z nich jest po prostu niesamowicie wykwalifikowanych. Niestety, czasami ci, którzy nie są, którzy się umyli i nigdy tak naprawdę nie byli naprawdę dobrzy w programowaniu na początku ... zostań profesorem, gdy nie mogą włamać się do niego w „prawdziwym świecie”. (Nie wszyscy profesorowie też ... ale ... WIELE)

OOP nie jest świętym Graalem programowania, jaki ma być, ani programowanie proceduralne nie jest reliktem. Dobrze wiedzieć przynajmniej niektóre z nich, ale myślę, że ogólna praktyka uczenia się programowania proceduralnego jest ogromną stratą czasu i wysiłku. Musimy nauczyć się programowania w środowisku akademickim, a nie tylko w jednym stylu. Do tego przypisuję sporo okropnego kodu i nieporozumień, w tym mój własny.

Garet Claborn
źródło
2
Miałem nauczyciela używającego C od '89, ale to było dla mikroczipa oczekującego c'99. Potem był inny nauczyciel używający „c ++”, ale bez STL i szablonów. Równie dobrze mogą istnieć struktury ze wskaźnikami funkcji.
Ape-inago
1
Szczerze mówiąc, STL i szablony nie są wprowadzającymi tematami w C ++. Podstawowym celem każdego kursu programowania na poziomie 101 jest nauczenie, jak tworzyć dobrze zorganizowaną logikę sekwencyjną, warunkową i iteracyjną w ramach ograniczeń danej składni. Wszystkie pozostałe funkcje językowe są jedynie składniowym cukrem, który pozwala zgrupować podstawowe struktury kontrolne, a także powiązać je z danymi.
bit-twiddler
ouch dwa opinie negatywne. widziałem, że jedno nadchodzi = P dziwne dla mnie, ponieważ pierwotnie opinia pochodziła od starszego programisty, który pomógł mi wyzdrowieć po złym nauczaniu. @Ape: Szef naszego działu CS próbował nauczyć nas COBOL-a przez rok w XD 2004 (najmniej moich obaw związanych z jego stylem „nauczania”, nie mam nic przeciwko, ponieważ mogę pracować w pewnym punkcie sprzedaży maszyny lol ale geeze ... serio?)
Garet Claborn
1
@ bit-twiddler - Tak, proszę pana, bardzo dziwne. W tej opinii niewiele polegam na tym doświadczeniu, ale przyjrzałem się innym lokalizacjom. Naprawdę kocham oba style programowania i wydaje mi się, że powinni uczyć ich razem. Po prostu stwierdzam, że nawet nieco młodsi profesorowie nie mają takiego samego odsetka zapału w tej kwestii. IMO to dobra rzecz. Rozumiem, że niektórzy uważają, że najpierw konieczne jest postępowanie proceduralne.
Garet Claborn
1
@ bit-twiddler: tak, ale to nie był kurs wprowadzający. Był to 4-letni zaawansowany kurs projektowania baz danych i mieliśmy używać c ++. Po prostu poczułem się źle po doświadczeniu c ++ na tak wysokim poziomie z poprzednimi kursami.
Ape-inago
0

Dwa powody dla mnie: Jeden program OO przyszedł rozwiązać problemy programowania proceduralnego. Pisząc kodowanie proceduralne, a następnie te same rzeczy w OO, łatwiej zrozumieć różnicę.

Jest tu także dodatkowy element: dwa podejścia do edukacji na tematy związane z programowaniem. Można zacząć od najniższego możliwego poziomu (przykład montażu, w wielu miejscach proceduralnych, niektóre inne zaczynają się od obwodów), a następnie przejść w górę (w kierunku OO / Functional / Managed). Drugim podejściem jest zacząć od świata fizycznego (np. Browser / Windows 7 itp.), A następnie zacząć się głębiej. Każde podejście ma wady i zalety. Twój uniwersytet wybrał pierwszy i zaczął od proceduralnych. Może być jakieś uzasadnienie lub po prostu skopiowali kogoś innego :-).

Dimitrios Mistriotis
źródło
1
„Programowanie OO przyszło rozwiązać problemy programowania proceduralnego”. To był cel, ale OO stworzyło tyle problemów, ile rozwiązało.
bit-twiddler 24.03.11
@ bit-twiddler: Bardzo duża historia. Koncentrując się na aspekcie pedagogicznym (lub zawężając go), można stwierdzić: co to zrobiliśmy, w jaki sposób
ulepszyliśmy
0

Nie ma innego powodu niż instytucjonalna bezwładność. Spójrz na CMU, wyrzucili cały program nauczania OOP i zastąpili go programowaniem funkcjonalnym. Ponownie więc odpowiedź na twoje pytanie jest taka, że ​​jest to arbitralny wybór dokonany przez administratorów dowolnej szkoły, do której uczęszczasz. W przypadku, gdy ktoś zastanawia się nad merytorycznymi stwierdzeniami, które tu przedstawiłem, jest post o zmianie programu nauczania na CMU przez jednego profesora / administratora: Nauczanie FP dla studentów pierwszego roku .

davidk01
źródło
1
-1 wprowadzające w błąd - podczas gdy widziałem wątek (za pomocą wyszukiwarki Google), który twierdził, że CMU porzuciła OOP z programu nauczania CS pierwszego roku i zastąpiła go programowaniem funkcjonalnym, oficjalny program CMU zaczyna się od języka programowania Alice, który jest obiektem zorientowany [patrz enr-apps.as.cmu.edu/assets/SOC/CS_SPRING.htm]
Steven A. Lowe
1
@ davidk01: (1) nieprawdziwe stwierdzenie w odpowiedzi. (2) „Alice jest darmowym narzędziem dydaktycznym zaprojektowanym, by być pierwszym doświadczeniem ucznia w programowaniu obiektowym ” z alice.org
Steven A. Lowe
2
@Steven A. Lowe: Prosto z pyska konia: „Programowanie obiektowe zostało całkowicie wyeliminowane ze wstępnego programu nauczania, ponieważ z natury jest zarówno modułowe, jak i antyrównoległe, a zatem nieodpowiednie dla nowoczesnego programu CS. Proponowany nowy kurs metodologii projektowania obiektowego będzie oferowany na poziomie drugiego roku dla tych studentów, którzy chcą studiować ten temat ”. - Nauczanie FP początkujących
davidk01
1
@ davidk01: doskonały link, dziękuję. Z dokumentu komitetu cytowanego w tym artykule „Chociaż programowanie obiektowe (w jego niezliczonych formach) pozostaje dominującym tematem w rozwoju oprogramowania przemysłowego, użycie języków obiektowych, takich jak Java, na poziomie wprowadzającym wprowadza znaczną złożoność i rozprasza uwagę od głównych celów na poziomie wprowadzającym . Wydaje się, że lepiej jest w większym stopniu objąć projektowaniem i wdrażaniem OO później niż w programie nauczania, aby umożliwić bardziej skoncentrowaną koncentrację na podstawach na poziomie wprowadzającym. ” [moje podkreślenie] ...
Steven A. Lowe
1
@ davidk01: Cieszę się, że się nie zgadzam. Nazwij mnie pedantycznym, jeśli chcesz, ale dla mnie istnieje znacząca różnica między zmianą akcentu na poziomie wprowadzającym a „wyrzuceniem całego programu nauczania OOP”. Z trudem nazwałbym ograniczanie zakresu zajęć wprowadzających „zamiataniem” ;-)
Steven A. Lowe