Menu
Coddy logo textTech

Czym jest enkapsulacja?

W programowaniu obiektowym enkapsulacja (hermetyzacja) to trzymanie danych obiektu i metod, które na nich działają, razem w jednej jednostce, zwykle klasie, oraz ukrywanie szczegółów wewnętrznych, tak aby inny kod mógł korzystać z obiektu tylko przez jego publiczne metody.

Autor: Kevin Spektor, Współzałożyciel i CTO

Aktualizacja: 24 września 2026

Załóżmy, że aplikacja bankowa przechowuje saldo każdego konta w zwykłej zmiennej. Dowolna linia w dowolnym miejscu programu może napisać account.balance = -500 i nic jej nie zatrzyma. Gdy na produkcji pojawi się ujemne saldo, musisz przeszukać cały kod w poszukiwaniu każdego miejsca, które go dotykało. Enkapsulacja to naprawia: saldo może się zmienić tylko przez kilka metod, a te metody pilnują reguł, na przykład tego, że wypłata nigdy nie może przekroczyć salda.

Jak działa enkapsulacja

Enkapsulacja łączy dwie idee:

  1. Grupowanie. Dane (saldo) i kod, który na nich działa (wpłata, wypłata), mieszkają w tej samej klasie.
  2. Ukrywanie. Inny kod widzi tylko publiczny interfejs klasy. Dane za nim są wewnętrzne, więc mogą się zmieniać tylko w sposób, na który pozwala klasa.

Reguła, której pilnuje klasa, nazywa się niezmiennikiem: tutaj "saldo nigdy nie jest ujemne". Ponieważ każda zmiana przechodzi przez metody klasy, niezmiennik obowiązuje bez względu na to, co robi reszta programu.

70
refused: not enough money

Kod z zewnątrz może odczytać acct.balance, ale właściwość nie ma settera, więc acct.balance = 1000 rzuca AttributeError. Jeśli saldo kiedykolwiek będzie złe, do sprawdzenia są dokładnie dwie metody.

Enkapsulacja w Pythonie

Python nie ma słowa kluczowego private. Opiera się na konwencjach nazewnictwa, które zna każdy programista Pythona:

  • name: publiczne, część interfejsu.
  • _name: wewnętrzne. Nic nie przeszkadza w odczycie, ale podkreślnik na początku mówi "nie polegaj na tym".
  • __name: Python zmienia tę nazwę wewnątrz klasy (name mangling), żeby podklasa nie nadpisała jej przez przypadek.
  • @property: zamienia metodę w coś, co odczytuje się jak atrybut, dzięki czemu można później dodać sprawdzenia bez zmiany kodu, który z niej korzysta.
0
False
42

Name mangling zapobiega pomyłkom, a nie dostępowi: zmieniona nazwa nadal działa. Python ufa, że programiści uszanują podkreślnik. W praktyce większość kodu w Pythonie używa jednego podkreślnika i @property, a podwójne podkreślniki zostawia dla klas, które mają być dziedziczone. Więcej o pisaniu klas znajdziesz w dokumentacji klas w Pythonie.

Enkapsulacja w Javie, C++ i JavaScripcie

Inne języki wymuszają ukrywanie. W Javie pole private może być używane tylko wewnątrz własnej klasy:

public class BankAccount {
    private int balance;  // hidden from every other class

    public int getBalance() { return balance; }

    public void withdraw(int amount) {
        if (amount > balance) throw new IllegalArgumentException("not enough money");
        balance -= amount;
    }
}

Napisanie account.balance = 1000; w innej klasie się nie skompiluje: javac zgłasza balance has private access in BankAccount.

JęzykUkryta składowaPubliczna składowaKto wymusza
Python_name, __namenameKonwencja
Javaprivate int namepublic int nameKompilator
C++sekcja private:sekcja public:Kompilator
JavaScript#namenameSilnik JavaScriptu

C++ domyślnie czyni składowe class prywatnymi, a składowe struct publicznymi. Prywatnych pól # w JavaScripcie, dodanych w ES2022, w ogóle nie da się odczytać spoza klasy. Dokumentacja omawia każdy przypadek: modyfikatory dostępu w Javie, specyfikatory dostępu w C++ i pola prywatne w JavaScripcie.

Dlaczego enkapsulacja jest ważna

  • Reguły są w jednym miejscu. Sprawdzenie "żadnej wypłaty powyżej salda" jest zapisane raz, w withdraw, a nie przed każdą wypłatą w programie.
  • Możesz swobodnie zmieniać wnętrze. Jeśli zdecydujesz się przechowywać pieniądze w całych groszach zamiast w liczbie float, zmieni się tylko klasa. Kod, który wywołuje deposit(100), dalej działa.
  • Łatwiejsze debugowanie. Gdy wartość jest zła, podejrzanymi są nieliczne metody, które mogą ją zmieniać, a nie każda linia programu.
  • Mniej do nauki i testowania. Klasę z trzema publicznymi metodami można zrozumieć i przetestować przez te trzy metody.

Enkapsulacja działa też powyżej poziomu klas. Moduł, który udostępnia dwie funkcje, a dziesięć pomocniczych trzyma wewnętrznie, jest enkapsulowany w ten sam sposób, podobnie jak system operacyjny, który pozwala programom otwierać pliki tylko przez wywołania systemowe.

Enkapsulację często myli się z abstrakcją. Abstrakcja decyduje, co oferuje interfejs; enkapsulacja chroni dane za nim. Strona o abstrakcji zawiera pełne porównanie obu pojęć. Razem z polimorfizmem i dziedziczeniem tworzą cztery filary programowania obiektowego.

Częste błędy

  • Getter i setter dla każdego pola. setBalance, który przyjmuje dowolną liczbę, niczego nie chroni. Udostępniaj operacje, których obiekt potrzebuje (withdraw), a nie surowy dostęp do każdego pola.
  • Zwracanie wewnętrznych obiektów. Metoda, która zwraca self._items, daje wywołującemu prawdziwą listę, którą może teraz zmieniać. Zamiast tego zwróć kopię albo krotkę.
  • Traktowanie prywatności jak zabezpieczenia. Modyfikatory dostępu zapobiegają pomyłkom, a nie atakom. Kod w Javie może odczytać pola prywatne przez refleksję, a kod w Pythonie może bezpośrednio odczytać _name. Hasła i klucze wymagają prawdziwej ochrony, takiej jak haszowanie i szyfrowanie.

Co dalej

Przeczytaj teraz o abstrakcji, gdzie wyjaśniona jest różnica między obiema ideami, a potem o polimorfizmie. Kurs Python krok po kroku buduje klasy, a kurs Java pokazuje enkapsulację wymuszaną przez kompilator.

Najczęściej zadawane pytania

Czym jest enkapsulacja w prostych słowach?
Enkapsulacja oznacza, że obiekt trzyma swoje dane dla siebie i udostępnia kilka bezpiecznych sposobów korzystania z nich. Obiekt konta bankowego nie pozwala wpisać nowego salda; daje ci deposit i withdraw, które najpierw sprawdzają reguły. Nazwa pochodzi od kapsuły, czyli osłonki, która trzyma zawartość w środku.
Jakie są przykłady enkapsulacji?
Klasycznym przykładem jest klasa konta bankowego, która pozwala na zmiany tylko przez deposit i withdraw. Innym jest wbudowana w Pythona list: wywołujesz append i nigdy nie zarządzasz pamięcią, w której leżą elementy. Moduł, który udostępnia kilka funkcji, a swoje funkcje pomocnicze trzyma jako prywatne, to enkapsulacja na większą skalę.
Jakie są trzy rodzaje enkapsulacji?
Poradniki, które wymieniają trzy rodzaje, zwykle mają na myśli enkapsulację zmiennych składowych (pola prywatne), enkapsulację funkcji (prywatne metody pomocnicze) i enkapsulację klas (klasa ukryta w innej klasie albo module). To nie są formalne kategorie; to ta sama idea zastosowana do pól, metod i całych klas.
Czym jest enkapsulacja w C++ i jak się jej używa?
W C++ oznaczasz pola danych jako private i udostępniasz funkcje składowe public, które je odczytują albo zmieniają. Składowe class są domyślnie prywatne, a składowe struct domyślnie publiczne. Kompilator odrzuca każdy kod spoza klasy, który próbuje użyć prywatnej składowej.
Co oznacza enkapsulacja w sieciach komputerowych?
W sieciach enkapsulacja oznacza opakowywanie danych w nagłówki kolejnych warstw protokołów w drodze na zewnątrz: wiadomość HTTP trafia do segmentu TCP, ten do pakietu IP, a ten do ramki Ethernet. Nazwa jest taka sama jak w programowaniu, ale to inne pojęcie.
Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