Przykładowy kod w C++ – dlaczego nie każdy przykład jest dobry
W sieci krąży całe mnóstwo przykładowych kodów źródłowych, napisanych mniej lub bardziej elegancko i poprawnie (to, że program działa nie implikuje, że jest poprawny :) - ten ani nie działa - daje błędne wyniki, ani nie jest poprawny, ani nie jest elegancki). Spotkałem dziś paczkę zawierającą kilka prostych programów obliczających pola figur. Paczka ma być “Przydatna dla ludzi, którzy nie mają pojęcia o programowaniu”, czyli, jak rozumiem ma stanowić pewnego rodzaju wzór z którego można się czegoś dobrego nauczyć i co warto naśladować. Dobre przykłady są fundamentem nauki programowania, ale nie każdy przykład jest dobry.
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
int r;
float pi=3.14;
cout << "Pole kola\n";
cout << "Podaj dlugosc promienia: ";
cin >> r;
cout << "\n";
int p_kola(pi * (r * r));
cout << "Pole wynosi: " << p_kola;
getch();
return 0;
}
Plik nagłówkowy conio.h nie jest częścią standardu języka C ani C++ ani POSIX. Wywodzi się on jeszcze z dawnych kompilatorów działających w systemie DOS (np. ja osobiście kojarzę go z kompilatorów Borland Turbo C++). Używając tej biblioteki tworzymy nieprzenaszalny kod. Bez dodatkowych czynności nie będzie kompilował się na przykład w systemach uniksopodobnych. Nie jest to dobra praktyka. Dobrze byłoby ograniczyć się do używania jedynie bibliotek wchodzących w standard, co w przyszłości może zaowocować łatwiejszą pielęgnacją i utrzymaniem kodu. W tym przypadku to oczywiście nic poważnego, ale warto wyrabiać sobie dobre nawyki.
Stałe powinno się opatrywać dodatkowym słowem kluczowym const. To również niby nic wielkiego, ale stosowanie const poprawia właściwość “samo-komentowania się” kodu. Gdy patrzymy na duży objętościowo kod, wyłapanie słów const pomaga w “uchwyceniu” koncepcji działania programu.
Linijka 14 jest kwintesencją całego przykładu. Wyraźnie widać, że autor chciał się pochwalić obiektowością. Programiści często lubią się chwalić różnymi wysublimowanymi konstrukcjami. Tylko, że na dłuższą metę to również nie jest dobra praktyka. Kod należy pisać w sposób możliwie najprostszy, bez żadnych własnych udziwnień, cały czas obierając sobie za cel to, aby inny programista był w stanie szybko zrozumieć naszą wizję i kontynuować tworzenie kodu. Język C++ umożliwia traktowanie typów prostych jak klas i wykonywanie rzutowania podczas tworzenia obiektu poprzez podawanie wyrażenia w konstruktorze. Tyle, że jest to straszliwe udziwnienie, nie wnoszące żadnej wartości dydaktycznej a jedynie mogące namieszać osobie uczącej się programowania. Nie wspominam już tutaj o tym, że pole nie koniecznie musi być liczbą całkowita, o czym autor chyba zapomniał w przypływie zachwytu nad właśnie zastosowanym konstruktorem typu prostego int.
Ten przykład skłania do szerszej refleksji na temat jakości merytorycznej dostępnych w Internecie materiałów. Często słyszałem od ludzi nauki, że Internet jako źródło wiedzy jest swoistym śmietnikiem. Niestety wraz z upowszechnianiem się dostępu do Internetu wzrasta ilość treści bezwartościowych. Mógłbym nawet zaryzykować twierdzenie, że w pewnym sensie czasy gdy mało kto miał dostęp do Internetu miały swoje zalety. Obecnie wszędzie gdzie tylko można postuluje się najlepiej darmowy dostęp do Internetu i najlepiej dla wszystkich. Nie twierdzę, że w Internecie nie ma treści wartościowych. Oczywiście, że są. Wraz z rozwojem Internetu ogromnie dużo ich przybyło. To świetnie. Tylko, że przybyło również ogromnie dużo śmieci, a surfowanie po śmietnisku przestaje być przyjemne.