Menu
Coddy logo textTech

Elementy publiczne a prywatne

Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 30 z 110.

Enkapsulacja to jedna z podstawowych zasad programowania obiektowego. Polega na kontrolowaniu dostępu do wewnętrznych danych klasy oraz decydowaniu o tym, co powinno być widoczne dla świata zewnętrznego, a co powinno pozostać ukryte.

W Dart elementy klasy (pola i metody) są domyślnie publiczne. Oznacza to, że każdy kod może uzyskać do nich bezpośredni dostęp:

class BankAccount {
  String owner;
  double balance;
  
  BankAccount(this.owner, this.balance);
}

var account = BankAccount('Alice', 1000);
account.balance = -500;  // Każdy może to bezpośrednio zmienić!

To problematyczne. Nic nie zapobiega ustawieniu nieprawidłowego salda.

Aby chronić dane wewnętrzne, Dart używa prywatnych składowych. Składowa staje się prywatna, gdy jej nazwa zaczyna się od podkreślenia _:

class BankAccount {
  String owner;
  double _balance;  // Prywatne – zaczyna się od podkreślenia
  
  BankAccount(this.owner, this._balance);
  
  double get balance => _balance;  // Kontrolowany dostęp
}

Teraz nie można uzyskać bezpośredniego dostępu do _balance spoza biblioteki, w której zdefiniowano klasę. Kod zewnętrzny musi zamiast tego używać publicznego gettera. Dzięki temu możesz kontrolować sposób odczytywania i modyfikowania danych, zapewniając, że Twoje obiekty zawsze pozostaną w prawidłowym stanie.

challenge icon

Wyzwanie

Łatwy

Zbudujmy prosty menedżer haseł, który pokazuje różnicę między składowymi publicznymi a prywatnymi. Zobaczysz, jak prefiks podkreślenia chroni poufne dane przed bezpośrednim dostępem spoza biblioteki klasy.

Utworzysz dwa pliki, aby uporządkować kod:

  • credential.dart: Zdefiniuj klasę Credential, która przechowuje dane logowania do strony internetowej. Klasa powinna zawierać:
    • Publiczne String website — każdy może wiedzieć, której strony to dotyczy
    • Publiczne String username — nazwa użytkownika może być widoczna
    • Prywatne String _password — rzeczywiste hasło musi być chronione
    • Konstruktor, który przyjmuje wszystkie trzy wartości
    • Publiczny getter password, który zwraca prywatne _password (kontrolowany dostęp)
    • Metodę getMaskedPassword(), która zwraca hasło z wszystkimi znakami zastąpionymi gwiazdkami * (o tej samej długości co rzeczywiste hasło)
    • Metodę displayCredential(), która bezpiecznie wyświetla dane logowania (pokazując zamaskowane hasło, a nie rzeczywiste)
  • main.dart: Zaimportuj klasę danych logowania i pokaż, jak enkapsulacja chroni hasło:
    • Utwórz dane logowania do strony 'github.com', z nazwą użytkownika 'dev_user' i hasłem 'secret123'
    • Utwórz kolejne dane logowania do strony 'email.com', z nazwą użytkownika 'john_doe' i hasłem 'myP@ss'
    • Dla każdych danych logowania wywołaj displayCredential(), a następnie wyświetl Actual password length: [length], używając publicznego gettera do uzyskania długości hasła

Metoda displayCredential() powinna wyświetlać dane w tym formacie:

--- Credential ---
Website: [website]
Username: [username]
Password: [maskedPassword]

Oczekiwany wynik:

--- Credential ---
Website: github.com
Username: dev_user
Password: *********
Actual password length: 9
--- Credential ---
Website: email.com
Username: john_doe
Password: ******
Actual password length: 6

Spróbuj swoich sił

import 'credential.dart';

void main() {
  // TODO: Utwórz dane logowania dla github.com
  // website: 'github.com', username: 'dev_user', password: 'secret123'
  
  // TODO: Wywołaj displayCredential() dla pierwszych danych logowania
  
  // TODO: Wypisz rzeczywistą długość hasła, używając publicznego gettera
  // Format: "Actual password length: [length]"
  
  // TODO: Utwórz dane logowania dla email.com
  // website: 'email.com', username: 'john_doe', password: 'myP@ss'
  
  // TODO: Wywołaj displayCredential() dla drugich danych logowania
  
  // TODO: Wypisz rzeczywistą długość hasła, używając publicznego gettera
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Dart online