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); // 2Statik 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.
Görev
KolayNesne 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 birStringUtilssınıfı tanımlayın. Sınıfınız şunlara sahip olmalıdır:'-'değerine ayarlanmış birstatic const String defaultSeparator- Kaç işlemin gerçekleştirildiğini takip etmek için
0'dan başlayan birstatic int operationCount operationCountdeğerini artıran ve ters çevrilmiş dizeyi döndüren statik bir metotreverse(String text)operationCountdeğerini artıran ve iki dizeyidefaultSeparatorile birleştirerek döndüren statik bir metotjoin(String first, String second)operationCountdeğ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 metotcountVowels(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'ilereverse()metodunu çağırın ve sonucu yazdırın'dart've'lang'ilejoin()metodunu çağırın ve sonucu yazdırın'Programming'ilecountVowels()metodunu çağırın veVowels: [count]şeklinde yazdırıngetStats()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: 3Kopya 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); // 1Erişim kuralları:
- Örnek (instance) metotları hem örnek hem de statik üyelere erişebilir
- Statik metotlar yalnızca statik üyelere erişebilir (
thisanahtar 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
}
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
1OOP Temelleri
Harici DosyalarKütüphaneler ve ImportlarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarÖrnek DeğişkenleriConstructor TemelleriÖzet - Basit Hesap Makinesi4Null Safety
Null Safety'ye GirişNullable ve Non-Nullable? ve ! OperatörleriLate Anahtar Kelimesi ve Null SafetyNull-Aware OperatörleriSınıflarda Null SafetyÖzet - Kullanıcı Profili Sistemi7Soyut Sınıflar ve Arayüzler
Soyut SınıflarSoyut MetotlarDart'ta ArayüzlerÖrtük ArayüzlerUygulama vs. GenişletmeÇoklu ArayüzlerÖzet - Şekil Hesaplayıcı10Koleksiyonlar ve Generic'ler
List, Set, Map Genel BakışTip Güvenli KoleksiyonlarGeneric SınıflarGeneric MetotlarGeneric KısıtlamalarIterable ve IteratorÖzet - Generic Depolama2Dart'ta Yapıcılar
Varsayılan Yapıcıİsimlendirilmiş Yapıcılarİlklendirme ListeleriSabit YapıcılarFabrika YapıcılarıYönlendiren YapıcılarÖzet - Şekil Oluşturucu5Kapsülleme
Public ve Private Üyeler_ Öneki KuralıKütüphane Düzeyinde GizlilikGetter ve Setter DetaylarıBilgi GizlemeÖzet - Öğrenci Kayıtları8Mixin'ler
Mixin'lere GirişMixin OluşturmaBirden Fazla Mixin KullanımıMixin'lerde on Anahtar KelimesiMixin vs KalıtımMixin vs ArayüzÖzet - Hayvan Sistemi11Özel Metotlar
toString() OverridehashCode ve == OverrideComparable Arayüzücall() MetodunoSuchMethod OverrideÖzet - Özel Koleksiyon14Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı17Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakter SistemiAraç Kiralama Servisi3Sınıf Özellikleri
Instance ve Statik ÜyelerFinal ve Const AlanlarLate DeğişkenlerStatik Metotlar ve AlanlarGetters ve SettersÖzet - Banka Hesabı Yöneticisi6Kalıtım
Temel Kalıtımsuper Anahtar KelimesiMetot Ezme@override Anotasyonufinal Sınıf Anahtar KelimesiYapıcı Metotlar ve KalıtımÖzet - Çalışan Hiyerarşisi9Çok Biçimlilik
Çok Biçimlilik TemelleriInterface'ler ile Çok BiçimlilikÇalışma Zamanı Tip Kontrolüis ve as OperatörleriCovariant Anahtar KelimesiÖzet - Ödeme İşlemcisi12Asenkron OOP
Futures ve async/awaitStream TemelleriStream Controller'larAsenkron KurucularSınıf Metotlarında Asenkron KullanımıÖzet - Data Fetcher15Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıRepository Kalıbı