Mam zadanie domowe i muszę ocenić, które podejście jest lepsze zgodnie z GRASP „Protected Variation”. Znalazłem pytanie na temat przepełnienia stosu dotyczące rozdzielenia plików nagłówka i kodu w C ++ .
Jednak chcę wiedzieć, dlaczego Java nie podąża za C ++ w promowaniu rozdzielenia definicji klas i implementacji klas. Czy są jakieś zalety metody Java w porównaniu z metodą C ++?
java
programming-languages
c++
Etienne Noël
źródło
źródło
private
tak, aby implementacja znała rozmiar, a elementprivate
członkowski również działa.Odpowiedzi:
Ile wierszy kodu znajduje się w następującym programie?
Prawdopodobnie odpowiedziałeś 7 (lub 6, jeśli nie policzyłeś pustej linii lub 4, jeśli nie policzyłeś nawiasów klamrowych).
Twój kompilator widzi jednak coś zupełnie innego:
Tak, to 18,7 KLOC tylko dla „Cześć, świecie!” program. Kompilator C ++ musi to wszystko przeanalizować . Jest to główny powód, dla którego kompilacja C ++ trwa tak długo w porównaniu z innymi językami i dlaczego współczesne języki unikają plików nagłówkowych.
Lepszym pytaniem byłoby
Dlaczego nie C ++ mają nagłówka pliki?
C ++ został zaprojektowany jako nadzbiór C, więc musiał zachować pliki nagłówkowe w celu zachowania kompatybilności wstecznej.
OK, więc dlaczego C ma pliki nagłówkowe?
Ze względu na jego pierwotny, osobny model kompilacji. Pliki obiektowe generowane przez kompilatory C nie zawierają żadnych informacji o typie, dlatego aby uniknąć błędów typu, należy uwzględnić te informacje w kodzie źródłowym.
Dodanie odpowiedniego typu deklaracji naprawia błąd:
Zauważ, że nie ma żadnych
#include
. Ale gdy używasz dużej liczby funkcji zewnętrznych (co zrobi większość programów), ręczne ich deklarowanie staje się uciążliwe i podatne na błędy. Pliki nagłówkowe są znacznie łatwiejsze.W jaki sposób nowoczesne języki są w stanie uniknąć plików nagłówkowych?
Przy użyciu innego formatu pliku obiektowego, który zawiera informacje o typie. Na przykład format pliku Java * .class obejmuje „deskryptory”, które określają typy pól i parametry metody.
To nie był nowy wynalazek. Wcześniej (1987), kiedy Borland dodał osobno skompilowane „jednostki” do Turbo Pascal 4.0, zdecydował się użyć nowego
*.TPU
formatu zamiast Turbo C*.OBJ
, aby wyeliminować potrzebę plików nagłówkowych.źródło
OBJ
pliki, a nieTPU
s ...Java ma interfejsy do definiowania umowy. Daje to wyższy poziom abstrakcji od potrzeb dzwoniącego i faktycznej implementacji. tzn. osoba dzwoniąca nie musi znać klasy implementującej, musi jedynie znać obsługiwaną umowę.
Powiedz, że chcesz napisać metodę, która spowalnia wszystkie klucze / wartości na mapie.
Ta metoda może wywoływać metodę entrySet () na abstrakcyjnym interfejsie, który jest usuwany z klasy implementującej ją. Możesz wywołać tę metodę za pomocą.
źródło
#define interface class
.virtual
słowa kluczowego, aby uzyskać polimorfizm, a to nie ma negatywnego wpływu na wydajność, jeśli używasz tylko jednego lub dwóch konkretnych typów, tak jak w Javie. Czy możesz wskazać mi jakąkolwiek dokumentację dotyczącą tego, jak to działa w C ++?Nagłówki istnieją, szczerze mówiąc, jako historyczny wypadek. To niesamowicie słaby system, żaden inny język nie ma nic tak okropnego, a każdy, kto nie musi się z nimi obchodzić, powinien się cieszyć.
źródło
Nagłówki umożliwiają oddzielną kompilację. # Włączając nagłówki, kompilator nie musi nic wiedzieć o strukturze binarnej skompilowanego kodu C ++ i może pozostawić to zadanie osobnemu linkerowi. Java nie używa osobnego linkera ze swoim kompilatorem, a ponieważ pliki .class są ściśle zdefiniowane, kompilator jest w stanie je odczytać, aby określić wszystkich swoich członków ze wszystkimi typami, bez potrzeby ponownego deklarowania ich w każdej jednostce kompilacji.
Możesz dołączyć całą implementację do nagłówka C ++, ale powoduje to, że kompilator rekompiluje ją za każdym razem, gdy jest # włączany, zmuszając linker do uporządkowania i odrzucenia duplikatów.
źródło
Java promuje rozdzielenie definicji klasy i implementacji, zależy to tylko od tego, od czego szukasz.
Gdy jesteś autorem klasy Java, zobaczysz definicję klasy oraz jej implementację w jednym pliku. Upraszcza to proces programowania, ponieważ musisz tylko udać się w jedno miejsce, aby utrzymać klasę, nie musisz przełączać się między dwoma plikami (.h i .cpp, jak w C ++). Jednak jeśli jesteś konsumentem klasy, zajmujesz się tylko definicją za pomocą pliku .class, który jest albo spakowany w pliku .jar, albo jako samodzielny plik .class
C ++ pozwala rozdzielić definicję i implementację, ale jest to ad-hoc. Na przykład nic nie stoi na przeszkodzie, abyś napisał metodę bezpośrednio w pliku nagłówkowym, a dla klas szablonów jest to obowiązkowe. Plik nagłówka zawiera również listę wszystkich zmiennych składowych, które są widoczne dla każdego, kto patrzy na plik nagłówka, mimo że są one szczegółami implementacji klasy i nie mają znaczenia dla konsumenta.
źródło