Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

Esnek 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.

  1. Virgülle ayrılmış sayılar içeren bir dize girişi okuyun (örneğin, "1,2,3,4,5")
  2. İşlem türünü temsil eden bir dize girişi okuyun ("double", "square" veya "increment")
  3. İlk girişi bir dize listesine bölün ve her birini bir tam sayıya (integer) dönüştürün
  4. Üç ayrı fonksiyon oluşturun:
    • doubleNumber - bir tam sayı alır ve onu 2 ile çarpılmış halini döndürür
    • squareNumber - bir tam sayı alır ve onu kendisiyle çarpılmış halini döndürür
    • incrementNumber - bir tam sayı alır ve onu 1 fazlasını döndürür
  5. Parametre olarak bir tam sayı listesi ve bir fonksiyon alan processNumbers adında bir ana fonksiyon oluşturun
  6. processNumbers fonksiyonu, verilen fonksiyonu listedeki her sayıya uygulamalı ve sonuçları içeren yeni bir liste döndürmelidir
  7. İşlem türü girişine bağlı olarak, uygun fonksiyonu processNumbers fonksiyonuna aktarın
  8. 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 successfully

Giriş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 successfully

Giriş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 successfully

Programı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');
}
quiz iconKendini test et

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