Kiedy badałem zalety C w stosunku do C ++, natknąłem się na ten akapit:
Standardowym sposobem w C do enkapsulacji jest przekazanie do przodu deklaracji struktury i zezwalanie na dostęp do jej danych tylko poprzez funkcje. Ta metoda tworzy także enkapsulację czasu kompilacji. Hermetyzacja czasu kompilacji pozwala nam zmieniać elementy struktur danych bez ponownej kompilacji kodu klienta (inny kod korzystający z naszego interfejsu). Z drugiej strony standardowy sposób wykonywania enkapsulacji C ++ (przy użyciu klas) wymaga ponownej kompilacji kodu klienta podczas dodawania lub usuwania zmiennych prywatnych członków.
Rozumiem, w jaki sposób deklarowanie struktury i uzyskiwanie dostępu do jej członków za pomocą funkcji ukrywa szczegóły implementacji struktury. Nie rozumiem tylko tej linii:
Hermetyzacja czasu kompilacji pozwala nam zmieniać elementy struktur danych bez ponownej kompilacji kodu klienta (inny kod korzystający z naszego interfejsu).
W jakim scenariuszu ma to zastosowanie?
struct
jest to czarna skrzynka z nieznanymi elementami wewnętrznymi. Jeśli klient nie zna elementów wewnętrznych, nigdy nie może uzyskać do nich bezpośredniego dostępu i można je dowolnie zmieniać. Jest to podobne do enkapsulacji w OOP. Elementy wewnętrzne są prywatne, a obiekt zmienia się tylko przy użyciu metod publicznych.Odpowiedzi:
Możliwym scenariuszem, w którym miałoby to miejsce, jest sytuacja, w której biblioteka bazy danych, napisana w czasach, gdy miejsce na dysku twardym było bardzo ograniczone, wykorzystywała jeden bajt do przechowywania pola „roku” daty (np. 11-NOV-1973 musiałby
73
za rok). Ale kiedy nadszedł rok 2000, nie byłoby to już wystarczające, a rok musiał być zapisany jako krótka (16-bitowa) liczba całkowita. Odpowiednim (znacznie uproszczonym) nagłówkiem dla tej biblioteki może być:Program „kliencki” to:
„Oryginalna” implementacja:
Następnie, przy podejściu Y2K, ten plik implementacji zostałby zmieniony w następujący sposób (wszystko inne pozostało nietknięte):
Gdy klient musi zostać zaktualizowany w celu korzystania z nowej (bezpiecznej dla Y2K) wersji, zmiany kodu nie będą wymagane. W rzeczywistości, może nawet nie trzeba ponownie skompilować: po prostu re-łączenie do zaktualizowanej biblioteki obiektów (jeśli to, co to jest) może być wystarczająca.
źródło
Uwaga: Poniższa lista nie będzie wyczerpująca. Zmiany są mile widziane!
Obowiązujące scenariusze obejmują:
Najbardziej znaną tego typu strukturą
FILE
. Wystarczy zadzwonićfopen()
i uzyskać wskaźnik, jeśli się powiedzie. Ten wskaźnik jest następnie przekazywany do każdej innej funkcji, która działa na plikach. Ale nie znasz - i nie chcesz wiedzieć - szczegółów, takich jak zawarte elementy i rozmiar.źródło