Etki alanı (scope), iki süslü ayraç (curly brackets) arasında bulunan alanı isimlendirmek için kullanılır. Etki alanlarını baz alarak isimlendirme yapmak bize belli açılardan yarar sağlar: Örneğin, eğer etki alanı küçük bir fonksiyondan bahsediyorsak, kısa değişken isimleri kullanmak fonksiyonun anlaşılabilirliğini pek etkilemez. Öte yandan etki alanı ne kadar büyükse, değişken isimleri de aynı derecede detaylı olmalıdır.

Elbette genel olarak programlamadan bahsederken etki alanlarını genelde küçük tutmak anlaşılabilirlik açısından çok daha önemlidir. Etki alanı küçük fonksiyonlar, daha rahat anlaşılabilir fonksiyonlardır. Etki alanı küçük sınıflar (class), daha rahat değiştirilebilir sınıflardır. Bu konu üzerine daha detaylı bir yazı yazacağım.

Örnek

Bu arada, biz etki alanını baz alarak isimlendirme yapmaya geri dönelim. Aşağıda her ne kadar anlamsız değişken isimlerine sahip olsa da, etki alanı kısa olduğu için anlaşılması kolay bir örnek var:

<?php

class Book // Kitap
{
   // deletePages: Sayfaları sil
   // until: 'e kadar
   public function deletePages(int $until): void
   {
      for ($i = 1; $i < $until; $i++) {
         $this->deletePage($i);
      }
   }

   // deletePage: Sayfayı sil
   // page: Sayfa
   private function deletePage(int $page): void
   {
      $this->pages[$page] = null;
   }
}

Yukarıdaki örnekte, deletePages isimli fonksiyonda kullandığımız $i isimli bir değişken var. Bu değişkenin isminin herhangi bir anlamı yok. Fakat bu değişken, yalnızca for döngüsünün (loop) etki alanı içerisinde kullanılabiliyor. Bu etki alanı ise yalnızca 3 satır:

for ($i = 1; $i < $until; $i++) {
   $this->deletePage($i);
}

Değişkenin ne işe yaradığını sadece bakarak anlayabiliyoruz: Silinecek her sayfa için bir yineleme görevi görüyor. Yani, sayfaları tek tek gezmeye yarıyor. Şu durumda elbette ki $i değişkenini $currentPage yani şimdiki sayfa olarak da güncelleyebiliriz. Fakat etki alanı o kadar küçük ki, $i ismi de kodun anlaşılırlığını bozmuyor.

Şimdi de aşağıda etki alanı büyük olan bir örneğe göz atalım:

<?php

class Book // Kitap
{
   // addAuthorsToBooks: Kitaplara yazarları ekle.
   // authors: Yazarlar
   // books: Kitaplar
   public static function addAuthorsToBooks(array $authors, array $books): void
   {
      // all: Hepsi
      $all = 0;

      // Yazarlar dizisi boş mu?
      if (empty($authors)) {
         return;
      }

      foreach ($books as $book) {
         // updated: Güncellendi
         // false: Yanlış
         $updated = false;
         foreach ($authors as $author) {
            if (!$book->hasAuthor($author)) {
               $book->addAuthor($author);

               // true: Doğru
               $updated = true;
            }
         }

         if ($updated) {
            $all++;
         }
      }
   }

   // hasAuthor: Yazar ekli mi?
   private function hasAuthor(Author $author): bool;

   // addAuthor: Yazarı ekle
   private function addAuthor(Author $author): bool;
}

Temizlik zamanı

Pekala… Normalde bu kadar fazla derinlik içeren kod yazmıyorum. 🙂 Bana göre yukarıdaki kod birçok açıdan kötü ve kolay anlaşılabilir değil. Fakat, bir örnek verebilmek için etki alanı büyük bir kod yazmam gerekiyordu.

Gördüğünüz gibi, addAuthorsToBooks fonksiyonunun başında $all adında bir değişken var. İsmi gayet kısa. Fakat, yukarıdaki kodu baz alırsak, kullanılabilir olduğu etki alanı tam 27 satır. Yani oldukça kısa isimlendirilmiş bu fonksiyonun neler yaptığından tam olarak emin olmanız için 27 satırı incelememiz gerekiyor.

Haydi o zaman inceleyelim. 🙂

Değişkenimiz $all, bu 27 satırlık fonksiyonda iki noktada kullanılıyor: Birincisi, fonksiyonun en başında 0’a eşitleniyor. İkincisi ise, fonksiyonun sonlarına doğru, $updated adlı değişkenin true olduğu durumda değer artırımına uğruyor.

Sadece iki satırda kullanıldığı için çok da dert yaratmadı, değil mi? Yanlış. Çünkü şimdi de $updated değişkenini incelememiz lazım. O da aynı şekilde ilk olarak false‘a eşitleniyor, sonrasında eğer $book yani kitapta hâli hazırda $author yani yazar ekli değilse true olarak güncelleniyor.

Daha fazla derine inmeden, bu kodun verilen her yazar ve her kitap için çalıştırıldığını söylersek, takip etmenin ne kadar zorlaşacağını görmek de o kadar kolay olur sanırım. Bu değişkenin ne işe yaradığını anlamak için, kodun ne yaptığını çözmek gerekiyor. Şimdi, bu değişkenin ne yaptığını söylemeden önce, değişkeni, etki alanı büyük olduğu için, ismi daha uzun olacak şekilde güncelleyelim:

<?php

class Book // Kitap
{
   // addAuthorsToBooks: Kitaplara yazarları ekle.
   // authors: Yazarlar
   // books: Kitaplar
   public static function addAuthorsToBooks(array $authors, array $books): void
   {
      // updatedBookCount: Güncellenen kitap sayısı
      $updatedBookCount = 0;

      // Yazarlar dizisi boş mu?
      if (empty($authors)) {
         return;
      }

      foreach ($books as $book) {
         // updated: Güncellendi
         // false: Yanlış
         $updated = false;
         foreach ($authors as $author) {
            if (!$book->hasAuthor($author)) {
               $book->addAuthor($author);

               // true: Doğru
               $updated = true;
            }
         }

         if ($updated) {
            $updatedBookCount++;
         }
      }
   }

   // hasAuthor: Yazar ekli mi?
   private function hasAuthor(Author $author): bool;

   // addAuthor: Yazarı ekle
   private function addAuthor(Author $author): bool;
}

Eski ismi olan $all yerine $updatedBookCount ismini kullanmaya başladık. Şimdi, kodu incelemeden bu değişkenin neye yaradığını biliyoruz. Tüm o analizleri yapmamıza gerek kalmadı. Güncellenen her kitap için, değişkenin değeri bir artıyor.

İşte bu kadar basit. 🙂

Yorum Gönderin

Bir Cevap Yazın

%d blogcu bunu beğendi: