Zalecanie korzystania z kontenerów zamiast dynamicznej alokacji w C++

Odpowiedz Nowy wątek
2019-03-08 18:08
4

Sytuacja ta powtarza się na tym forum od lat:

  • Przychodzi nowicjusz, mający wyraźne problemy z podstawami C++, i prezentuje swój kod upstrzony rozmaitymi new, delete, malloc, tab[i], *(ptr+n), tablic znaków, itd, itp.
  • Informuje się go, że to jest zła praktyka w C++ i ma zamiast tego korzystać z, niepotrzebne skreślić: std::vector, std::string, unique_ptr, shared_ptr, etc, etc.

Sytuacja ta wynika z faktu, że programy nauczania w szkołach, a być może (nie wiem) także na niektórych uczelniach, notorycznie:

  • Wymagają od uczniów / studentów znajomości programowania imperatywnego na poziomie C, a zatem w szczególności: dynamicznej alokacji, tablic, arytmetyki wskaźników;
  • Jednocześnie nauczają tego w C++, ponieważ:
    • C++ udostępnia struktury, które są w wielu miejscach wygodniejsze w użyciu, aniżeli C (np. łatwiej jest nauczyć kogoś korzystania z std::cout aniżeli printf);
    • Kiedy już nauczy się tablic, można wprowadzić klasy, w tym kontenery bez konieczności zmiany języka.

Innymi słowy: Chcąc / musząc nauczyć dynamicznej alokacji, wybierają do tego takie narzędzie, które po pierwsze to umożliwia, po drugie jest stosunkowo najwygodniejsze spośród tych, które to umożliwiają.

Z jednej strony rozumiem forumowiczów, których bije po oczach to, co z ich perspektywy jest "nauczaniem złych praktyk w C++". Z drugiej strony - choć to zabrzmi pewnie jak herezja - rozumiem także nauczycieli, którzy chcą przerobić wymagany materiał bez dodatkowych utrudnień, rozpraszających uwagę ucznia od tej konkretnie wiedzy, którą chcą mu wbić do głowy.

NIE rozumiem natomiast radzenia takim nowicjuszom, by zaczęli używać kontenerów / unique_ptr / etc zamiast operowania na czystych, dynamicznie zaalokowanych wskaźnikach! Jeśli - zgodnie z tymi radami - przestaną uczyć się dynamicznej alokacji itp, to nie wykażą się wiedzą, której się od nich wymaga. Czy nam się to podoba, czy nie: Jeśli każe się im używać new, delete, itp, to muszą nauczyć się tego używać.

Oczywiście, można radzić im np. pisać w C a nie w C++, skoro już muszą operować na "czystych", dynamicznie zaalokowanych wskaźnikach. Jednak:

  • W zasadzie nawet i to rodzi podobne wątpliwości, no bo w C są VLA, więc czy dobrą praktyką jest stosowanie dynamicznych alokacji zamiast VLA?
    • Ale idąc tym tropem: Jak w ogóle można nauczyć kogoś dynamicznej alokacji, jednocześnie nie ucząc go mitycznych "złych praktyk" ani nie rozpraszając jego uwagi zadaniem na tyle skomplikowanym, by VLA nie mogło się sprawdzić?
  • Moim zdaniem, pisanie w C zamiast w C++ przez takiego ucznia to byłoby już, z jego perspektywy, byciem plus catholique que le pape...

Jak można mu wytłumaczyć, dlaczego pisanie *(ptr+offset) ma się jednocześnie wykluczyć z pisaniem cout << wynik << endl, a wymuszać pisanie printf("%d\n", wynik) - ah uwaga na pomyłki jeśli wynik jest long long a nie int

A zresztą, w zasadzie po co? Bo mistyczna "jakość kodu"? Jednak tu jest jakieś przemieszanie, ponieważ żeby wiedzieć, jak należy pisać kod, żeby był elegancki, "wysokiej jakości", żeby wbić komuś do głowy wszystkie patterny, antipatterny, itp, to trzeba najpierw nauczyć go, czym w ogóle jest programowanie i jak ma pisać kod, żeby w ogóle działał!

To, do czego - moim zdaniem - można rzeczywiście przyczepić się programom nauczania, to to, że zaczynają od nauczania programowania na poziomie C. Jakiś doświadczony programista mi kiedyś w cztery oczy powiedział, że uważa to za pomyłkę, i że należy zaczynać od C# albo Javy - a na inne wynalazki, w tym C czy C++, przyjdzie czas później - żaden z tych dwóch języków nie nadaje się dla początkujących. Rozumiem ten punkt widzenia; jednak wyrzucenie arytmetyki wskaźników i dynamicznej alokacji z programów nauczania dla liceum to chyba marzenie ściętej głowy.

Póki zatem tak się nie stanie, proponuję przestać wreszcie czepiać się nowicjuszy, potrzebujących pomocy z materiałem, którego wymaga od nich szkoła.

@kmph: kojarzysz jakies dobre darmowe materialy jak teraz nalezy pisac w C++ ? Ja np. uczylem sie wieki temu z tego i pozniej jezyk poszedl w odstawke wiec moze warto byloby sobie odswiezyc: http://www.leinad.master.pl/ftp/programowanie/C++/C++%20(kurs)/ - WhiteLightning 2019-03-12 10:11

Pozostało 580 znaków

2019-03-14 16:28
0

ten artykuł niedługo będzie też o programistach C++ , tak jak już jest o tych co twierdzą że znają C#
https://www.joelonsoftware.co[...]/the-perils-of-javaschools-2/

Pozostało 580 znaków

2019-03-14 16:36
2

Są różne rodzaje zadań robionych w C++:

  • nauka programowania
  • nauka algorytmów i struktur danych
  • nauka C++

Zadań z C-podobnej alokacji w C++ raczej mało tu jest.
Trzeba umieć rozróżniać te zadania. Każde z nich wymaga innego podejścia.


Szacuje się, że w Polsce brakuje 50 tys. programistów

Pozostało 580 znaków

2019-03-16 17:57
2

Wszystko fajnie, tylko o tym, że dane zadanie ma jakieś dziwne obostrzenia dowiadujemy się zazwyczaj w drugim czy kolejnym poście gdy ktoś już przedstawi współczesne rozwiązanie.

A to, że ktoś czasem wybuchnie(co mi się zdarzyło, niepotrzebnie, mogę się jedynie usprawiedliwić paskudnym humorem) to też nic niezwykłego, bo mylenie C z C++ jest nagminne, niczym bynajmniej/przynajmniej.

No i też jestem ciekawy ilu uczniów/studentów wie, że new może trzasnąć wyjątek oraz, że ma wersję, która zwraca nullptr. Tak ich maglują z tą dynamiczną alokacją, że to przecież powinna być oczywista oczywistość.

Pozostało 580 znaków

2019-03-17 01:53
1

Bez przesady, to nie jest forum uczelniane.
Sam jakiś ładny czas temu założyłem temat, otrzymałem odpowiedź, że tego i tamtego w C++ się nie robi/jest na to lepszy sposób, ale po mojej odpowiedzi, że wymaga ode mnie prowadzący - dostałem pomoc dopasowaną od wymagań.

To tak jakby mieć pretensje, że komuś poleca się jazdę samochodem, gdy próbuje przejść dłuższą trasę na piechotę[chociaż tutaj byłby przynajmniej jakiś pożytek zdrowotny. ;) ]


Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0