Rozdział 23
Rozdział ten ma za zadanie |Ktkazm' powszechnie stosowane metody programowania w C. Nie będziemy tu uczyć, jak należy stawiać nawiasy klamrowe ani który sposób nazewnictwa zmiennych jest najlepszy prowadzone są o to spoty', z których niewiele wynika. Zaprezentowane tu rozwiązania mają konkretny wpływ na jakość tworzonych programów.
W większości obiektowych języków programowania obiekty nie mogą być tworzone bezpośrednio obiekty otrzymuje się wywołując specjalną mcto<lę danej klasy, zwaną konstruktorem. Konstruktory są ważne, ponieważ |x>zwjilają zapewnić obiektowi odpowiedni stan początkowy. Destruktory, wywoływane na końcu czasu życia obiektu, są istotne, gdy obiekt ma wyłączny dostęp do pewnych zasobów i konieczne jest upewnienie się. czy te zasoby zostaną zwolnione.
Ponieważ C nie jest językiem obiektowym, nie ma wbudowanego wsparcia dla konstruktorów i destruktorów. Często programiści bezpośrednio modyfikują tworzone obiekty i Struktury. Jednakże prowadzi to do potencjalnych błędów, ponieważ operacje na obiekcie mogą sję nie powieść lub zachować się nieprzewidywalnie, jeśli obiekt nie został prawidłowo zainicjalizowany. Lepszym podejściem jest stworzenie funkcji, która tworzy instancję obiektu, ewentualnie przyjuuijąc pewne parametry:
struct string { size.t size; char *data;
struct string *create_string(const char *initial) { assert (initial !* NULL);
struct string *nev_string = nalloc(sizeof(•nev_string)); if (new.string !■ NULL) {
new_string->size ■ strlen(initial); nev_string->data - strdup(initial);
>
return nev_string;
Podobnie, bezpośrednie usuwanie obiektów może nie do końca się udać. prowadząc do wycieku zasobów. Lepiej jest użyć destruktora:
165