2010-08-12 20 views
36

Odkryłem, że nie mam prywatnych funkcji klasy. Jeśli to możliwe, wszystkie kandydatki na klasy prywatne działają raczej w nienazwanej przestrzeni nazw i przekazują wszystkie niezbędne informacje jako parametry funkcji. Nie mam wytłumaczenia dźwiękowego, dlaczego to robię, ale przynajmniej wydaje mi się to bardziej naturalne. W konsekwencji muszę ujawnić mniej wewnętrznych szczegółów w pliku nagłówkowym.Funkcje klasy prywatnej a Funkcje w bezimiennej przestrzeni nazw

Jaka jest Twoja opinia - czy to jest właściwa praktyka?

+2

Myślę, że to naprawdę trudne pytanie (+1). I myślę, że wciąż są otwarte ważne odpowiedzi ... – Wolf

Odpowiedz

16

W pół dużych projektach, w których zwykle pracuję (ponad 2 miliony linii kodu), zakazywałbym prywatnym klasom funkcji, gdybym mógł. Powodem jest to, że prywatna funkcja klasy jest prywatna, ale jest widoczna w pliku nagłówkowym. Oznacza to, że jeśli zmienię podpis (lub komentarz) w każdym razie, jestem nagradzany czasami pełnym rekompilacją, która kosztuje kilka minut (lub godzin w zależności od projektu).

Po prostu powiedz "nie" i ukryj to, co jest prywatne w pliku cpp.

Gdybym zaczął od nowa w dużym projekcie C++, wymusiłabym wymysł PIMPL: http://c2.com/cgi/wiki?PimplIdiom, aby przenieść jeszcze więcej prywatnych danych do pliku cpp.

+1

To nie jest reguła 100%. Anonimowy obszar nazw ma ogromną wadę polegającą na tym, że nie można pisać terminali UT dla funkcji w nim zawartych.Pełna rekompilacja może być nieznaczną ceną do zapłacenia w porównaniu. Osobiście po prostu bym zablokował anonimowe przestrzenie nazw i egzekwował pokrycie UT dla prywatnych funkcji klasowych, przynajmniej dla niezbyt stabilnych projektów. – sankalpn

3

Myślę, że to dobra praktyka. Często ma to również zaletę ukrywania struktur pomocniczych i typów danych, co zmniejsza częstotliwość i rozmiar odbudowy. Ułatwia to również podział funkcji na inny moduł, jeśli okaże się, że są one przydatne w innych miejscach.

5

Zasadniczo sprowadza się do pytania, czy dana funkcja rzeczywiście ma sens jako część klasy. Jeśli twoim jedynym zamiarem jest zachować szczegóły klasy z nagłówka, rozważam użycie idiomu pimpl.

10

Zrobiłem to w przeszłości i zawsze źle się kończyło. Nie możesz przekazywać obiektów klas do funkcji, ponieważ muszą one uzyskać dostęp do prywatnych członków, prawdopodobnie przez odniesienie (lub kończysz na zawiłych listach parametrów), więc nie możesz wywoływać publicznych metod klasy. Z tego samego powodu nie można wywoływać funkcji wirtualnych. Mocno wierzę (na podstawie doświadczenia), że jest to Zły pomysł.

Podsumowanie: To brzmi jak idea, która może zadziałać tam, gdzie "moduł" implementacji ma specjalny dostęp do klasy, ale tak nie jest w C++.

+0

Masz rację, że czasami lista parametrów jest wystarczająco duża. Jest to zdecydowanie wadą tego podejścia. Z drugiej strony staram się trzymać z daleka od jakiejkolwiek funkcji wirtualnej, więc bardzo rzadko potrzebuję wywoływać funkcję wirtualną. W każdym razie dzięki za odpowiedź! – drumsta

+2

@kriau Dlaczego nie korzystać z funkcji wirtualnych? A ty nie usunąłeś zależności od nagłówka. Uderza mnie, że to, czego możesz tu szukać, to idiom PIMPL. –

+0

+1 dla Pimpl (nawet jeśli nie jest to część oryginalnej odpowiedzi) –