Menu
Coddy logo textTech

Statik Metotlar ve Alanlar

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

Artık örnek (instance) ve statik üyeler arasındaki farkı anladığınıza göre, statik metotları ve alanları nasıl etkili bir şekilde kullanacağımızı keşfedelim. Statik üyeler, bireysel nesnelerden ziyade sınıf kavramının kendisine ait olan işlevsellikler için mükemmeldir.

Statik alanlar, tüm örnekler arasında paylaşılan verileri depolar. Yaygın kullanım alanları arasında sayaçlar, yapılandırma değerleri veya önbelleğe alınmış veriler bulunur:

class MathHelper {
  static const double pi = 3.14159;
  static int calculationCount = 0;
  
  static double circleArea(double radius) {
    calculationCount++;
    return pi * radius * radius;
  }
}

print(MathHelper.circleArea(5));  // 78.53975
print(MathHelper.circleArea(3));  // 28.27431
print(MathHelper.calculationCount);  // 2

Statik metotları bir örnek (instance) üzerinden değil, doğrudan sınıf adı üzerinden çağırdığınıza dikkat edin. MathHelper sınıfı bir yardımcı (utility) gibi çalışır - hiçbir zaman bir MathHelper nesnesi oluşturmanıza gerek kalmaz.

Önemli bir kural: statik metotlar örnek üyelerine doğrudan erişemezler. this anahtar kelimesine erişimleri yoktur çünkü herhangi bir belirli nesneye bağlı değillerdir:

class Counter {
  int value = 0;  // Örnek alanı
  static int total = 0;  // Statik alan
  
  void increment() {
    value++;  // Tamam - örnek metodu örnek alanına erişiyor
    total++;  // Tamam - örnek metodu statik alana erişebilir
  }
  
  static void reset() {
    total = 0;  // Tamam - statik metot statik alana erişiyor
    // value = 0;  // Hata! Örnek alanına erişilemez
  }
}

İşlevsellik nesne durumuna bağlı olmadığında statik üyeleri kullanın - yardımcı fonksiyonlar (utility functions), fabrika takibi (factory tracking) veya paylaşılan sabitler (shared constants) ideal adaylardır.

challenge icon

Görev

Kolay

Nesne oluşturmaya gerek kalmadan yardımcı işlevler sağlamak için statik metotların ve alanların nasıl birlikte çalıştığını gösteren, dize işlemleri için bir yardımcı (utility) sınıfı oluşturalım.

Kodunuzu düzenlemek için iki dosya oluşturacaksınız:

  • string_utils.dart: Yardımcı bir araç görevi gören bir StringUtils sınıfı tanımlayın. Sınıfınız şunlara sahip olmalıdır:
    • '-' değerine ayarlanmış bir static const String defaultSeparator
    • Kaç işlemin gerçekleştirildiğini takip etmek için 0'dan başlayan bir static int operationCount
    • operationCount değerini artıran ve ters çevrilmiş dizeyi döndüren statik bir metot reverse(String text)
    • operationCount değerini artıran ve iki dizeyi defaultSeparator ile birleştirerek döndüren statik bir metot join(String first, String second)
    • operationCount değerini artıran ve ünlü harflerin (a, e, i, o, u - büyük/küçük harf duyarsız) sayısını döndüren statik bir metot countVowels(String text)
    • Gerçekleştirilen toplam işlem sayısını gösteren bir dize döndüren statik bir metot getStats()
  • main.dart: Yardımcı sınıfınızı içe aktarın ve statik metotlarını kullanın:
    • 'hello' ile reverse() metodunu çağırın ve sonucu yazdırın
    • 'dart' ve 'lang' ile join() metodunu çağırın ve sonucu yazdırın
    • 'Programming' ile countVowels() metodunu çağırın ve Vowels: [count] şeklinde yazdırın
    • getStats() kullanarak istatistikleri yazdırın

Metotlar statik olduğu için hepsini doğrudan sınıf adı üzerinden çağırmayı unutmayın; herhangi bir StringUtils nesnesi oluşturmayacaksınız.

getStats() metodu şu formatta çıktı vermelidir:

Operations performed: [operationCount]

Beklenen çıktı:

olleh
dart-lang
Vowels: 3
Operations performed: 3

Kopya kağıdı

Statik üyeler, bireysel örneklerden ziyade sınıfın kendisine aittir. Onlara bir nesne üzerinden değil, sınıf adını kullanarak erişin.

Statik alanlar, tüm örnekler arasında paylaşılan verileri depolar:

class MathHelper {
  static const double pi = 3.14159;
  static int calculationCount = 0;
  
  static double circleArea(double radius) {
    calculationCount++;
    return pi * radius * radius;
  }
}

print(MathHelper.circleArea(5));  // 78.53975
print(MathHelper.calculationCount);  // 1

Erişim kuralları:

  • Örnek (instance) metotları hem örnek hem de statik üyelere erişebilir
  • Statik metotlar yalnızca statik üyelere erişebilir (this anahtar kelimesine erişim yoktur)
class Counter {
  int value = 0;  // Örnek alanı
  static int total = 0;  // Statik alan
  
  void increment() {
    value++;  // Tamam - örnek metodu örnek alanına erişiyor
    total++;  // Tamam - örnek metodu statik alana erişebilir
  }
  
  static void reset() {
    total = 0;  // Tamam - statik metot statik alana erişiyor
    // value = 0;  // Hata! Örnek alanına erişilemez
  }
}

Yardımcı fonksiyonlar, paylaşılan sabitler, sayaçlar veya nesne durumuna bağlı olmayan işlevler için statik üyeleri kullanın.

Kendin dene

import 'string_utils.dart';

void main() {
  // TODO: 'hello' ile reverse() fonksiyonunu çağırın ve sonucu yazdırın
  
  // TODO: 'dart' ve 'lang' ile join() fonksiyonunu çağırın ve sonucu yazdırın
  
  // TODO: 'Programming' ile countVowels() fonksiyonunu çağırın ve "Vowels: [count]" yazdırın
  
  // TODO: getStats() kullanarak istatistikleri 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