C.1 — Koniec?

Gratulacje! Udało Ci się przejść wszystkie tutoriale! Poświęć chwilę i podaruj sobie zasłużony (wstaw tutaj coś, co sprawia Ci przyjemność).

Teraz, po długim westchnieniu ulgi, prawdopodobnie zadajesz sobie pytanie: „Co dalej?”.

Co dalej?

W tym momencie powinieneś już solidnie rozumieć rdzeń języka C++. Dzięki temu możesz kontynuować swoją podróż edukacyjną do innych sąsiednich obszarów. Jeśli więc jest coś, o czym naprawdę chcesz się dowiedzieć, teraz jest dobry moment, aby sprawdzić, czy masz wystarczającą wiedzę, aby się tym zająć.

Jednak myślę, że dla większości użytkowników istnieje kilka naturalnych kolejnych kroków.

Struktury danych, algorytmy i wzorce projektowe

Jeśli jeszcze się o tym nie dowiedziałeś, to jest moja najsilniejsza rekomendacja.

A dane struktura to zbiór danych i dobrze zdefiniowany zestaw metod uzyskiwania dostępu do danych lub manipulowania nimi. Najpopularniejszą strukturą danych używaną w programowaniu jest tablica, która przechowuje wiele elementów tego samego typu w pamięci sekwencyjnej. Można manipulować danymi wewnątrz tablicy, korzystając z indeksowania tablicy, aby uzyskać bezpośredni dostęp (lub zmodyfikować) elementy wewnątrz tablicy. Na lekcjach omówiliśmy także strukturę danych stosu, która udostępnia funkcje push, pop i top umożliwiające dostęp do danych na stosie.

An algorytm to samodzielny zestaw operacji, które zazwyczaj manipulują danymi wyjściowymi lub obliczają je na podstawie danych w strukturze danych. Na przykład, przeglądając tablicę w celu znalezienia wartości mediany, wykonujesz algorytm. Wyszukiwanie binarne to algorytm sprawdzający, czy dana wartość istnieje w posortowanej tablicy. Procedury sortowania (takie jak sortowanie przez wybór i sortowanie bąbelkowe) to algorytmy sortujące zbiory danych.

Przez lata matematycy i informatycy opracowali dość standardowy zestaw struktur danych i algorytmów wielokrotnego użytku, które są przydatne do konstruowania bardziej złożonych programów. Wszystkie one wiążą się z różnymi kompromisami. Na przykład tablice umożliwiają szybki dostęp do danych i sortowanie, ale powolne dodawanie lub usuwanie elementów. Z drugiej strony listy połączone mają powolny dostęp do danych i sortowanie, ale bardzo szybko dodają lub usuwają elementy (jeśli już wiesz, gdzie te elementy się znajdują).

Dlaczego to ma znaczenie? Użyjmy analogii. Jeśli zamierzasz zbudować dom, możesz zbudować wszystkie narzędzia od podstaw, jeśli chcesz. Ale zajęłoby to dużo czasu i prawdopodobnie zepsułbyś sporo rzeczy i musiałbyś zacząć od nowa (tworzyłeś kiedyś młotek? Ja też nie). Ponadto, jeśli użyjesz niewłaściwego narzędzia do swojej pracy, ucierpi na tym Twoja jakość (spróbuj wbić gwoździe za pomocą klucza).

Bardziej prawdopodobne jest, że pójdziesz do lokalnego sklepu z narzędziami i kupisz kilka narzędzi: młotek, poziomicę, kwadrat stolarski itp.… a następnie przeczytasz kilka tutoriali internetowych na temat prawidłowego ich używania. Znacznie przyspieszyłoby to prace związane z budową domu.

Struktury danych i algorytmy służą temu samemu celowi w programowaniu: są to narzędzia, które, jeśli wiesz, jak z nich korzystać, mogą znacznie przyspieszyć wykonywanie zadań z zachowaniem wysokiej jakości.

Dobra wiadomość jest taka, że ​​wiele z tych struktur danych i algorytmów zostało już zaimplementowanych w standardowej bibliotece. Niektóre z nich spotkałeś już w poprzednich tutorialach: std::array, std::vector, std::stack, std::string i std::sort, żeby wymienić tylko kilka. Nauka ich efektywnego i odpowiedniego wykorzystania to świetny sposób na wykorzystanie Twojego czasu.

Jeśli brakuje Ci czasu (lub cierpliwości), nauczenie się korzystania z najpopularniejszych struktur danych i algorytmów to minimum, które powinieneś zrobić. Jeśli jednak masz ochotę, spróbuj samodzielnie odtworzyć te struktury danych od zera. To naprawdę dobra praktyka w pisaniu kodu wielokrotnego użytku, która pomoże Ci w przyszłości, gdy czegoś, czego potrzebujesz, nie ma w standardowej bibliotece. Ale potem je wyrzuć i użyj tych ze standardowej biblioteki. :)

Struktury i algorytmy danych dają nam dobre narzędzia do przechowywania danych i manipulowania nimi. Istnieje jednak jeszcze jedno narzędzie, które możemy dodać do naszego zestawu narzędzi i które pomoże nam pisać lepsze programy. wzorzec projektowy jest rozwiązaniem wielokrotnego użytku często występującego problemu przy projektowaniu oprogramowania.

Na przykład często musimy przeglądać elementy jakiejś zagregowanej struktury danych (takiej jak tablica lub połączona lista), np.: znaleźć największą lub najmniejszą wartość. Jednak konieczność zrozumienia, w jaki sposób zaimplementowany jest typ agregowany, aby wiedzieć, jak go przeglądać, zwiększa złożoność, szczególnie jeśli musimy sami napisać oddzielny kod przeglądania dla każdego typu agregacji. Iteratory (które omówiliśmy wcześniej w tej serii samouczków) to wzorzec projektowy zapewniający interfejs umożliwiający przechodzenie przez różne typy agregacji w spójny sposób i bez konieczności wiedzy o tym, w jaki sposób te typy agregacji są implementowane. A bardziej spójny kod jest łatwiejszy do zrozumienia i rzadziej zawiera błędy.

Oto kolejny przykład. Załóżmy, że piszesz grę online i Twój program musi utrzymywać otwarte połączenie z serwerem, aby wysyłać i odbierać aktualizacje stanu gry. Ponieważ otwieranie nowych połączeń jest kosztowne, prawdopodobnie będziesz chciał mieć pewność, że Twój program będzie miał tylko jeden globalny obiekt połączenia i zapobiegnie tworzeniu dodatkowych połączeń z serwerem (aby przypadkowo nie utworzyć wielu obiektów połączeń i nie przeciążyć serwera). Gdybyś przejrzał odniesienia do typowych wzorców projektowych, odkryłbyś, że istnieje już wzorzec projektowy zapewniający, że można utworzyć tylko jedną, globalną instancję obiektu (zwaną singletonem). Zamiast więc tworzyć do tego własny (prawdopodobnie wadliwy) interfejs, możesz zaimplementować sprawdzony w boju pojedynczy wzorzec projektowy, który inni programiści prawdopodobnie będą już zaznajomieni.

Standardowa biblioteka C++

Większość standardowej biblioteki C++ to struktury danych i algorytmy. Jednak biblioteka standardowa zawiera także inne rzeczy i kolejnym krokiem może być ich zbadanie. Istnieją między innymi biblioteki liczbowe (matematyczne), procedury wejścia/wyjścia, funkcje do obsługi lokalizacji i regionalizacji, wyrażenia regularne, wątki i dostęp do plików. Każde nowe wydanie C++ (co zdarza się już mniej więcej co 3 lata) dodaje partię nowych funkcjonalności do biblioteki standardowej. Nie jest konieczne, abyś wiedział, jak wszystko tam działa, ale warto przynajmniej mieć świadomość tego, co istnieje, aby w razie potrzeby dowiedzieć się więcej. https://cppreference.com/w/cpp to mój podstawowy punkt odniesienia, dzięki któremu odkrywasz, co istnieje.

Aplikacje graficzne

W naszej serii tutoriali opracowaliśmy aplikacje konsolowe, ponieważ są łatwe, wieloplatformowe i nie wymagają instalowania dodatkowego oprogramowania. W przeciwieństwie do wielu współczesnych języków programowania, C++ nie oferuje funkcji tworzenia okien aplikacji ani wypełniania tych okien elementami graficznymi lub widżetami graficznego interfejsu użytkownika (pola wyboru, suwaki itp.). Aby zrobić te rzeczy w C++, będziesz musiał skorzystać z pomocy biblioteki innej firmy lub nauczyć się korzystać z natywnych interfejsów API swojego systemu operacyjnego/platformy.

Uruchomienie aplikacji graficznej wymaga wykonania kilku dodatkowych kroków w porównaniu z aplikacjami konsolowymi. Najpierw musisz zainstalować bibliotekę innej firmy lub zestaw SDK systemu operacyjnego i podłączyć go do swojego IDE, aby móc go wkompilować do swojego programu. Większość bibliotek graficznych powinna zawierać instrukcje, jak to zrobić dla najpopularniejszych IDE. Następnie musisz utworzyć instancję okna systemu operacyjnego, co wymaga wywołania określonej funkcji z zestawu narzędzi. Większość, jeśli nie wszystkie, bibliotek powinna zawierać przykładowe programy, które możesz skompilować i przeanalizować, jeśli nie masz pewności, jak zrobić coś podstawowego.

Jest wiele bibliotek i to, której powinieneś użyć, zależy od Twoich wymagań (musisz przeprowadzić własne badania, aby określić, która z nich jest dla Ciebie odpowiednia). Popularne opcje obejmują Qt, WxWidgets, SDL i SFML. Jeśli chcesz tworzyć grafikę 3D, wszystkie te frameworki obsługują OpenGL, a w Internecie można znaleźć świetne tutoriale dotyczące OpenGL.

Aplikacje graficzne zazwyczaj działają inaczej niż aplikacje konsolowe. W przypadku aplikacji konsolowej program rozpoczyna wykonywanie od początku funkcji main(), a następnie działa sekwencyjnie, zwykle zatrzymując się tylko w celu wprowadzenia danych przez użytkownika. Aplikacje graficzne również rozpoczynają wykonywanie od góry funkcji main(), zazwyczaj tworzą okno, wypełniają je grafiką lub widżetami, a następnie wchodzą w nieskończoną pętlę, czekając, aż użytkownik wejdzie w interakcję z oknem (poprzez kliknięcie myszą lub klawiaturę). Ta nieskończona pętla nazywana jest pętlą zdarzeń i kiedy nastąpi kliknięcie lub naciśnięcie klawisza, zdarzenie to jest kierowane do funkcji obsługujących tego typu zdarzenia. Nazywa się to obsługą zdarzeń. Po obsłużeniu zdarzenia pętla zdarzeń kontynuuje działanie w oczekiwaniu na kolejny bit danych wejściowych użytkownika.

Programowanie TCP/IP / sieciowe (inaczej internet)

W dzisiejszych czasach dość rzadko można znaleźć programy, które nie łączą się z Internetem, serwerem/usługą zaplecza lub nie wykorzystują w jakiś sposób chmury. Każdy program wymagający posiadania konta i logowania łączy się z serwerem i uwierzytelnia użytkownika. Wiele programów łączy się z jakąś usługą, aby sprawdzić, czy dostępna jest aktualizacja. Aplikacje społecznościowe utrzymują trwałe połączenie z infrastrukturą społecznościową, aby umożliwić użytkownikom komunikację między sobą na żądanie. Oto przykłady sieci.

Sieć (ogólnie) to koncepcja łączenia programu z innymi programami, albo na twoim komputerze, albo na komputerach podłączonych do sieci, w celu wymiany informacji. Sieć to potężne narzędzie — w przeszłości, jeśli chciałeś zmienić zachowanie aplikacji, musiałeś wydać aktualizację aplikacji. Teraz, mając dobry projekt programu, możesz po prostu zaktualizować informacje gdzieś na serwerze, a wszystkie instancje programu będą mogły wykorzystać tę zmianę.

Podobnie jak w przypadku wielu rzeczy w C++, istnieją biblioteki, które pomogą twoim programom C++ działać w sieci. Biblioteka Asio C++ jest powszechnie używana (istnieją dwa warianty – wersja samodzielna i wersja integrująca się z Boost, która jest biblioteką udostępniającą wiele różnych funkcji, podobnie jak biblioteka standardowa).

Wielowątkowość

Wszystkie programy, które widzieliśmy w tej serii tutoriali, działają sekwencyjnie. Jedno zadanie się kończy, potem zaczyna się następne. Jeśli zadanie utknie (np. prosisz użytkownika o wprowadzenie danych, a on jeszcze nic nie wprowadził), cały program zostaje wstrzymany. Jest to dobre rozwiązanie w przypadku prostych programów akademickich, ale nie jest tak dobre w przypadku rzeczywistych zastosowań. Wyobraź sobie, że Twój program nie jest w stanie obsłużyć kliknięcia czegoś przez użytkownika, ponieważ jest zajęty rysowaniem czegoś na ekranie, lub cały program zostaje wstrzymany/zamrożony podczas trwania połączenia sieciowego. Program mógłby przestać odpowiadać.

Na szczęście istnieje metoda umożliwiająca programom wykonywanie wielu zadań jednocześnie. Nazywa się to gwintowaniem. Podobnie jak w przypadku (większości) jednoczesnego chodzenia i żucia gumy balonowej, wątki pozwalają programowi „podzielić” swoją uwagę i wykonywać wiele czynności równolegle.

Na przykład niektóre aplikacje graficzne (takie jak przeglądarki internetowe) umieszczają elementy renderujące (rysowanie grafiki) aplikacji w osobnym wątku, dzięki czemu aktualizacja ekranu nie blokuje innych rzeczy (takich jak akceptowanie danych wprowadzanych przez użytkownika) podczas rysowania. Wywołania sieciowe są często wykonywane w oddzielnych wątkach, więc jeśli rozwiązanie połączenia sieciowego zajmie trochę czasu, aplikacja nie zatrzyma się w trakcie oczekiwania.

Wątkowanie jest potężne, ale wprowadza dodatkową złożoność i dużo miejsca na dodatkowe błędy. Dlatego nie polecałbym zaczynać od tego miejsca — jest to jednak dobry obszar, w którym możesz się czegoś dowiedzieć, zwłaszcza jeśli chcesz tworzyć złożone aplikacje graficzne lub programować sieciowo.

Popraw swoje podstawy

Inną opcją jest poświęcenie czasu na lepsze zrozumienie najlepszych praktyk. W tym celu gorąco polecam przeczytanie Podstawowych Wytycznych CPP, z opcjonalnym zagłębieniem się w bibliotekę GSL.

Ciągle ćwicz!

Najlepszym sposobem na lepsze programowanie jest więcej programowania!

Opracowanie większego projektu (np. ponad 1000 linii kodu) może być zabawne i wymagające. Spróbuj zaimplementować jakąś prostą grę lub symulację! Gry karciane są często dobrym wyborem, ponieważ mają dość proste zasady i można je wdrożyć za pomocą danych wyjściowych konsoli. Jedna sugestia: Szalone Ósemki.

Teraz byłby dobry moment, aby dołączyć do strony internetowej oferującej różne ćwiczenia programistyczne, sprawdzające Twoje umiejętności. Gorąco polecamy Codewars, ponieważ jest darmowy i zawiera mnóstwo kreatywnych wyzwań programistycznych! Projekt Euler ma także wiele trudnych problemów do rozwiązania.

Nie przestawaj, gdy coś zadziała. Poświęć trochę czasu na udoskonalenie kodu (np. refaktoryzację, usunięcie nadmiarowości). Zmierz szybkość swojego rozwiązania (patrz 18.4 — Synchronizacja kodu), a następnie sprawdź, czy możesz znaleźć sposoby na optymalizację kodu, aby działał szybciej!

Do widzenia!

W tym miejscu chciałbym poświęcić chwilę, aby podziękować Ci za zatrzymanie się i przeczytanie tej serii samouczków. Mam nadzieję, że miło spędziłeś tu czas i uznałeś tę stronę za przydatną. Specjalne podziękowania należą się tym z Was, którzy pomogli w utrzymaniu tej witryny jako bezpłatnego zasobu dostępnego dla każdego, oglądając reklamy, które Państwa interesują. Wpadnij ponownie!

Powodzenia (i umiejętności) w przyszłych przedsięwzięciach i szczęśliwego programowania! I pamiętajcie, starzy programiści nigdy nie umierają — po prostu wychodzą poza zakres.

-Alex

PS: Jeśli masz jakieś uwagi lub inne sugestie dotyczące kolejnych zagadnień, proszę wspomnij o nich w sekcji komentarzy poniżej.

guest
Twój adres e-mail nie zostanie wyświetlony
Znalazłeś błąd? Zostaw komentarz powyżej!
Komentarze związane z poprawkami zostaną usunięte po przetworzeniu, aby pomóc zmniejszyć bałagan. Dziękujemy za pomoc w ulepszaniu witryny dla wszystkich!
Awatary z https://gravatar.com/ są połączone z podanym adresem e-mail.
Powiadamiaj mnie o odpowiedziach:  
912 Komentarze
Najnowsze
Najstarsze Najczęściej głosowane
Wbudowane opinie
Wyświetl wszystkie komentarze