Menu
Coddy logo textTech

_ Öneki Kuralı

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

Alt çizgi öneki _, Dart'ın üyeleri gizli (private) olarak işaretleme yöntemidir. private gibi anahtar kelimeler kullanan dillerin aksine Dart, görünürlüğü kontrol etmek için bu adlandırma kuralına dayanır.

Alt çizgiyi hem alanlara hem de metotlara uygulayabilirsiniz:

class Counter {
  int _count = 0;        // Gizli alan
  
  void _increment() {    // Gizli metot
    _count++;
  }
  
  void increase() {      // Genel metot
    _increment();
    print('Count: $_count');
  }
}

Alt çizgi; değişkenler, metotlar, getter'lar, setter'lar ve hatta sınıf adları gibi her türlü tanımlayıcı için çalışır. _Helper adlı bir sınıf, kendi kütüphanesine özel olacaktır.

class Person {
  String _name;          // Gizli
  int _age;              // Gizli
  
  Person(this._name, this._age);
  
  String get name => _name;           // Genel getter
  void _validateAge(int age) { }      // Gizli metot
}

Aynı sınıf içinde, özel üyelere normal bir şekilde erişirsiniz. Kısıtlama yalnızca kütüphane dışındaki kodlar için geçerlidir. Bu kural, kodu okurken hangi üyelerin yalnızca dahili kullanım için olduğunu anında netleştirir; _ ile başlayan her şey bir uygulama detayıdır.

challenge icon

Görev

Kolay

Bir oyun için, alt çizgi önekinin dahili uygulama ayrıntılarını gizli tutarken temiz bir genel arayüzü nasıl sunduğunu gösteren bir puan takipçisi oluşturalım.

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • score_tracker.dart: Uygun kapsülleme (encapsulation) ile bir oyuncunun puanını yöneten bir ScoreTracker sınıfı oluşturun. Sınıf şunlara sahip olmalıdır:
    • Genel bir String playerName - kimin oynadığını herkes görebilir
    • 0 değerine başlatılmış özel bir int _score - ham puan korunmalıdır
    • 1 değerine başlatılmış özel bir int _bonusMultiplier - bu dahili bir oyun mekaniğidir
    • Oyuncu adını alan bir yapıcı (constructor)
    • Özel _score değerini döndüren genel bir getter score
    • points * _bonusMultiplier değerini döndüren özel bir metot _applyBonus(int points)
    • Eklenen gerçek puanları hesaplamak için dahili olarak _applyBonus metodunu kullanan, _score değerini güncelleyen ve Added [calculated] points! yazdıran genel bir metot addPoints(int points)
    • _bonusMultiplier değerini 2 olarak ayarlayan ve Double bonus activated! yazdıran genel bir metot activateDoubleBonus()
    • Oyuncunun mevcut durumunu gösteren genel bir metot displayStats()
  • main.dart: Puan takipçinizi içe aktarın ve bir oyun oturumu simüle edin:
    • 'Alex' oyuncusu için bir ScoreTracker oluşturun
    • displayStats() metodunu çağırın
    • 10 puan ekleyin
    • 25 puan ekleyin
    • Çift bonusu (double bonus) etkinleştirin
    • 15 puan ekleyin (bu ikiye katlanmalıdır)
    • displayStats() metodunu çağırın
    • Genel getter'ı kullanarak Final score: [score] yazdırın

displayStats() metodu şu formatta yazdırmalıdır:

=== Player Stats ===
Player: [playerName]
Current Score: [_score]

Özel _applyBonus metodunun ve _bonusMultiplier alanının bonus hesaplamasını dahili olarak nasıl yönettiğine dikkat edin. Harici kod yalnızca genel metotları görür ve çarpan sistemi hakkında hiçbir fikri yoktur - bu, alt çizgi kuralının arkasına gizlenmiş bir uygulama detayıdır.

Beklenen çıktı:

=== Player Stats ===
Player: Alex
Current Score: 0
Added 10 points!
Added 25 points!
Double bonus activated!
Added 30 points!
=== Player Stats ===
Player: Alex
Current Score: 65
Final score: 65

Kopya kağıdı

Alt çizgi ön eki _, Dart'ta üyeleri özel (private) olarak işaretler. Bu adlandırma kuralı, private gibi anahtar kelimeler kullanmadan görünürlüğü kontrol eder.

Alt çizgiyi alanlara ve metotlara uygulayın:

class Counter {
  int _count = 0;        // Özel alan
  
  void _increment() {    // Özel metot
    _count++;
  }
  
  void increase() {      // Genel metot
    _increment();
    print('Count: $_count');
  }
}

Alt çizgi herhangi bir tanımlayıcı için çalışır - değişkenler, metotlar, getter'lar, setter'lar ve sınıf adları:

class Person {
  String _name;          // Özel
  int _age;              // Özel
  
  Person(this._name, this._age);
  
  String get name => _name;           // Genel getter
  void _validateAge(int age) { }      // Özel metot
}

Özel üyelere aynı sınıf içinden erişilebilir ancak kütüphane dışındaki kodlar için kısıtlanmıştır. _ ile başlayan her şey bir uygulama detayıdır.

Kendin dene

import 'score_tracker.dart';

void main() {
  // TODO: 'Alex' oyuncusu için bir ScoreTracker oluşturun
  
  // TODO: displayStats() fonksiyonunu çağırın
  
  // TODO: 10 puan ekleyin
  
  // TODO: 25 puan ekleyin
  
  // TODO: İki kat bonusu (double bonus) etkinleştirin
  
  // TODO: 15 puan ekleyin (bu ikiye katlanmalı)
  
  // TODO: displayStats() fonksiyonunu çağırın
  
  // TODO: Genel alıcıyı (public getter) kullanarak 'Final score: [score]' yazdırın
}
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