Menu
Coddy logo textTech

Kütüphane Düzeyinde Gizlilik

Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 32 / 110.

Dart'ta gizlilik, sınıf düzeyinde değil, kitaplık düzeyinde uygulanır. Bu, Java veya C++ gibi dillerden önemli bir farktır. Dart'ta bir kitaplık genellikle tek bir dosyadır veya part yönergeleriyle bağlanan birden fazla dosyadır.

Gizli üyeler (_ ile başlayanlar), aynı kütüphane içindeki her yerden, hatta diğer sınıflardan bile erişilebilirdir:

// Her iki sınıf da aynı dosyada (aynı kütüphane)
class Engine {
  int _horsepower = 200;  // Bu kütüphaneye özel
}

class Car {
  void showPower(Engine engine) {
    print(engine._horsepower);  // Erişilebilir! Aynı kütüphane
  }
}

Ancak, bir sınıfı farklı bir dosyadan içe aktardığınızda, özel (private) üyeleri gerçekten gizli hale gelir:

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

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

void main() {
  var engine = Engine();
  // print(engine._horsepower);  // Hata! Erişilemez
  print(engine.power);           // Çalışır - genel (public) getter kullanılıyor
}

Bu kütüphane düzeyindeki gizlilik, aynı dosyadaki sınıfların uygulama detaylarını harici koddan gizlerken birbirleriyle yakından iş birliği yapabileceği anlamına gelir. Bu, ilgili sınıfların aynı kütüphane içinde bir arada düzenlenmesini teşvik eden bilinçli bir tasarım tercihidir.

challenge icon

Görev

Kolay

Dart'da kütüphane düzeyindeki gizliliğin (library-level privacy) nasıl çalıştığını gösteren bir ekip işbirliği sistemi kuralım. Aynı dosyadaki sınıfların birbirlerinin özel (private) üyelerine nasıl erişebildiğini, ancak ayrı dosyalardaki kodların buna erişemediğini göreceksiniz.

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • team.dart: Bu dosya, aynı kütüphane içinde birlikte çalışan iki sınıf içerecektir:
    • Genel (public) bir String name ve 50 değerine ayarlanmış özel (private) bir int _performanceScore içeren bir Member sınıfı. İsmi alan bir yapıcı (constructor) ve özel puanı döndüren genel bir alıcı (getter) olan performanceScore ekleyin.
    • Aynı dosyada bulunan ve Member sınıfının özel alanına doğrudan erişebilen (çünkü aynı kütüphanededirler) bir TeamLead sınıfı. Bu sınıfın genel bir String name değişkeni, ismi alan bir yapıcısı ve member._performanceScore alanına doğrudan erişen, ona 10 ekleyen ve [leadName] boosted [memberName]'s score to [newScore] yazdıran bir evaluateMember(Member member) metodu olmalıdır.
  • main.dart: Ekip dosyanızı içe aktarın (import) ve erişim farkını gösterin:
    • 'Alice' adında bir Member oluşturun
    • 'Bob' adında bir TeamLead oluşturun
    • Alice üzerindeki genel alıcıyı kullanarak Initial score: [score] yazdırın
    • Bob'un evaluateMember kullanarak Alice'i değerlendirmesini sağlayın
    • Genel alıcıyı kullanarak Updated score: [score] yazdırın
    • Direct access from main: Not allowed yazdırın (bu bize main.dart dosyasının farklı bir kütüphanede olduğu için _performanceScore alanına doğrudan erişemeyeceğini hatırlatır)

Buradaki temel nokta, TeamLead sınıfının Member sınıfının özel _performanceScore alanını doğrudan okuyabilmesi ve değiştirebilmesidir; çünkü her iki sınıf da aynı dosyada (aynı kütüphanede) bulunur. Ancak, main.dart içindeki kod, farklı bir kütüphanede olduğu için genel alıcıyı (getter) kullanmak zorundadır.

Beklenen çıktı:

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

Kopya kağıdı

Dart'ta gizlilik, sınıf düzeyinde değil, kütüphane düzeyinde uygulanır. Bir kütüphane genellikle tek bir dosyadır veya part direktifleriyle bağlanan birden fazla dosyadır.

Gizli üyeler bir alt çizgi (_) ile başlar ve aynı kütüphane içindeki her yerden, hatta diğer sınıflardan bile erişilebilirdir:

// Her iki sınıf da aynı dosyada (aynı kütüphane)
class Engine {
  int _horsepower = 200;  // Bu kütüphaneye özel
}

class Car {
  void showPower(Engine engine) {
    print(engine._horsepower);  // Erişilebilir! Aynı kütüphane
  }
}

Bir sınıfı farklı bir dosyadan içe aktardığınızda, gizli üyeleri gizli hale gelir:

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

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

void main() {
  var engine = Engine();
  // print(engine._horsepower);  // Hata! Erişilemez
  print(engine.power);           // Çalışır - genel (public) getter kullanılıyor
}

Bu tasarım, ilgili sınıfların aynı kütüphane içinde bir arada düzenlenmesini teşvik ederek, uygulama detaylarını dış koddan gizlerken birbirleriyle yakın iş birliği yapmalarına olanak tanır.

Kendin dene

import 'team.dart';

void main() {
  // YAPILACAK: 'Alice' adında bir Member oluşturun

  // YAPILACAK: 'Bob' adında bir TeamLead oluşturun

  // YAPILACAK: Alice üzerindeki genel (public) getter'ı kullanarak "Initial score: [score]" yazdırın

  // YAPILACAK: evaluateMember kullanarak Bob'un Alice'i değerlendirmesini sağlayın

  // YAPILACAK: Genel (public) getter'ı kullanarak "Updated score: [score]" yazdırın

  // YAPILACAK: "Direct access from main: Not allowed" yazdırın
  // Not: Burada alice._performanceScore'a erişemeyiz çünkü
  // main.dart, team.dart'tan farklı bir kütüphanededir
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler