Extension Metotlar
Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 83 / 110.
Bazen, Dart'ın yerleşik String veya int türleri gibi, size ait olmayan bir sınıfa işlevsellik eklemek istersiniz. Kaynak kodlarını değiştiremezsiniz ve kalıtım, final sınıflarda yardımcı olmaz. İşte extension methods (genişletme metotları) burada devreye girer.
Uzantılar (Extensions), mevcut türleri değiştirmeden veya alt sınıflar oluşturmadan onlara yeni yöntemler eklemenize olanak tanır:
extension StringExtras on String {
String reverse() {
return split('').reversed.join('');
}
bool get isPalindrome {
var cleaned = toLowerCase().replaceAll(' ', '');
return cleaned == cleaned.split('').reversed.join('');
}
}
void main() {
print('hello'.reverse()); // olleh
print('radar'.isPalindrome); // true
}Söz dizimi extension ExtensionName on Type şeklindedir. İçerisinde, tıpkı normal bir sınıfta olduğu gibi metotlar ve getter'lar tanımlarsınız. Tanımlandıktan sonra, bu metotlar sanki yerleşikmiş gibi o türün tüm örneklerinde görünür.
Uzantılar (Extensions), kendi sınıflarınız ve genel (generic) türler de dahil olmak üzere her tür üzerinde çalışır:
extension IntExtras on int {
int squared() => this * this;
}
extension ListExtras<T> on List<T> {
T? get secondOrNull => length >= 2 ? this[1] : null;
}
void main() {
print(5.squared()); // 25
print([1, 2, 3].secondOrNull); // 2
}Bir extension içinde, this ifadesinin metodun çağrıldığı örneği referans aldığına dikkat edin. Extension'lar, kodunuzu düzenli ve okunabilir tutarken mevcut türleri geliştirmenin temiz bir yoludur.
Görev
KolayDart'ın yerleşik türlerini uzantı metotları (extension methods) kullanarak kullanışlı işlevlerle geliştirelim! String ve List türlerine yardımcı metotlar ekleyen uzantılar oluşturacak ve ardından bunları ana dosyanızda kullanacaksınız.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
extensions.dart: Mevcut türlere yeni yetenekler ekleyen iki uzantı oluşturun:Stringüzerinde şu özelliklere sahipStringUtilsadlı bir uzantı:- Dizedeki sesli harflerin (a, e, i, o, u - büyük/küçük harf duyarsız) sayısını döndüren bir
countVowels()metodu - Her kelimenin (boşluklarla ayrılmış) ilk harfini birleştirilmiş ve büyük harfe dönüştürülmüş olarak döndüren bir
initialsgetter'ı. Örneğin,"hello world"dizesi"HW"olur
- Dizedeki sesli harflerin (a, e, i, o, u - büyük/küçük harf duyarsız) sayısını döndüren bir
List<T>üzerinde şu özelliklere sahipListUtils<T>adlı bir uzantı:- Belirtilen indeksteki öğe mevcutsa onu, indeks sınırların dışındaysa
nulldöndüren birsafeGet(int index)metodu - Liste birden fazla öğeye sahipse
truedöndüren birhasMultiplegetter'ı
- Belirtilen indeksteki öğe mevcutsa onu, indeks sınırların dışındaysa
main.dart: Uzantılarınızı içe aktarın ve onları iş başında gösterin:"Object Oriented Programming"dizesini oluşturun ve sesli harf sayısını şu formatta yazdırın:Vowels: [count]- Aynı dizenin baş harflerini şu formatta yazdırın:
Initials: [initials] [10, 20, 30]tam sayılarından oluşan bir liste oluşturunsafeGet(1)sonucunu şu formatta yazdırın:Element at 1: [value]safeGet(5)sonucunu şu formatta yazdırın:Element at 5: [value]- Listenin birden fazla öğeye sahip olup olmadığını şu formatta yazdırın:
Has multiple: [true/false]
Bir uzantı içinde this ifadesinin, metodun çağrıldığı örneği (instance) temsil ettiğini unutmayın. Uzantılarınız, bu türlerin sanki bu metotlara doğuştan sahipmiş gibi hissettirmesini sağlayacaktır!
Beklenen çıktı:
Vowels: 9
Initials: OOP
Element at 1: 20
Element at 5: null
Has multiple: trueKopya kağıdı
Genişletme metotları (extension methods), mevcut türlerin kaynak kodunu değiştirmeden veya kalıtım kullanmadan onlara yeni işlevsellikler eklemenize olanak tanır.
Bir genişletme oluşturmak için kullanılan söz dizimi extension ExtensionName on Type şeklindedir:
extension StringExtras on String {
String reverse() {
return split('').reversed.join('');
}
bool get isPalindrome {
var cleaned = toLowerCase().replaceAll(' ', '');
return cleaned == cleaned.split('').reversed.join('');
}
}Tanımlandıktan sonra, genişletme metotları o türün örnekleri üzerinde sanki yerleşik metotlarmış gibi çağrılabilir:
print('hello'.reverse()); // olleh
print('radar'.isPalindrome); // trueGenişletmeler; yerleşik türler, kendi sınıflarınız ve genel (generic) türler dahil olmak üzere her tür üzerinde çalışır:
extension IntExtras on int {
int squared() => this * this;
}
extension ListExtras<T> on List<T> {
T? get secondOrNull => length >= 2 ? this[1] : null;
}
print(5.squared()); // 25
print([1, 2, 3].secondOrNull); // 2Bir genişletme içerisinde this, metodun üzerinde çağrıldığı örneği ifade eder.
Kendin dene
import 'extensions.dart';
void main() {
// String'i oluşturun
String text = "Object Oriented Programming";
// TODO: countVowels() kullanarak sesli harf sayısını yazdırın
// Format: Vowels: [count]
// TODO: initials getter'ını kullanarak baş harfleri yazdırın
// Format: Initials: [initials]
// Tam sayı listesini oluşturun
List<int> numbers = [10, 20, 30];
// TODO: safeGet(1) sonucunu yazdırın
// Format: Element at 1: [value]
// TODO: safeGet(5) sonucunu yazdırın
// Format: Element at 5: [value]
// TODO: Listenin birden fazla öğeye sahip olup olmadığını yazdırın
// Format: Has multiple: [true/false]
}
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 Depolama13İleri Düzey OOP Kavramları
Kompozisyon ve KalıtımExtension MetotlarÇağrılabilir SınıflarSealed Sınıflar (Dart 3)Records (Dart 3)Desenler ve Eşleştirme (3.0)Metot İçeren Enum'lar2Dart'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ı