Torvalds mówi tutaj ze swojego tyłka.
OK, dlaczego mówi ze swojego tyłka:
Po pierwsze, jego rant to tak naprawdę nic, ALE rant. Tutaj jest bardzo mało rzeczywistej treści. Jedynym powodem, dla którego jest naprawdę sławny lub nawet szanowany, jest to, że został stworzony przez boga Linuxa. Jego głównym argumentem jest to, że C ++ to bzdura i lubi wkurzać ludzi C ++. Oczywiście nie ma żadnego powodu, aby na to odpowiadać, a każdy, kto uważa to za rozsądny argument, i tak jest poza rozmową.
Co do tego, co można zaliczyć jako jego najbardziej obiektywne punkty:
- STL i Boost są kompletną bzdurą. Jesteś idiotą.
- STL i Boost powodują nieskończoną ilość bólu <- śmieszne. Oczywiście celowo przesadza, ale jakie jest jego prawdziwe stwierdzenie? Nie wiem Podczas wywoływania wymiotów kompilatora w programie Spirit lub czegoś innego istnieje trochę bardziej niż trywialnie trudna do wykrycia problem, ale nie jest to trudniejsze do wykrycia niż debugowanie UB spowodowane niewłaściwym użyciem konstruktorów C, takich jak void *.
- Modele abstrakcyjne wspierane przez C ++ są nieefektywne. <- Jak co? On nigdy się nie rozwija, nigdy nie podaje żadnych przykładów tego, co ma na myśli, po prostu to mówi. BFD. Ponieważ nie mogę powiedzieć, o czym mówi, próba „obalenia” oświadczenia nie ma sensu. Jest to powszechna mantra bigotów C, ale to nie czyni jej bardziej zrozumiałym lub zrozumiałym.
- Prawidłowe użycie C ++ oznacza ograniczenie się do aspektów C. <- W rzeczywistości robi to kod WORSE C ++, więc wciąż nie wiem o czym mówi WTF.
Zasadniczo Torvalds mówi ze swojego tyłka. Nie powstaje żaden zrozumiały argument. Oczekiwanie poważnego odparcia takich bzdur jest po prostu głupie. Mówi mi się, żebym „rozwijał się” w odpowiedzi na coś, co miałbym rozwinąć, gdyby to było to, co powiedziałem. Jeśli naprawdę, szczerze spojrzysz na to, co powiedział Torvalds, zobaczysz, że tak naprawdę nic nie powiedział.
To, że Bóg mówi, że to nie znaczy, że ma to jakiś sens lub powinno być traktowane poważniej niż gdyby to powiedział jakiś przypadkowy bozo. Prawda jest taka, że Bóg jest kolejnym przypadkowym bozo.
Odpowiadając na aktualne pytanie:
Prawdopodobnie najgorsza i najczęstsza zła praktyka C ++ polega na traktowaniu jej jak C. Dalsze korzystanie z funkcji C API, takich jak printf, dostaje (również uważane za złe w C), strtok itp. Nie tylko nie udaje się wykorzystać dostarczonej mocy dzięki ciasnemu systemowi typów nieuchronnie prowadzą do dalszych komplikacji podczas próby interakcji z „prawdziwym” kodem C ++. Zasadniczo więc rób dokładnie odwrotność tego, co radzi Torvalds.
Naucz się korzystać z STL i Boost, aby uzyskać dalsze wykrywanie błędów w czasie kompilacji i ułatwić Ci życie na inne, ogólne sposoby (na przykład tokenizer doładowania jest zarówno bezpieczny dla typu ORAZ lepszy interfejs). To prawda, że musisz nauczyć się czytać błędy szablonu, co na początku jest zniechęcające, ale (z mojego doświadczenia i tak) jest to o wiele łatwiejsze niż próba debugowania czegoś, co generuje niezdefiniowane zachowanie w czasie wykonywania, co powoduje interfejs API dość łatwe do zrobienia.
Nie mówię, że C nie jest tak dobry. Oczywiście bardziej lubię C ++. Programiści C lubią C lepiej. W grze występują kompromisy i subiektywne upodobania. Istnieje również wiele dezinformacji i FUD. Powiedziałbym, że jest więcej FUD i dezinformacji krążących wokół C ++, ale jestem stronniczy w tym względzie. Na przykład problemy z „wzdęciem” i „wydajnością” w C ++ prawdopodobnie nie są tak naprawdę większymi problemami i na pewno są wyrzucone z proporcji rzeczywistości.
Jeśli chodzi o problemy, o których mówi profesor, nie są one unikalne dla C ++. W OOP (i w programowaniu ogólnym) wolisz kompozycję niż dziedziczenie. Dziedziczenie jest najsilniejszą możliwą relacją sprzężenia, która istnieje we wszystkich językach OO. C ++ dodaje jeszcze jedną, silniejszą, przyjaźń. Dziedziczenie polimorficzne powinno być stosowane do reprezentowania abstrakcji i relacji „jest-a”, nigdy nie powinno być wykorzystywane do ponownego użycia. Jest to drugi największy błąd, jaki możesz popełnić w C ++, i jest to dość duży błąd, ale nie jest on unikalny dla języka. Możesz również tworzyć zbyt złożone relacje dziedziczenia w języku C # lub Java, a będą one miały dokładnie takie same problemy.
virtual
funkcji, prawda?