Fonksiyonun aldığı bir argümanı değiştirerek çıktı olarak vermek, temiz kodlama mantığına aykırıdır. Kodunuzu okuyan birisi, doğal olarak, girdilerin girdi, çıktıların ise çıktı olmasını bekler. Kodlama konusunda bir şey bilmediğinizi düşünün: Bir girdinin aynı zamanda çıktı olmasını bekler miydiniz?

Elbette herhangi bir yazılımcının kodlama bildiğini varsayıyoruz. 🙂 Dolayısıyla da herhangi bir yazılımcı aradaki farkı bulabilir; fakat bu farkı bulurken, harcamaması gereken bir mental enerjiyi bu ayrımı yapmak için kullanır.

Temiz kodlamanın temelinde yatan ilkelerden biri, kodunuzu okuyan bir kimsenin bunu çokça mental enerji kullanmadan yapabilmesini sağlamaktır. Bu nedenle de argümanlar, yani girdiler ile çıktılar arasındaki farkı en başından ortaya koymak, kodun daha temiz olmasını sağlayacaktır.

Örnek

<?php

class BookService // Kitap Servisi
{
   // updateBookTitle: Kitap başlığını güncelle
   public static function updateBookTitle(Book $book, string $title): Book
   {
      $book->title = $title;
      return $book; // Başlığı güncellenmiş kitabı döndür
   }
}

Yukarıdaki örnekte, BookService adındaki yardımcı sınıfımızın (class) tek fonksiyonunu inceleyelim. Fonksiyonumuz updateBookTitle iki adet argüman alıyor: Bir adet Book elemanı $book ve kullanmamız için bir kitap başlığı, $title.

Bu fonksiyonda temiz olmayan başka şeyler de var; fakat yazımız gereği, sadece çıktı argümanını inceleyeceğiz. Fonksiyon imzasının sonunda görüldüğü üzere (: Book), çıktı olarak bir Book elemanı veriyor. Yani, girdi olarak verdiği kitabı güncelliyor ve her ne kadar kitap aynı olsa da, yeni bir Book elemanını çıktı olarak veriyor.

Peki bu yöntem neden kötü? Gelin bir de bu fonksiyonu kullanmaya kalkışalım:

<?php

// Bir kitap elemanına sahip olduğumuzu varsayalım.
// @var Book $book

// Elimizdeki kitabın başlığını güncelleyelim.
BookService::updateBookTitle($book, 'Sineklerin Tanrısı');

// $book elemanının başlığı güncellenmedi!
// Çünkü güncellenmiş kopya çıktı olarak veriliyor.
// Bizim de bu çıktıyı kaydetmemiz gerekiyor.

// Tekrar deneyelim.
// @var book $book2
$book2 = BookService::updateBookTitle($book, 'Sineklerin Tanrısı');

// Başlığı güncellenmiş kitap, $book2 değişkenine kaydedildi.
// Alternatif yöntem:
$book = BookService::updateBookTitle($book, 'Sineklerin Tanrısı');

// Başlığı güncellenmiş kitap, $book değişkeninin üzerine yazıldı.

Yukarıdaki kullanım örneğini adım adım takip ettiğimizde görüyoruz ki, bir argümanı çıktı olarak kullanmak, bize nihayetinde yeni bir değişken yaratmamızı ya da eski değişkenin üstüne yazmamızı diretiyor. Bu da eski değişkenin ($book) varlığının bir nevi işe yaramaz hâle gelmesine sebep oluyor. Yani kodu okurken, $book elemanının son durumunu da takip etmek zorunda kalıyoruz.

Temizlik zamanı

Çıktı argümanı kullanmak yerine, direkt olarak argümanın durumunu güncelleyebiliriz. Yani, güncelleme işlemini kapsayan bir Book fonksiyonu yazabiliriz:

<?php

class Book // Kitap
{
   public function updateTitle(string $title): void
   {
      // Başlığı güncelle
   }
}

Dolayısıyla, bu fonksiyonun kullanımı da oldukça kolay olacak:

<?php

// Bir kitap elemanına sahip olduğumuzu varsayalım.
// @var Book $book

// Elimizdeki kitabın başlığını güncelleyelim.
$book->updateTitle('Sineklerin Tanrısı');

İşte bu kadar kısa ve öz! Görüldüğü üzere, çıktı argümanı kullanmak aslında kodumuzu daha karmaşık ve uzun hâle getirmiş.

Yorum Gönderin

Bir Cevap Yazın

%d blogcu bunu beğendi: