CLEAN CODE ( TEMİZ KOD) MANTIĞI

 

            Ölçeği büyük projeler geliştirirken ,

    Javascript, Html, Css, C#, Sql gibi bir çok teknololojiyi bir arada kullanmanız gerekebilir. Ancak bu teknolojilerin her birinin yapısı farklıdır. 

       Bu sebeple kullandığınız teknolojilerin sınırlarını belirlemeniz gerekir. Bu da bize daha okunaklı, bakıma ve geliştirmeye açık kod yazma imkanı sunar.



Peki bir kod nasıl kolay ve anlaşılır olur?

Aşağıdaki koşullar sağlandıkça kodun anlaşılması kolaylaşır :

  • > Readability (Okunabilirlik)
  • > Changeability (Değiştirilebilirlik)
  • > Extensibility (Genişletilebilirlik)
  • > Maintainability (Sürdürülebilirlik)

    Eğer ki bir projede Javascript, Html, Css, C#,  Sql gibi teknolojileri bir arada kullanıyorsanız , dikkat etmeniz gereken nokta, her teknolojinin kendisine ait uzantılı dosyada tutulması gerektiğidir. 

     Javascript Dosyası .js  uzantılı, Css Dosyası .css uzantılı, Html Dosyası .html uzantılı, C# kodları .cs uzantılı dosyalarda ve Sql kodları da uygun bir yapıda olmalıdır.


       Clean Code (Temiz Kod) Yazarken Nelere Dikkat Etmeliyiz? 


      İsimlendirme

     İsimlendirme konusu , yazılım geliştirmenin en önemli noktalarındandır.

  Kodunuza anlamsız veya kısaltmalarla verilen isimler bir süre sonra kodun okunurluğunu azaltır ve kodu anlayacak kişi için de zaman maliyeti yaratır.
  Aynı şekilde anlamlı ve doğru isimler verirseniz, bu yazılımcının işini daha kolaylaştırır. 

  •    Class İsimlendirmeleri

Tanımlayacağınız Classın Single Responsibilty prensibine uygun olması ve bunu net biçimde yansıtması gerekir. İyi isimlendirilmiş classlar genelde isim olarak bir fiil değil bir isim alırlar.

                        Dirty                                         Clean                                      
                        WebsSiteBO                               User
                        Utilty                                            Account
                        Common                                   QueryBuilder
                        MyFunctions                              ProductRepository
                        JimmysObjects
                        Manager, Processor,Info

  •      Method İsimlendirmeleri

    Kötü bir method isimlendirmesi yaparsanız , metodun anlaşılması zaman alır. İyi isimlendirilmiş bir method hem anlaşılır hemde okunaklı olur.

     Metotlar bir fonksiyonelliği yerine getirdiklerinden isimleri ‘fiil’ olmalıdır.

    Metotlar da classlar gibi single responsibilty prensibine uymalı ve sadece tek bir fonksiyonelliği yerine getirmelidir. Metot isimlendirmesinde And, If, Or, gibi bağlaçlar geçiyorsa , metot birden fazla işi içerisinde barındırıyor mu diye kontrol etmeniz gerekir.

                            Dirty                           Clean                                               
                           Getprocess                  GetRegisteredUsers
                           pending                        IsValidSubmission
                           dolt                                ImportDocument
                           start                               SendEmail
                           On_init
                           SaveAndPublish

       Kısaltma kullanımı 

    İsimlendirmelerde kısaltma kullanımı kodlamada yapılan yanlışlardan biridir. 

     Yazdığınız kodu başka bir geliştirici okurken anlayabilmesi kolay olmalıdır. 

                           Dirty   : regUser, registUser, RegisUser.
                         Clean:  RegisterUser , registerUser

       Boolean isimlendirmeleri

    İyi bir boolean isimlendirmesini , okuyucuya sanki cevabı “doğru” veya “yanlış” olan bir soru soruyormuş gibi yapmalısınız.

                             Dirty                          Clean
                             open                          IsOpen
                             start                         done
                             status                        isActive
                             login                         loggedIn
  • Boolean değişkenlere true false atamalarında dikkat etmeniz gereken nokta, elinizdeki değişkene sonucu aşağıdaki gibi direkt olarak bu boolean üzerinden atayabilirsiniz. 

  • Böylece aşağıda olduğu gibi  8-9 satırlık kodu tek satırda yazabilirsiniz.
Dirty                                                                                                        
bool goingToChipotleForLunch;

if(cashInWallet>60)    Clean
{
  goingToChipotleForLunch=truebool goingToChipotleForLunch = cashInWallet>6.00
}
else
{
goingToChipotleForLunch=false;
}
                 int regisrationFee;
                 if(isSpeaker)                                    int registrationFee = isSpeaker ? 0 : 50;
                 { registrationFee=0;}
                 else
                 {registrationFee = 50;}
  • Koşul cümlelerinde ters koşul kullanmak da kodu okuyanlar için kafa karışıklığı yaratmaktadır. Mümkün olduğunca  pozitif anlamlı koşullar kullanmanız gerekir.
                 Dirty                                            Clean
             if(!isNotLoggedIn)                              if(loggedIn)
  • Bir grup seçenek arasından seçim yapmak gerekirse,  bunu static olarak vermektense enumlara bağlayıp kullanmak daha yerinde olacaktır. 
  • Böylece kodla  ilgili bir kısmı değiştirmek istediğinizde, o kısmın kullanıldığı yerleri tek tek bulup değiştirmek yerine, ilgili enum opsiyonunu değiştirmeniz yeterli olacaktır.
                    Dirty                                                  Clean
            if(employee=="Manager")              if(Employee == EmpoyeeType.Manager)
  •  Elinizde, belli değerlere karşı belli sonuç döndüren bir yapı varsa bunu hard-coded olarak kod içerisinde tutmaktansa, database’de bir tabloda json formatında veya key value şeklinde tutup ilgili key’e ilgili value’yi dönen bir fonksiyon üzerinden devam etmeniz daha anlaşılır olur.
        Dirty
      if(age<20)
        return 345;
      else if(age<30)                              Clean    
        return 419;                             return Repository.GetInsuranceRate(age);
      else if(age<40)
        return 476;
      else if(age<50)
        return 516;
  • Validasyonları iç içe if kullanarak yapmak çoğu yazılımcının düştüğü bir yazım yanlışıdır. Bu şekilde bir validasyon zincirinin okunması ve aynı zamanda hangi ifin hangi else denk geldiğinin anlaşılması zordur.
  •  Bunun yerine ifleri alt alta sıralayıp ilk yakalanan validasyondan itibaren kodu return etmek daha doğrudur.
          
                        Dirty                                             Clean
                          if()
                            if()                                         if()  return;
                              if()                                       if()  return;
                               if()                                      if()  return;
                                  do something...                        if()  return;   
                                 else                                      do something...
                                    return;
                               else
                                 return;
                             else
                              return;
                           else
                            return;

           Fonksiyonlar

    Kod tekrarından kurtulmak

     Dry(dont repeat yourself) bir kod prensibidir. 

    Bir fonksiyonelliği kodun birden fazla kısmında tekrar eden bir şekilde yazdıysanız ve daha da kullanmaya ihtiyaç duyabileceğiniz potansiyelde bir kod ise bu kod parçacığını metotlaştırmalısınız.

    Olabildiğince Küçük..

     Fonksiyon yazarken göz önünde bulundurmamız gereken en önemli kriterlerden birisi fonksiyonların olabildiğince küçük olmasıdır.  

     Bir fonksiyon 100’lerce satırdan oluşmamalıdır en fazla 20 satırda olmalıdır. 

     Yalnızca tek işlev

     Her fonksiyon yalnızca bir işlevselliği gerçekleştirmeli ve bunu da en efektif şekilde gerçekleştirmelidir. 

     Fonksiyonu yazan yazılımcı da onu ileride çağıracak olan yazılımcı da o fonksiyonu tek  bir amaç için çağırmalıdır.Bu da fonksiyonun isminden net bir şekilde anlaşılabilmelidir. 


          Aşağıdaki kod örneği ise koşul yapısının amacını net olarak belli eden ve geliştiricinin rahatlıkla okuyup anlayabileceği kod örneğidir.

        Clean

       private bool ValidFileRequest(string fileExtension, bool isActiveFail, bool isActive)
       {
          var validFileExtensions = new List<string>() {"mp4","mpg","avi"};
  
          bool IsValidFileType = validFileExtensions.Contains(fileExtension);
          bool IsUserAllowedToViewFile = isActiveFile || isAdmin;

          return IsvalidFileType && IsuserAllowedToViewFile;
       }
  
       if(ValidFileRequest(fileExtension, active))
  • Clean kod yazarken , kullandığımız dilin bize verdiği artılardan da yararlanmalıyız. Örneğin aşağıdaki iki kod parçacığı da aynı işi yapmakta ancak ilk kodun 5 satırda yaptığını ikinci kod tek satırda yapmakta ve ne yapmak istediği de çok net bir şekilde anlaşılabilmektedir.
    Dirty

    List<User> mathcingUsers = new List<User>();
     
    foreach(var user in users)
    {
       if(user.AccountBalanceStatus == Status.Active)
       { matchingUsers.Add(user);}
    }

     return matchingUser;

     Clean

     return users.Where(u=> u.AccountBalance < mininmumAccountBalance && u.Status == Status.Active);

           Exception Handling

  • Tanımladığınız exceptionlar, hatanın yeri ve kaynağı hakkında detaylı bilgi içermelidir. Bunun için exceptionlarınıza ve loglarımıza açıklayıcı hata mesajları eklemelisiniz.
  • Try-catch ile exception yönetirken eğer try blogunun içerisi çok fazla büyüdüyse ve tryın kapsadığı kod parçası ilk bakışta try ile beraber ele alınamıyorsa, kod parçacığını fonksiyon haline getirip fonksiyonu try içerisinden çağırın.
                    Dirty                                                           Clean

                    try                                                                          try
                    {                                                                            {
                      //  
                      //                                                                           saveThePlanet(); 
                      //                                                             
                      //                                                                         }catch
                      //                                                                        {

                    } catch(ArgumentOutOfRangeException)                             // do something
                    {                                                                            }
                        // do something                                            
                    }

        Classlar

   Classlar ınızı tasarlarken aynı fonksiyonlarda olduğu  gibi olabildiğince küçük olması gerekmekte. 

    Fonksiyon yazarken bu küçüklüğü satır sayısıyla ölçebilirken classlarda ise sorumluluklar ile ölçebiliriz. Bir class sorumluluğunun dışında işler yapan fonksiyonları barındırmamalıdır ve bu sorumluluklar da olabildiğince daha ufak alt sorumluluk başlıklarına ayrılmalıdır. 

    Classınızı isimlendirirken kısa, sade ve anlaşılır bir isim bulun. 

                       Dirty                                                          Clean
                   Worker worker = new Worker();                     Worker worker = new Worker
                   worker.Name= "Sam";                               {  
                   worker.Surname="Brown";                              Name= "Sam",
                   worker.Age=21;                                                  Surname="Brown",
                   worker.Title="Engineer";                                   Age=21,
                                                                                                 Title="Engineer"
                                                                                              };

      Commentler

  •   Gereksiz yorum
      int i=1; //sets i 1
  •   Niyeti belli etmeye çalışan yorum
           Dirty                                                   Clean
     if(isActive==2)                       if(isActive == Status.Active)


         Settingler

     Kod yazarken hiç bir setting Hard-Coded olarak kodun içerisinde yer almamalı. Kodun içerisinde yer alan settingler için her bir setting değişikliği istendiğinde yeni bir geliştirme, deploy ve live’a çıkış anlamına gelir. 

   Db’de tutulan settingler için ise istenen her değişiklik DB ye atılan bir sorgu ile halledilebilir kod dışarıdan yönetilebilir olur.





----------------------------------------------

     Kader ÖZEN

Computer Engineer

Yorumlar

Popüler Yayınlar