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.
object-oriented
education
Łukasz
źródło
źródło
Odpowiedzi:
Szybkie podsumowanie:
Ponieważ w prawdziwym świecie prędzej czy później musisz pracować z kodem proceduralnym.
Ponieważ języki proceduralne mogą działać jak rozszerzenie lub wprowadzenie do języków zorientowanych obiektowo, zamiast po prostu być alternatywą.
Uzupełnienie do odpowiedzi 2. Ponieważ OOP jest bardziej złożony niż programowanie proceduralne, dlatego lepiej najpierw nauczyć się programowania proceduralnego.
Ponieważ w prawdziwym świecie programiści pracują i łączą kilka sposobów rozwiązywania problemów, AKA „programowanie wieloparadigmowe”, a nie tylko jeden paradygmat.
Większość języków programowania jest wieloparadigmowych, nawet na pewnym poziomie, nawet jeśli ich projektanci lub zwykli programiści mówią inaczej.
[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. *
źródło
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!
źródło
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.
źródło
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.
źródło
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.
źródło
=
zadania,if
,for
itp) 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.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.
źródło
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)
źródło
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.
źródło
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.
źródło
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.
źródło
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 :-).
źródło
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 .
źródło