Özgür Adem Işıklı Özgür Adem Işıklı Software Developer Resume Contact

Software Developer

Tam Bağımsız ve Tekil Sorumlu Try-Catch

Try-Catch bloklarını kullanarak hata yakalama sürecine aşina olduğunuzu varsayıyorum. Eğer değilseniz buradan temel bilgileri edinebilirsiniz. Yazı boyunca SOLID prensiplerinden Single Responsibility (Tek Sorumluluk) prensibine de değineceğim. Eğer bu konuda da ön bilginiz yoksa buradan faydalanabilirsiniz.

SOLID prensiplerini yazdığım her kod üzerinde istisnasız olarak uygulamak istiyorum. Bu nedenle epey dikkatli çalışıyorum. Özellikle metotlarımın tek sorumluluk prensibine göre yazıldığına önem gösteriyorum. Bu, bir çok işi yapan metotları parçalara bölmemi gerektiriyor. Ancak muhakkak bir noktadan sonra parçalara bölünen metotları çağırdığım bir ön metot olması gerekiyor. Bir kullanıcı kayıt işlemini ele alırsak genel olarak metotlar bu şekilde oluşuyor;


class UserInsertController
{
 
    public function provider()
    {
        $this->validation();
        $this->insert();
        $this->email();
    }
 
    private function validation()
    {
        // Form doğrulaması
    }
 
    private function insert()
    {
        // Kaydetme işlemi
    }
 
    private function email()
    {
        // Kullanıcıya e-posta gönderimi
    }
 
}

Bu tür bir yapı kurduğunuzda tek sorumluluk ilkesini uygulamış oluyorsunuz. Ancak çağırdığınız alt metotlarda oluşacak bir hatada bir sonraki adıma devam etmeden ilgili hatayı kullanıcıya göstermeniz gerekiyor. Bu tür durumlarda genel itibariyle bir çok developer (eskiden ben de buna dahildim) bir metotun işini sorunsuz yapıp yapmadığını anlamak için true-false gibi bir değer döndürmesini bekliyor. Bu yöntemi kullandığınızda ciddi bir kod karmaşası ortaya çıkıyor. Tıpkı aşağıdaki gibi;


class UserInsertController
{
 
    public function provider()
    {
        $result = $this->validation();        
        if (!$result) return false;
        
        $result = $this->insert();        
        if (!$result) return false;
        
        $result = $this->email();        
        if (!$result) return false;
        
    }
 
    private function validation()
    {
        // Form doğrulaması
        return true;
    }
 
    private function insert()
    {
        // Kaydetme işlemi
        return true;
    }
 
    private function email()
    {
        // Kullanıcıya e-posta gönderimi
        return true;
    }
 
}

Bu kodun zararsız olduğunu düşünebilirsiniz. Ancak bu yapı çok tehlikelidir ve çok adım gerektiren ve birden fazla durumu barındıran işlerde ortalık karışabilir. Örneğin validasyon işleminde ne tür bir hata var bilmiyoruz. Bunu öğrenmek için ayrıca hatayı da kontrol etmemiz gerekir. Lakin try-catch yapısı bu durumlar için idealdir;


class UserInsertController
{
 
    public function provider()
    {
        try {
            $this->validation();
            $this->insert();
            $this->email();            
        } catch (Exception $e) {
            echo $e->getMessage();
        }
    }
 
    private function validation()
    {
        // Form doğrulaması
        if ($email === '') {
            throw new Exception('E-posta adresi zorunlu.');
        }
    }
 
    private function insert()
    {
        // Kaydetme işlemi
    }
 
    private function email()
    {
        // Kullanıcıya e-posta gönderimi
    }
 
}

Bu yapıya baktığınızda tek sorumluluk ilkesini hem uyguladığımızı hem de kod karmaşasını engellediğimizi görüyoruz. Ayrıca hata durumunda diğer işlemler de otomatik olarak duruyor. Hata mesajını da sorunsuz bir şekilde alabiliyoruz. provider metodumuz içerisinde bir üst tarafa da hatayı bildirebilirdik. Böylece her bölüm tamamen birbirinden bağımsız olarak çalışmış olurdu. Bu yapıda hiç bir metot başka bir yerde oluşan hayatı kontrol etmek zorunda kalmaz.

What About Comments?

I do not use any comment system such as Disqus because of user's privacy. If you want to discuss something about this post, you may open an issue on the repo.

You may check what is the problem with Disqus;