Jak pisać poprawny i przejrzysty kod

W tej lekcji przedstawię Ci kilka zagadnień związanych głównie z pisaniem programu tak, jak to piszą zawodowi programiści. Ten sam program można napisać na różne sposoby, a już samo spojrzenie na kod może świadczyć dobrze lub źle o osobie piszącej dany program.


Średniki w C++

Przyjrzyj się teraz kodom, które przedstawiłem Ci już w tym kursie. Zauważ, że po większości linijek znajduje się średnik. Zwróć jednak uwagę, że średnik nie znajduje się na końcu każdej linii.


Spróbuj teraz w którymś z przykładowych programów skasować jeden ze średników. Spróbuj skompilować program. Zapewne ujrzysz błąd i program się nie skompiluje. Przywróć początkowy stan programu i teraz dla odmiany spróbuj dodać średnik w którejś z linii, w której średnika nie było. O ile tylko średnik nie został dostawiony w linii pustej lub linii zawierającej któryś z nawiasów klamrowych, programu również nie uda się skompilować.


Jak zatem możesz się już teraz domyślać, średniki znajdujące się na końcach linii nie znajdują się tam przypadkowo. Ich wstawienie lub niewstawienie jest za każdym razem bardzo ważne, bowiem mały błąd może spowodować albo to, że program się nie skompiluje, albo co gorsza, że program się skompiluje, ale będzie działał nie tak, jak autor programu sobie życzył.


Tak naprawdę, nie do końca jest prawdą, że średniki musimy stawiać na końcu niektórych linii. Średniki musimy stawiać na końcu każdej instrukcji.

Instrukcja w języku C++

Instrukcję w języku C++ można utożsamiać ze zdaniem. Instrukcja jakby mówi, co ma się zdarzyć np. zadeklaruj zmienną, pobierz zmienną x, wypisz komunikat na ekran, zwróć wartość 0.


Oprócz instrukcji, w języku C++ występują również wyrażenia. Wyrażenia są jakby częściami instrukcji. Każda instrukcja może składać się z kilku lub kilkunastu wyrażeń. Na przykład, jeśli chcemy wypisać sumę liczb 2 i 3, wówczas suma liczb 2 i 3 stanowi wyrażenie, natomiast cała operacja wypisania stanowi instrukcję. Zasadniczą różnicą między instrukcjami i wyrażeniami jest to, że instrukcja musi zostać zakończona średnikiem. Natomiast wyrażeń nie kończymy średnikami - jeśli tak zrobimy, wówczas kompilator zasygnalizuje błąd.


Poprawność kodu, a wygląd kodu

Wszystkie kody źródłowe, które do tej pory Ci przedstawiłem były kodami poprawnymi z punktu widzenia składni języka. Każdy z kodów poprawnie się kompilował i przy kompilacji nie pojawiał się żaden błąd. Jeśli kody przedstawionych programów były przez Ciebie pisane własnoręcznie, porównaj wygląd kodu mojego i Twojego. Czy w Twoim kodzie źródłowym również niektóre linie są puste oraz są stosowane wcięcia w niektórych liniach?


Język C++ jest językiem, w którym tak naprawdę możemy pisać jak nam się to podoba. Możemy wstawiać puste linie, możemy kilka linii zapisać w jednej linii, a niektóre linie zapisać w kilku liniach. Możemy też stosować komentarze w zasadzie w dowolnym miejscu.


Aby uświadomić Ci wagę zagadnienia, spójrz na poniższe kody źródłowe programów i oceń, który z tych kodów najbardziej Ci się "podoba".


#include<iostream>
using namespace std;int main(){cout <<"Hello world"<<endl; getchar();return 0;}
program nr 4.1

#include<iostream>
using namespace std;
int main()
{
cout <<"Hello world"<<endl;
getchar(); return 0;
}
program nr 4.2

#include<iostream>
using namespace std;
int main(){
cout <<"Hello world"<<endl;
getchar();
return 0;
}
program nr 4.3

#include <iostream>

using namespace std;

int main()
{
  cout <<"Hello world"<<endl;
  getchar();
  return 0;
}
program nr 4.4

Wszystkie przedstawione przed momentem kody źródłowe robią dokładnie to samo! Uruchom kompilator i skompiluj każdy z przedstawionych programów. Zobaczysz, że każdy z nich bez problemu się skompiluje i na dodatek działa dokładnie tak samo.


Jak kod powinien wyglądać

Tak naprawdę, wygląd kodu dla działania programu nie ma żadnego znaczenia. Ważne jest jedynie, aby kod programu był poprawny. Wszystkie białe znaki (czyli spacje, dodatkowe linie, wcięcia za pomocą tabulatorów) nieznajdujące się pośród " i ', są ignorowane.


Wygląd kodu ma znaczenie tylko dla człowieka. W kodzie napisanym według pewnych niepisanych zasad, zdecydowanie łatwiej znaleźć interesujące nas fragmenty i zdecydowanie łatwiej zrozumieć, co taki kod robi.


Mam nadzieję, że jest oczywiste, że najbardziej czytelnym kodem z pośród grupy wcześniej przedstawionych kodów, jest kod napisany jako ostatni z przedstawionej grupy. W kodzie tym zostało zastosowanych kilka reguł. Przede wszystkim każda instrukcja znajduje się w nowej linii. Oprócz tego, dwie linie zostały pozostawione puste - aby oddzielić pewne fragmenty kodu od siebie. Na dodatek wszystko co znajduje się w funkcji main zostało "wcięte".


