İsimlendirme, programlamanın belki de en önemli adımıdır. Elbette değişkenlere, fonksiyonlara ya da sınıflara ne isim koyacağınız, kodunuzun nasıl çalışacağını etkilemez. Sonuçta kodunuz bir derleyici (compiler) ya da bir yorumlayıcı (interpreter) tarafından bilgisayarın anlayabileceği bir dile çevrilir. Fakat kodunuzda kullandığınız doğru isimlendirme teknikleri, kodunuzu insanlar tarafından anlaşılabilir hâle getirir. Göreceksiniz ki, bir kod parçasını anlaşılabilir kılmak, bilgisayarın kodu çalıştırabilmesinden çok daha önemlidir.

Kodun anlaşılır olması, onu aynı zamanda esnek hâle getirir. Esnek kod, değişmesi kolay kod demektir. Yazdığınız kod, son kullanıcının ihtiyaçlarını karşılamaya yönelik çalışmaya ne kadar yakınsa, o kadar esnek olmalıdır; çünkü son kullanıcının ihtiyaçları değişime fazlasıyla açıktır. Burda “son kullanıcının ihtiyaçları” olarak tanımladığım meta İngilizce’de “business logic” ya da “domain logic” olarak geçiyor. Bu konu üzerine detaylıca eğilen farklı bir yazı yazacağım.

Örnek

Kendinize biraz zaman tanıyın ve aşağıdaki örnekte bulunan kod parçasının ne işe yaradığını çözmeye çalışın. Bakalım çözebilecek misiniz? 🙂

<?php

public function c(int $t): void
{
   $cf = -999;
   $e = null;
   for ($i = 0; $i < count($l); $i++) {
      $ef = $l[$i]->f;
      if (abs($ef - $t) < abs($cf - $t)) {
         $cf = $ef;
         $e = $l[$i];
      }
   }

   $e->f = $t;
}

Temizlik zamanı

<?php

class ElevatorController // Asansör Kontrolü
{
   // callElevator: Asansör çağır
   // currentFloor: Bulunulan kat
   public function callElevator(int $currentFloor): void
   {
      // availableElevator: Müsait asansör
      // closestElevator: En yakın asansör
      $availableElevator = $this->getClosestElevator($currentFloor);

      // moveTo: Taşı
      $availableElevator->moveTo($currentFloor);
   }
}

class Elevator // Asansör
{
   private $elevators;

   // floor: Kat
   public function getClosestElevator(int $floor): Elevator
   {
      // allElevators: Tüm asansörler
      $allElevators = clone $this->elevators;

      do {
         // nextElevator: Sıradaki asansör
         $nextElevator = pop($allElevators);

         // currentElevatorDistance: Şu anki asansörün uzaklığı
         $currentElevatorDistance = abs($closestElevator->floor - $floor);

         // nextElevatorDistance: Sıradaki asansörün uzaklığı
         $nextElevatorDistance = abs($nextElevator->floor - $floor);

         // Eğer sıradaki asansör daha yakınsa...
         if ($nextElevatorDistance < $currentElevatorDistance) {
            // En yakın asansör olarak, sıradaki asansörü ata.
            $closestElevator = $nextElevator;
         }

      // Kontrol edecek asansör kaldıysa, kodu tekrar et
      } while (!empty($allElevators));
      return $closestElevator;
   }

   public function moveTo(int $floor): void
   {
      // Asansörün bulunacağı katı belirle
      $this->floor = $floor;
   }
}

Yukarıdaki kod, ilk paylaştığım çirkin kodla aynı işi yapıyor. Hatta fark ettiyseniz, yeni kod çok daha uzun: İki adet yeni sınıf, toplamda da üç adet yeni fonksiyon yarattık. Türkçe karşılıklarının yazıldığı yorumları saymasak bile, kodumuz yine de uzadı.

Öte yandan, yeni yazdığımız kod parçası çok daha rahat okunabiliyor. Sadece sınıf ve fonksiyon isimlerini okuyarak kodun ne yaptığını anlayabiliyoruz.

ElevatorController adlı sınıf asansörleri kontrol etmeye yarıyor. Bu sınıfın içindeki callElevator fonksiyonu, müsait bir asansörü bulunduğumuz kata çağırmamızı sağlıyor.

Elevator sınıfı içerisindeki getClosestElevator fonksiyonu, belirttiğimiz kata en yakın olan Elevator yani asansör elemanını sunuyor. moveTo fonksiyonu ise, bir Elevator elemanını istediğimiz kata taşımamızı sağlıyor.

İngilizce bilmeseniz dahi, yazdığım Türkçe karşılıkları ile beraber, kodun ne yaptığını anlamanız inanılmaz basitleşti. Bu da, asansörlerin çalışma mantığında bir değişikliğe gitmek istediğimizde, kodun buna izin verecek kadar esnek olmasını sağladı.

Yorum Gönderin

Bir Cevap Yazın

%d blogcu bunu beğendi: