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żeliprintf
); - Kiedy już nauczy się tablic, można wprowadzić klasy, w tym kontenery bez konieczności zmiany języka.
- C++ udostępnia struktury, które są w wielu miejscach wygodniejsze w użyciu, aniżeli C (np. łatwiej jest nauczyć kogoś korzystania z
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.