Zastosowanie tych trzech prostych zabiegów - pustych linii, wcięć oraz pisania każdej instrukcji w oddzielnej linii, niewątpliwie zwiększyło czytelność kodu.


Musisz jednak wiedzieć, że nie we wszystkich językach można robić "co się podoba". W niektórych starszych językach były na sztywno ustalone pewne zasady i ich nieprzestrzeganie powodowało, że kod się nie kompilował. Skoro język C++ pozwala na dowolne zabiegi poprawiające czytelność, to warto z nich skorzystać.


Przy okazji pragnę zwrócić Twoją uwagę na tzw. wcięcia. Jeśli o mnie chodzi, stosuję wcięcia składające się z 3 znaków spacji. Moim zdaniem jest to najrozsądniejsza wielkość wcięć - są one zarówno widoczne, jak i przy bardziej skomplikowanych programach nie utrudniają pisania kodu. Ty oczywiście zastosujesz wcięcia jakie będziesz chcieć - to była tylko moja sugestia.


Na koniec, pragnę zwrócić Twoją uwagę na to, co wspomniałem już wcześniej - po tym, jak wygląda kod programu, można zazwyczaj dość łatwo ocenić, czy ktoś już napisał kilkanaście - kilkadziesiąt kodów źródłowych, czy dopiero zaczyna naukę języka. Dlatego jeśli nie chcesz wszystkim ogłaszać, że jesteś początkującym programistą, postaraj się, aby Twój kod programu wyglądał jak należy.


Grupowanie instrukcji

Do grupowania instrukcji służą nawiasy klamrowe. Już w przykładowych programach udało Ci się zetknąć z tymi nawiasami - znajdowały się one wewnątrz funkcji main i służyły do zgrupowania instrukcji w funkcji main.


Przyjęte są dwie konwencje dotyczące zapisu nawiasów klamrowych. Obie konwencje przedstawiają poniższe przykłady:

#include <iostream>

using namespace std;

int main() {
  //jakies instrukcje
  return 0;
}
program nr 4.5

#include <iostream>

using namespace std;

int main()
{
  //jakies instrukcje
  return 0;
}
program nr 4.6

W pierwszej konwencji nawias klamrowy otwierający znajduje się w tej samej linii, w której znajduje się poprzednia instrukcja. Natomiast nawias klamrowy zamykający znajduje się na tej samej wysokości, co początek instrukcji. W rezultacie nawiasy nie są względem siebie na tej samej wysokości.


Z kolei w drugiej konwencji nawias klamrowy otwierający znajduje się w następnej linii w stosunku do instrukcji. Nawias klamrowy zamykający znajduje się tak jak poprzednio na tej samej wysokości, co początek instrukcji. W rezultacie nawiasy są względem siebie na tej samej wysokości.


Co dziwne, obie konwencje są tak samo popularne, chociaż moim zdaniem czytelność tej drugiej jest znacznie wyższa i dlatego właśnie ja osobiście stosuję drugi zapis. Oczywiście to, który Ty zapis będziesz stosować, zależy tylko od Ciebie. Zwróć ponadto uwagę, że w obu zapisach wszystko co znajduje się między parą nawiasów jest wcięte.


Komentarze w programach

Jak zapisuje się komentarze już wiemy. Pragnę jednak zwrócić uwagę, gdzie warto stosować komentarze.


Przede wszystkim komentarze warto stosować we fragmentach, których zrozumienie sprawia Ci największą trudność. Oczywiście wraz ze wzrostem Twojego poziomu zaawansowania, komentarze będziesz stosować na różnym poziomie: na początku może będziesz chcieć komentować każdą linię, a później kilka linii lub całą funkcję.


Warto jednak zwrócić uwagę na dwa aspekty stosowania komentarzy. Z jednej strony stosowanie komentarzy ułatwia zrozumienie kodu programu oraz poprawia czytelność. Z drugiej strony, jeśli zastosujesz zbyt wiele komentarzy lub zrobisz to w sposób niezbyt przemyślany, czytelność kodu może się znacznie pogorszyć.


Komentarze szczególnie warto stosować w jednym miejscu - w miejscu końca grupowania instrukcji, czyli tuż za nawiasem klamrowym zamykającym. Co prawda, w prostych programach nie jest to konieczne, jednak, gdy struktura programu robi się nieco bardziej skomplikowana, zastosowany komentarz może poprawić znacznie czytelność. Ja sugeruję w komentarzu napisać dokładnie to co było w pierwszej linii przed nawiasem otwierającym. Oto przykład:


#include <iostream>

using namespace std;

int main()
{
  return 0;
} // int main()
program nr 4.7

W tej lekcji przedstawiłem Ci sposoby, jak sprawić, aby kod Twoich programów był jak najbardziej czytelny. Co prawda wszystkie te reguły nie są krytyczne - nie musisz ich koniecznie stosować, jednak ich stosowanie sprawi, że Twój kod, również dla innych osób będzie przejrzysty i profesjonalny.


Jeśli jednak chcesz się w przyszłości zająć programowaniem na poważnie, od razu zacznij pisać zgodnie z niepisanymi zasadami. Znacznie trudniej jest bowiem zerwać ze złymi przyzwyczajeniami niż od razu nauczyć się pisać poprawnie.


powrót