Ruby ve Temiz Kod Yazimi

Bu yazımızda türkçe isimler kullanarak değişken ve metod isimleri kullandık, buradaki amacımız detaylı biçimde anlatım sağlayabilmek. Gerçek hayatta siz ingilizce olarak bu isimleri kullanırsanız hem geçerli bir standart ta yazmış olursunuz hemde programlama dilinin kendi diline uygun biçimde anlamlandırabilirsiniz.

1.Değişken İsimleri

Anlamlı ve telaffuz edilebilir değişken adları kullanın;

Kötü:

yyyymmdstr = Time.now.strftime('%Y/%m/%d')

İyi:

guncel_tarih = Time.now.strftime('%Y/%m/%d')

Aynı değişken türü için aynı kelimeleri kullanın. Konsept için bir kelime seçin ve ona bağlı kalın.

Kötü:

kullanici_detaylari
kullanici_bilgileri
kullanici_kaydı

baslangic_zamani
basla_zaman
baslangic_vakti

İyi:

kullanici

baslangic_zamani

Kapalı haritalamadan kaçının. Açık, kapalı olmaktan daha iyidir.

Kötü:

sehirler = ['Istanbul', 'Bursa', 'Izmir']
sehirler.each do |g|
  # Kodlar
  islem_yap(g)
  # burada g ne anlama geliyor?
end

İyi:

sehirler = ['Istanbul', 'Bursa', 'Izmir']
sehirler.each do |sehir|
  # Kodlar
  islem_yap(sehir)
end

Gereksiz bağlam eklemeyin. Sınıf/nesne adınız size bir şey söylüyorsa, bunu değişken adınızda tekrarlamayın.

Kötü:

araba = {
  araba_marka: 'Honda',
  araba_model: 'Civic',
  araba_renk: 'Mavi'
}

puts araba[:araba_marka]

İyi:

araba = {
  marka: 'Honda',
  model: 'Civic',
  renk: 'Mavi'
}

puts araba[:marka]

Koşullu ifadeler yerine varsayılan argümanları kullanın. Varsayılan argümanlar genellikle kısa devreden daha temizdir. Bunları kullanırsanız, yönteminizin yalnızca tanımsız bağımsız değişkenler için varsayılan değerler sağlayacağını unutmayın. false ve nil gibi diğer “sahte” değerler, varsayılan bir değerle değiştirilmeyecektir.

Kötü:

def create_araba(marka)
  araba_markasi = marka || 'Bilinmiyor'
  # ...
end

İyi:

def create_araba(marka = 'Bilinmiyor')
  # ...
end

2.Methodlar

Yöntemler sadece bir şey yapmalı, Bu, yazılım mühendisliğinde açık ara en önemli kuraldır. Metotlar birden fazla şey yaptığında, oluşturması, test etmesi ve üzerinde akıl yürütmesi daha zordur. Bir yöntemi yalnızca bir eyleme ayırabildiğinizde, kolayca yeniden düzenlenebilirler ve kodunuz çok daha temiz okunur. Bu yazimizdan bunun dışında başka bir şey almazsanız, birçok geliştiricinin önünde olacaksınız.

Kötü:

def email_musteriler(musteriler)
  musteriler.each do |musteri|
    musteri_data = database.lookup(musteri)
    email(musteri) if musteri_data.aktif?
  end
end

email_musteriler(musteriler)

İyi:

def email_musteriler(musteriler)
  musteriler.each { |musteri| email(musteri) }
end

def aktif(objeler)
  objeler.select { |obje| aktif?(obje) }
end

def aktif?(obje)
  data = database.lookup(obje)
  data.aktif?
end

email_musteriler(aktif(musteriler))

Metod adları ne yaptıklarını söylemelidir, Kötü adlandırılmış metodlar, en iyi ihtimalle kod gözden geçirenin bilişsel yüküne katkıda bulunur ve en kötü ihtimalle kod gözden geçireni yanıltır. Metodlari adlandırırken kesin amacı yakalamaya çalışın.

Kötü:

def tarihe_ekle(tarih, ay)
  # ...
end

tarih = DateTime.now

# Tarihe ne eklendigini burada anlamamiz zor
tarihe_ekle(tarih, 1)

İyi:

def tarihe_ay_ekle(tarih, ay)
  # ...
end

tarih = DateTime.now

tarihe_ay_ekle(tarih, 1)

Kapsülleme koşulları;

Kötü:

if params[:mesaj].present? && params[:alici].present?
  # ...
end

İyi:

def gonder_mesaj?(params)
  params[:mesaj].present? && params[:alici].present?
end

if gonder_mesaj?(params)
  # ...
end

Kullanılmayan kodu kaldırın.

Kullanılmayan kod, yinelenen kod kadar kötüdür. Kod tabanınızda tutmanız için hiçbir neden yok. Çağrılmıyorsa, ondan kurtulun! Hala ihtiyacınız varsa, sürüm geçmişinizde hala güvende olacaktır.

3.Nesneler ve Veri Yapıları

Getter ve setter kullanın, Nesneler üzerindeki verilere erişmek için getter ve setter kullanmak, bir nesne üzerinde bir özellik aramaktan daha iyi olabilir.

Kötü:

def banka_hesap_ekle
  # ...

  {
    bakiye: 0
    # ...
  }
end

hesap = banka_hesap_ekle
hesap[:bakiye] = 100
hesap[:bakiye] # => 100

İyi:

class BankaHesabi
  def initialize
    # burasi private
    @bakiye = 0
  end

  # "getter" public method ile
  def bakiye
    # do some logging
    @bakiye
  end

  # "setter" public method ile
  def bakiye=(miktar)
    @bakiye = miktar
  end
end

hesap = BankaHesabi.new
hesap.bakiye = 100
hesap.bakiye # => 100

Alternatif olarak, getter ve setter tanımlamak için attr_accessor kullanmalısınız. Bu, özellikle verileri sistemin diğer bölümlerine (örneğin, ActiveRecord nesneleri, uzak API’ler için yanıt sarmalayıcıları) gösteren veri benzeri nesnelerin uygulanması için uygundur.

class BankaHesabi
  attr_accessor :bakiye
end

hesap = BankaHesabi.new
hesap.bakiye = 100
hesap.bakiye # => 100

5.00 avg. rating (100% score) - 1 vote
Avatar for erimicel
1 Comments