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