Bir kod parçasının doğru çalışmasını sağlamamız gerektiği aşikâr. Çoğu zaman kod yazarken yalnızca olağan koşulları düşünüyoruz. Doğal olarak yazdığımız kod da doğru çalışıyor — tabii olağan koşullarda. Fakat bu sistemde bir problem var: Hayat her zaman olağan koşullarda ilerlemiyor.

Bir otomobil ürettiğimizi düşünelim. Dünyanın geri kalanını unutun; diyelim ki bu otomobil sadece Türkiye’de kullanılacak. Meteorolojiye danışalım ve ülkemizin yıllık ortalama sıcaklık değerlerini alalım: Yıl boyu en yüksek ortalama sıcaklık 21°C, en düşük ortalama sıcaklık ise 0°C. Örneği basit tutmak için, çok da bilimsel olmayan bir şekilde, aradaki farkı kullanarak kendimize uç sıcaklıkları çıkaralım:

  • Maksimum: 42°C
  • Minimum: -21°C

Diyelim ki bunlar Türkiye için yıl boyu olağan sıcaklık aralığı. Dolayısıyla da, otomobilimizi olağan koşullar için ürettiğimizde bu sıcaklık aralığında çalışması için üretmiş oluyoruz.

Peki, diyelim ki, olağandışı bir durum oldu. Eğer meteorolojinin yukarıda verdiğim linkine giderseniz, Türkiye’de kaydedilmiş en yüksek sıcaklığın 49°C, en düşük sıcaklığın ise -46°C olduğunu görürsünüz. Yani, otomobilimizi olağan koşullar için üretirsek, bu sıcaklık değerlerinde çalışmadığını göreceğiz.

Elbette olağandışı koşulları düşünürken kâr-zarar dengesini göz ardı etmemek gerekir. Bir otomobil üretirken, -46°C’de çalışmasını sağlamak için maliyeti yükseltmek çok mantıklı olmayabilir. Fakat -46°C’de zor bir durumdayken çalışmayan bir ambulansla baş başa kaldığınızı düşünebiliyor musunuz?

Örnek

Yukarıdaki otomobil-ambulans örneğindeki gibi, özellikle önemli özellikler için, kodumuzun olağandışı koşullarda dahi çalışmasını sağlamalıyız. Aşağıdaki örneği ele alalım:

<?php

class Book // Kitap
{
   // price: Fiyat
   private $price;

   // buy: Satın al
   // discount: İndirim
   public function buy(int $discount = null): bool
   {
      if ($discount === null) {
         // pay: Ödeme yap
         return pay($this->price);
      }

      return pay($this->price - $discount);
   }
}

Yukarıdaki örnekte, tabii ki örneği sade tutmak için, buy yani Satın al anlamında sadece bir fonksiyon bulunuyor. Bu fonksiyon, tercihen bir de $discount adında bir indirim miktarı alabiliyor. Yani, çok basitçe, bir kitabı indirimsiz veya indirimi olarak satın alabiliyoruz.

Kod, olağan koşullarda gayet güzel çalışıyor. Eğer indirim yoksa, kitabı normal fiyatından satıyor. Eğer indirim varsa, indirim miktarı kitabın fiyatından düşüyor ve kitabı indirimli fiyattan satıyor.

Peki, oldu da oldu, bir şekilde indirim miktarı kitabın fiyatından yüksek geldi. Kitabın fiyatı 7 liraydı, ama indirim olarak 10 lira verdik. Böyle bir durumda, yukarıdaki kod ne yapacak? Olumlu düşünürsek, pay() fonksiyonu hata verecek ve satış gerçekleşmeyecek — ki bu durumda dahi kitap satış platformumuz hata verecek. Olumsuz düşünecek olursak, belki de pay() fonksiyonumuz, kitabı almaya çalışan kişiden -3 lira çekmeye çalışacak. Yani aradaki 3 lirayı, kitabı almaya çalışan kişiye gönderecek.

İşte böylece, olağandışı bir durumda, sadece kitap satışı yapmaya çalışırken şirketi batırabilecek bir bug’a sahip olduk. 🙂

Temizlik zamanı

<?php

class Book // Kitap
{
   // price: Fiyat
   private $price;

   // buy: Satın al
   // discount: İndirim
   public function buy(int $discount = null): bool
   {
      // totalPrice: Toplam fiyat
      $totalPrice = $this->price;

      if ($discount !== null) {
         $totalPrice - $discount;
      }

      if ($totalPrice <= 0) {
         throw new RuntimeException("Kitap ücreti 0'dan büyük olmalı!");
      }

      return pay($totalPrice);
   }
}

Yukarıda yaptığımız değişikliklerin üstünden geçelim:

  1. $totalPrice adında yeni bir değişken yarattık. Amacımız, tüm fiyat değişikliklerini bu değişken üzerinden yapmak ve sonuçta bu fiyatın ödemesini istemek.
  2. Eğer $discount, yani indirim verilmişse, bu indirim miktarını $totalPrice değişkenimize uyguladık.
  3. Eğer $totalPrice değişkenimiz 0’a eşit veya 0’dan küçükse, fonksiyonun çalışmasını bir istisnayla durdurduk ve ödeme almaya dahi yeltenmedik.
  4. Eğer istisna gerçekleşmediyse, yani toplam fiyat 0’dan yüksekse, ödeme aldık.

Yukarıdaki örnekler, bize kod yazarken biraz daha derin düşünmemizi öğütlüyor.

Tüm bunların yanında, olağandışı koşulları kontrol altında tutmanın daha iyi bir yolu da var: Otomatik testler. Test yazmak, olağandışı koşulları düşünmeyi kolaylaştırıyor. Testler hakkında bu yazıda ayrıntıya girmeyeceğim, fakat konu tekelinde testlerin oldukça yardımının olacağını söylemeden geçmek de istemiyorum.

Yorum Gönderin

Bir Cevap Yazın

%d blogcu bunu beğendi: