Menu
Coddy logo textTech

Prywatność na poziomie biblioteki

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

W Dart prywatność jest egzekwowana na poziomie biblioteki, a nie klasy. To kluczowa różnica w porównaniu z językami takimi jak Java czy C++. Biblioteka w Dart to zazwyczaj pojedynczy plik lub wiele plików połączonych dyrektywami part.

Prywatne składowe (te, których nazwy zaczynają się od _) są dostępne w dowolnym miejscu w tej samej bibliotece, nawet z innych klas:

// Obie klasy w tym samym pliku (tej samej bibliotece)
class Engine {
  int _horsepower = 200;  // Prywatne w obrębie tej biblioteki
}

class Car {
  void showPower(Engine engine) {
    print(engine._horsepower);  // Dostępne! Ta sama biblioteka
  }
}

Jednak gdy zaimportujesz klasę z innego pliku, jej prywatne składowe stają się naprawdę ukryte:

// plik: engine.dart
class Engine {
  int _horsepower = 200;
  int get power => _horsepower;
}

// plik: main.dart
import 'engine.dart';

void main() {
  var engine = Engine();
  // print(engine._horsepower);  // Błąd! Brak dostępu
  print(engine.power);           // Działa — używa publicznego gettera
}

Ta prywatność na poziomie biblioteki oznacza, że klasy w tym samym pliku mogą ściśle ze sobą współpracować, a jednocześnie ukrywać szczegóły implementacji przed zewnętrznym kodem. To celowy wybór projektowy, który zachęca do organizowania powiązanych klas w tej samej bibliotece.

challenge icon

Wyzwanie

Łatwy

Zbudujmy system współpracy zespołowej, który pokazuje, jak działa prywatność na poziomie biblioteki w Dart. Zobaczysz, jak klasy w tym samym pliku mogą uzyskiwać dostęp do swoich prywatnych składowych, podczas gdy kod w osobnych plikach nie może.

Podzielisz kod na dwa pliki:

  • team.dart: Ten plik będzie zawierał dwie ściśle współpracujące ze sobą klasy w tej samej bibliotece:
    • Klasa Member z publicznym String name i prywatnym int _performanceScore zainicjowanym wartością 50. Dodaj konstruktor przyjmujący imię oraz publiczny getter performanceScore, który zwraca prywatny wynik.
    • Klasa TeamLead w tym samym pliku, która może bezpośrednio uzyskiwać dostęp do prywatnego pola klasy Member (ponieważ znajdują się w tej samej bibliotece). Ta klasa powinna mieć publiczne String name, konstruktor przyjmujący imię oraz metodę evaluateMember(Member member), która bezpośrednio uzyskuje dostęp do member._performanceScore, dodaje do niego 10 i wyświetla [leadName] boosted [memberName]'s score to [newScore].
  • main.dart: Zaimportuj plik zespołu i pokaż różnicę w dostępie:
    • Utwórz obiekt Member o imieniu 'Alice'
    • Utwórz obiekt TeamLead o imieniu 'Bob'
    • Wyświetl Initial score: [score], używając publicznego gettera obiektu Alice
    • Poleć Bobowi ocenić Alice za pomocą evaluateMember
    • Wyświetl Updated score: [score], używając publicznego gettera
    • Wyświetl Direct access from main: Not allowed (przypomina nam to, że main.dart nie może bezpośrednio uzyskać dostępu do _performanceScore, ponieważ znajduje się w innej bibliotece)

Najważniejsza kwestia jest taka, że TeamLead może bezpośrednio odczytywać i modyfikować prywatne _performanceScore klasy Member, ponieważ obie klasy znajdują się w tym samym pliku (tej samej bibliotece). Natomiast kod w main.dart musi używać publicznego gettera, ponieważ znajduje się w innej bibliotece.

Oczekiwany wynik:

Initial score: 50
Bob boosted Alice's score to 60
Updated score: 60
Direct access from main: Not allowed

Spróbuj swoich sił

import 'team.dart';

void main() {
  // TODO: Utwórz obiekt Member o imieniu 'Alice'

  // TODO: Utwórz obiekt TeamLead o imieniu 'Bob'

  // TODO: Wypisz "Initial score: [score]", używając publicznego gettera obiektu Alice

  // TODO: Niech Bob oceni Alice za pomocą evaluateMember

  // TODO: Wypisz "Updated score: [score]", używając publicznego gettera

  // TODO: Wypisz "Direct access from main: Not allowed"
  // Uwaga: Nie możemy tutaj uzyskać dostępu do alice._performanceScore, ponieważ
  // main.dart znajduje się w innej bibliotece niż team.dart
}
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