Jak mogę nauczyć się pisać idiomatyczny C ++?

27

Jestem studentem informatyki, w wyniku czego nauczyłem się C ++ jako lepszej wersji języka C z klasami. W końcu próbuję wynaleźć koło, gdy potrzebne jest rozwiązanie złożonego problemu, ale po pewnym czasie mogę znaleźć jakąś funkcję języka lub standardową bibliotekę.

Czuję się dobrze z moimi char*i *(int*)(someVoidPointer)idiomami, ale ostatnio, po (niewielkim) udziale w projekcie open source, czuję, że nie tak powinno się myśleć, pisząc kod C ++. Jest znacznie inny niż C.

Biorąc pod uwagę, że znam programowanie zorientowane obiektowo dość dobrze i nie przeszkadza mi stroma krzywa uczenia się, co sugerowałbyś, abym zajął się ścieżką C ++, gdy koduję C ++?

yati sagade
źródło
7
Na podstawie twoich komentarzy znasz składnię C ++ i to wszystko. Nie piszesz w C ++. Znacznik C ++ na stackoverflow jest dobrym miejscem do rozpoczęcia, zawiera listę lektur i FAQ . Jedynym prawdziwym sposobem nauki jest pisanie kodu i zachęcanie doświadczonego użytkownika do komentowania. Możesz umieścić swój kod tutaj do wglądu. Dobry przykład
Martin York
1
Wraz z radą @ LokiAstari (z którą się zgadzam), powiedziałbym, że twoi przyjaciele mają rację, a przejście przez Accelerated C ++ byłoby prawdopodobnie dobrym pomysłem. Podejrzewam, że przekonasz się, że potrzeba o wiele mniej przeszukiwania, niż się spodziewasz - jest przeznaczony dla osób na twojej pozycji, które już znają się na programowaniu i przede wszystkim muszą nauczyć się idiomów współczesnego C ++.
Jerry Coffin
tak, właściwie ukończyłem pierwsze dwa rozdziały, ale rzeczy, które tam były, były w większości tym, co już wiedziałem - rozumiem, że autor nie tylko wyjdzie i napisze dla mnie książkę :) @LokiAstari dzięki za superinformacyjny komentarz :)
yati sagade
3
@yatisagade Nie oczekuj, że książka nauczy Cię mentalności języka w kilku rozdziałach. Może to być bardzo nudne, ponieważ znasz już składnię, ale powinieneś poświęcić się przejrzeniu kilku książek w C ++, przeczytaniu wszystkiego i wykonaniu każdego ćwiczenia, ponieważ byłeś całkowicie początkującym językiem. Nauczenie się w niewłaściwy sposób oznacza, że ​​musisz podwoić wysiłki, ponieważ musisz zapomnieć o krzywdach i nauczyć się praw (lub czegoś takiego).
yannis
1
Czuję się dobrze z [...] - (int) (someVoidPointer) Czy debugowałeś wcześniej wersję 64-bitową?
Ed S.

Odpowiedzi:

12

Na podstawie twoich komentarzy znasz składnię C ++.
Nie piszesz w C ++, ale to, co często określa się jako C w klasach.

Znacznik C ++ na stackoverflow jest dobrym miejscem do rozpoczęcia, zawiera listę czytelniczą i FAQ .

Jedynym prawdziwym sposobem nauki jest pisanie kodu i zachęcanie doświadczonego użytkownika do komentowania. Tutaj możesz umieścić swój kod do sprawdzenia. Dobry przykład

Czuję się swobodnie z moimi „char *”

Przestań ich używać, przejdź na std :: string.

oraz (int) (someVoidPointer) idiomy.

Przestań ich używać (oprócz interfejsu z kodem C). Korzystanie z koncepcji funktora zapewnia szereg korzyści (w tym pojęcie stanu kapsułkowania).

Ale ostatnio, po (niewielkim) udziale w projekcie OSS, czuję, że nie tak myślisz w C ++. Jest zupełnie inaczej, chociaż C ma swoje miejsce.

Tak. C i C ++ rozeszły się jako języki. Chociaż można użyć praktycznie tej samej składni, co uważa się za dobry kod C, zwykle nie jest uważany za dobry kod C ++ (lub odwrotnie).

Niektórzy znajomi sugerowali przyspieszenie C ++, ale znowu wiem, jakie są typy, jakie są klasy i jakie jest przeciążenie.

Masz podstawowe podstawy.

W jaki sposób (okaleczony) programista C ++, który akurat rozumie koncepcje OO, może pisać idiomatyczne programy w tym języku.

Dużo pracy :-)

Martin York
źródło
To nie jedyny sposób. Możesz się wiele nauczyć z dobrych książek.
Dima,
1
@Dima: Oczywiście. Możesz się wiele nauczyć z książek. Ale nic nie przebije doświadczenia i używania języka w gniewie, nie uda się ponownie spróbować ponieść porażki i wypracować najlepszy sposób na zrobienie tego. Przypuszczam, że możesz uczyć się francuskiego z książki, ale wątpię, by Francuzi uważali cię za płynnego.
Martin York,
6
IMHO, najskuteczniejszym sposobem nauki jest zacząć od książek, nauczyć się właściwego sposobu robienia rzeczy, wypróbować to w praktyce, a następnie poprosić kogoś o krytykę twojego kodu.
Dima,
@Dima: Nie mam z tym kłótni.
Martin York,
12

Książka Effective C ++ uczy wielu interesujących rzeczy i pozwoli Ci docenić funkcje C ++. Istnieje również Efektywna STL - nie przeczytałem jej, ale jestem pewien, że byłaby to świetna lektura, jeśli nie znasz STD.

Ważną rzeczą jest, aby dowiedzieć się, że należy skorzystać z językiem i nie wyważać otwartych drzwi stale . Nauczyłeś się już, jak je tworzyć, więc ułatw sobie (i innym!) I używaj narzędzi, które wykorzystują cały swój potencjał.

Na marginesie, spotkasz wielu ludzi, którzy domagają się użycia STD. Jest to tak samo złe nastawienie jak samo używanie char*- czasami nie jest to właściwe narzędzie i jest wiele innych. W tym samym sensie nie zniechęcaj się do tworzenia własnych klas kontenerów - jeśli zamierzasz używać char*najlepszego miejsca do tego celu, jest bezpiecznie zapakowane wewnątrz klasy.

Pubby
źródło
Wiem o skutecznej serii (nie przeczytałem ich) - Ale myślę, że dotyczą problemów z najlepszymi praktykami, prawda?
yati sagade
3
@yati sagade: nie, te książki są dokładnie tym, czego potrzebujesz, aby przejść z „C z klasami” do pełnoprawnego C ++.
Dima,
Rozumiem - właściwie miałem skuteczne c ++ od Meyersa w kolejce po Accelerated C ++.
yati sagade
1
@Dima "Celem tej książki jest pokazanie, jak skutecznie posługiwać się C ++. Zakładam, że znasz już C ++ jako język i masz pewne doświadczenie w jego użyciu. To, co tu przedstawiam, to przewodnik po tym, jak używać języka twoje oprogramowanie jest zrozumiałe, łatwe w utrzymaniu, przenośne, rozszerzalne, wydajne i prawdopodobnie zachowuje się tak, jak się spodziewasz. ”- Skuteczne C ++. Obejmuje również kilka „gotchas”, które czynią go interesującym.
Pubby
1
@Dima: Ostrożnie tutaj. Druga edycja była skierowana do nowych programistów C ++ pochodzących z C. (Najnowsza) trzecia edycja jest bardziej skierowana do programistów pochodzących z języków takich jak Java, C # itp.
sbi
6

Mogę polecić ostatnie ujęcie BUILD podane przez Herb Suttera. Ten zatytułowany „ Pisanie nowoczesnego kodu C ++: ewolucja C ++ na przestrzeni lat ”:

Wiele osób myśli o C ++ jako tym samym języku, którego doświadczali na studiach lub po prostu jako „C z klasami”, ale język C ++ ewoluował na przestrzeni lat. W tej sesji omówimy, jak używać C ++ do pisania innowacyjnych, ekspresyjnych i pięknych aplikacji dostarczających aplikacje zwiększające moc i wydajność. Dołącz do nas, aby zobaczyć, jak nowo ukończony standard C ++ 0x może sprawić, że pisanie C ++ będzie tak wydajne, jak wiele innych języków.

Nie jest to zła prezentacja, niezbyt długa, ma kilka miłych wskazówek na temat nowych funkcji w najnowszym standardzie, które dałyby kilka wskazówek, jak zaktualizować stary styl C / C ++.

Poza tym musisz nauczyć się STL - nie jest to skomplikowane i jest mnóstwo książek, np. Efektywny STL, lub po prostu samouczki dla STL, aby zacząć.

gbjbaanb
źródło
+1 dzięki. To było cudowne. Cieszę się, że zadałem to pytanie. Tyle wspaniałych linków :)
yati sagade
4

Przeczytałem Accelerated C ++ autorstwa Andrew Koeniga i Barbary Moo, aby pomóc mi w nauczaniu C ++ po prawie dziesięciu latach pracy z C ++. (W tym czasie zacząłem majstrować przy metaprogramowaniu szablonów). Nadal uważałem to za objawienie, chociaż nie sądzę, że nauczyło mnie to nowych faktów na temat języka. 1

Nauczyłem się jednak patrzeć na C ++ i używać go jako języka wysokiego poziomu. Nie majstrować przy surowych wskaźnikach i deleteużywać standardowej biblioteki tam, gdzie to możliwe.

Mam wrażenie, że właśnie tego szukasz.

1 Nie znaczy to, że nie było już nic, czego mógłbym się nauczyć (nawet teraz jest ich mnóstwo, dekadę później), ale jest tylko tyle wiedzy, którą można wcisnąć w 250-stronicową książkę wprowadzającą.

sbi
źródło
1

Przed odpowiedzią - uwaga: Idiomatic C ++ jest ruchomym celem. Wraz ze zmianą języka zmieniają się również jego idiomy. W rzeczywistości, niektóre funkcje językowe są przeznaczone do pozwala nam pozbyć się kodu idiomatyczne, które mogłyby zostać uproszczone lub ulepszone z pewnym wsparciu samego języka, albo przynajmniej biblioteki standardowej. Pamiętaj więc, że każde źródło może Cię poinformować tylko o tym, co było idiomatyczne w momencie pisania .

Powiedziawszy to, dobrze byłoby sprawdzić:

Witryna codereview.SX

Sieć StackExchange ma witrynę o nazwie codereview.stackexchange.com . Jeśli napisałeś fragment kodu C ++ - klasę, część biblioteki, coś niezbyt dużego - możesz go tam opublikować i poprosić społeczność o sprawdzenie. Pamiętaj, że kod musi się kompilować i być w zasadzie funkcjonalny - ta strona nie jest przeznaczona do debugowania.

Możesz także wyszukać tam kod C ++ związany z tym, nad czym pracujesz, i zobaczyć, co podkreślają recenzenci. Możesz nawet spróbować samodzielnie przeczytać opublikowany kod, nie zamieszczając odpowiedzi, a następnie przeczytać, co inni o nim myślą.

Prezentacje wideo z konferencji C ++

Każdego roku odbywa się kilka konferencji programistów poświęconych C ++:

i to nie są jedyne ... w każdym razie, każdy z tych postów wideo wielu / wszystkich prezentacji. Nauczą cię bardzo dużo , w tym kodowania idiomatycznego i zasady, według których możesz zdecydować, co powinno być idiomatyczne, a czego nie.

Czasami można nawet uzyskać przesuwane talie głośników.

einpoklum - przywróć Monikę
źródło
0

Cóż, projekty open source to bardzo dobry początek. Nie oczekuj, że zostaniesz profesjonalnym programistą opartym na twoich zajęciach uniwersyteckich, nie są do tego przeznaczone (jak napisałem w mojej odpowiedzi tutaj ).

Wygląda na to, że znasz składnię, to dobrze. Teraz idź i przeczytaj kod innych osób i dodaj swój własny do recenzji. Wiele się nauczysz czytając kod i próbując go zrozumieć, debugując go i naprawiając, i oczywiście - dodając do niego przestrzegając już istniejących konwencji kodowania.

Jak już wspomniano, profesjonalne książki są również bardzo dobrym pomysłem, a przeglądanie pytań i odpowiedzi na StackOverflow nauczy Cię bardzo dużo (na pewno dużo mnie uczy i uważam się za profesjonalistę w C ++).

littleadv
źródło
-1

Czytanie dużo dobrego kodu C ++ prawdopodobnie pomoże. Musisz zobaczyć kod, żeby go poczuć. Z drugiej strony większość kodu C ++ jest niepoprawna.

Koder
źródło
„większość kodu C ++ jest niepoprawna” - czy możesz to wyjaśnić? Widziałem, że większość projektów OSS faktycznie utrzymuje wysokie standardy jakości.
yati sagade
1
Projekty, tak, ale przeglądanie tego, jak robić rzeczy, często prowadzi do złych przykładów.
Koder
1
@yati: Moje doświadczenie z projektami OSS jest odwrotne.
sbi
@sbi może - byłem zaangażowany w projekt Mozilla i Google Chrome (właściwie nie jestem tutaj zaangażowany, ale coś w rodzaju nauki). Okazało się, że ich dyscyplina jest wyjątkowa!
yati sagade
@yatisagade: Przynajmniej większość istniejącego kodu C ++ została napisana, gdy język miał funkcje, które są dziś niezbędne do pisania dobrego kodu; a większość reszty została napisana przy użyciu bibliotek, które zostały napisane do pracy z tak starszym kodem, więc ten nowszy kod musi być do nich w pewnym stopniu dostosowany. A wszystko to niezależnie od tego, czy koderzy poświęcają czas i wysiłek niezbędny do porządnego zaprojektowania i wdrożenia ...
einpoklum - przywróć Monikę