Fonksiyonları Argüman Olarak Aktarma
Coddy'nin Dart Journey'sinin Mantık & Akış bölümünün bir parçası — ders 45 / 65.
Programlamada, fonksiyonlar sayılar veya dizeler gibi sadece basit değerleri kabul etmekten daha fazlasını yapabilirler; aynı zamanda diğer fonksiyonları parametre olarak da kabul edebilirler. Bu güçlü kavram "higher-order function" (yüksek mertebeden fonksiyon) olarak adlandırılır ve esnek, yeniden kullanılabilir kod yazmak için tamamen yeni yollar açar.
Bir fonksiyonu argüman olarak geçirdiğinizde, aslında başka bir fonksiyona hangi işlemin gerçekleştirileceğine karar verme yeteneği vermiş olursunuz. Bunu, birine bir araç verip onu farklı malzemeler üzerinde nasıl kullanacağını seçmesine izin vermek gibi düşünün.
void processNumbers(List<int> numbers, Function operation) {
for (int number in numbers) {
operation(number);
}
}Bu örnekte, processNumbers parametre olarak bir liste ve bir fonksiyon alır. operation fonksiyon parametresi, bir tam sayı kabul eden herhangi bir fonksiyon olabilir. Bu, sayıları yazdıran, onları ikiye katlayan veya ihtiyacınız olan başka herhangi bir işlemi gerçekleştiren bir fonksiyon geçirebileceğiniz anlamına gelir.
Bu yaklaşım kodunuzu inanılmaz derecede esnek hale getirir; her olası işlem için ayrı fonksiyonlar yazmak yerine, işlemleri parametre olarak kabul ederek birçok farklı işlemle çalışabilen tek bir fonksiyon yazarsınız.
Görev
KolayEsnek bir sayı işlemcisi oluşturarak fonksiyonların argüman olarak aktarılmasını gösteren bir program oluşturun. Programınız farklı işlem fonksiyonları oluşturacak ve bunları, bir sayı listesine işlemi uygulayan ana bir işlemci fonksiyonuna aktaracaktır.
- Virgülle ayrılmış sayılar içeren bir dize girişi okuyun (örneğin,
"1,2,3,4,5") - İşlem türünü temsil eden bir dize girişi okuyun (
"double","square"veya"increment") - İlk girişi bir dize listesine bölün ve her birini bir tam sayıya (integer) dönüştürün
- Üç ayrı fonksiyon oluşturun:
doubleNumber- bir tam sayı alır ve onu 2 ile çarpılmış halini döndürürsquareNumber- bir tam sayı alır ve onu kendisiyle çarpılmış halini döndürürincrementNumber- bir tam sayı alır ve onu 1 fazlasını döndürür- Parametre olarak bir tam sayı listesi ve bir fonksiyon alan
processNumbersadında bir ana fonksiyon oluşturun processNumbersfonksiyonu, verilen fonksiyonu listedeki her sayıya uygulamalı ve sonuçları içeren yeni bir liste döndürmelidir- İşlem türü girişine bağlı olarak, uygun fonksiyonu
processNumbersfonksiyonuna aktarın - Sonuçları tam olarak aşağıda gösterilen formatta görüntüleyin
Örneğin, girişler "2,4,6,8" ve "double" ise, programınızın çıktısı şöyle olmalıdır:
Number Processor
================
Original numbers: [2, 4, 6, 8]
Operation: double
Processing numbers...
Result: [4, 8, 12, 16]
Operation completed successfullyGirişler "3,5,7" ve "square" ise, programınızın çıktısı şöyle olmalıdır:
Number Processor
================
Original numbers: [3, 5, 7]
Operation: square
Processing numbers...
Result: [9, 25, 49]
Operation completed successfullyGirişler "10,20,30" ve "increment" ise, programınızın çıktısı şöyle olmalıdır:
Number Processor
================
Original numbers: [10, 20, 30]
Operation: increment
Processing numbers...
Result: [11, 21, 31]
Operation completed successfullyProgramınız, üç işlem fonksiyonundan birini processNumbers fonksiyonuna argüman olarak aktararak yüksek mertebeden fonksiyon (higher-order function) kavramını göstermelidir. İşlem türü girişine göre hangi fonksiyonun aktarılacağını belirlemek için koşullu ifadeler kullanın. processNumbers fonksiyonu giriş listesi üzerinde dönmeli, verilen fonksiyonu her öğeye uygulamalı ve sonuçları yeni bir listede toplamalıdır.
Kopya kağıdı
Yüksek seviyeli fonksiyonlar (higher-order functions), diğer fonksiyonları parametre olarak kabul edebilen, esnek ve yeniden kullanılabilir kod yazılmasını sağlayan fonksiyonlardır.
Bir fonksiyonu argüman olarak geçirmek için, Function türünde bir parametre tanımlayın:
void processNumbers(List<int> numbers, Function operation) {
for (int number in numbers) {
operation(number);
}
}Bu, aynı veriler üzerinde çeşitli işlemler gerçekleştirmek için farklı fonksiyonlar geçirmenize olanak tanıyarak kodunuzu daha modüler hale getirir ve her olası işlem için ayrı fonksiyonlar yazma ihtiyacını ortadan kaldırır.
Kendin dene
import 'dart:io';
void main() {
// Girişi oku
String? numbersInput = stdin.readLineSync();
String? operation = stdin.readLineSync();
// Dize girişini tam sayı listesine dönüştür
List<int> numbers = numbersInput!.split(',').map((e) => int.parse(e.trim())).toList();
// TODO: Üç işlem fonksiyonunu oluştur (doubleNumber, squareNumber, incrementNumber)
// TODO: Parametre olarak bir liste ve bir fonksiyon alan processNumbers fonksiyonunu oluştur
// TODO: İşlem türüne göre hangi fonksiyonun iletileceğini belirlemek için koşullu ifadeler kullan
// TODO: Uygun fonksiyonla processNumbers'ı çağır ve sonucu sakla
// Sonuçları istenen formatta yazdır
print('Number Processor');
print('================');
print('Original numbers: $numbers');
print('Operation: $operation');
print('Processing numbers...');
// TODO: Sonuç listesini burada yazdır
print('Operation completed successfully');
}Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Mantık & Akış bölümündeki tüm dersler
1İleri Düzey Liste İşlemleri
Liste Özellikleri: first & lastListe Durumu: isEmpty & isNotEmptyBir Listeyi Tersine ÇevirmeListeye Ekleme: insertListeden Silme: removeWhereListede Bulma: indexOfBir Listeyi SıralamaBir Listeyi KarıştırmaÖzet - Liste Düzenleyici4İleri Seviye Map İşlemleri
Map Üzerinde GezinmeAnahtar ve Değer KontrolüMap Özellikleri: keys & valuesKoşullu Ekleme: putIfAbsentMap'ten Öge Kaldırmaİç İçe Map'lerÖzet - Envanter Güncelleme7İleri Seviye Fonksiyonlar
Anonim FonksiyonlarFonksiyonları Argüman Olarak AktarmaClosure'ları AnlamakÖzyinelemeye GirişÖzyinelemeli Fonksiyon: Geri SayımÖzyinelemeli Fonksiyon: FaktöriyelÖzet - Liste İşleyici10Son Meydan Okumalar
Meydan Okuma: Not SıralayıcıMeydan Okuma: Sesli Harf SayacıMeydan Okuma: FizzBuzz2Fonksiyonel Liste İşlemleri
'map' ile Dönüştürme'where' ile Filtreleme'.toList()' Kullanımı'any' ile Koşul Kontrolü'every' ile Koşullar'firstWhere' ile BulmaÖzet - Veri Filtreleme5Proje: Alışveriş Sepeti Hesaplayıcı
Proje KurulumuSepete Ürün Ekleme3Kümeler
Küme Nedir?Küme OluşturmaKümelere Eleman Ekleme ve ÇıkarmaKüme İçinde Eleman KontrolüListeyi Kümeye DönüştürmeKüme BirleşimiKüme KesişimiKüme FarkıÖzet - Benzersiz Davetli Listesi