Kod Yazma Tarzı (Style Guide)
Aşağıdaki kurallar, kodun doğru çalışmasından ziyade, kullanıcı tarafından doğru okunup algılanması için düşünülmüş, kabul edilmiş kurallardır.
Ruby’e ait resmi bir durum olmasa da, genelde tüm kullanıcılar bu kurallara uymaya çalışır.
Bu kuralları ben GitHub’dan aldım.
- soft-tabs yani
TAB
karakteri yerine 2 adet space karakteri ile girinti yapılmalı - Mümkünse satır uzunluğu 80 karakteri geçmesin!
- Satır sonlarında boş karakter white-space bırakmayın!
- Her
rb
dosyası ya da Ruby kodu içeren dosya boş bir satırla bitsin. - Operatörler, virgül, iki nokta, noktalı virgül,
{
ve}
lerin etrafında mutlaka boşlukspace
karakteri olsun!
Yanlış
a=1
a,b=1,3
1>2?true:false;puts "Merhaba"
[1,2,3].each{|n| puts n}
Doğru
a = 1
a ,b = 1, 3
1 > 2 ? true : false; puts "Merhaba"
[1, 2, 3].each{ |n| puts n }
- Parantez ve Köşeli parantez kullanırken, ne öncesine ne de sonrasına boş karakter
space
koyma!
Doğru
my_method(arg1, arg2).other
[1, 2, 3].length
- Ünlemden sonra boş karakter
space
kullanma!array.include?(element)
when
vecase
kullanırken girinti durumunu aşağıdaki gibi yap:
case
when song.name == "Misty"
puts "Not again!"
when song.duration > 120
puts "Too long!"
when Time.now.hour > 21
puts "It’s too late"
else
song.play
end
kind = case year
when 1850..1889 then "Blues"
when 1890..1909 then "Ragtime"
when 1910..1929 then "New Orleans Jazz"
when 1930..1939 then "Swing"
when 1940..1950 then "Bebop"
else "Jazz"
end
- Method’lar arasında 1 satır boşluk ver, gerekiyorsa mantıklı bir şekilde içeride ayrım yap!
def some_method
data = initialize(options)
data.manipulate!
data.result
end
def some_method
result
end
Syntax
- Eğer method’a parametre geçiyorsan parantez yaz!
def some_method
# argümansız
end
def some_method_with_arguments(arg1, arg2)
# argümanlı
end
for
kullanımına dikkat edin, kafanıza göre heryerde kullanmayın:
arr = [1, 2, 3]
# kötü örnek
for i in arr do
puts i
end
# iyi örnek
arr.each { |i| puts i }
- İç içe ternary kullanmaktan kaçının! Okunabilirliği azaltıyor!
# kötü
some_condition ? (nested_condition ? nested_something : nested_something_else) : something_else
# iyi
if some_condition
nested_condition ? nested_something : nested_something_else
else
something_else
end
and
veor
yerine&&
ve||
kullanın- Mümkün oldukça
if
leri tek satır şeklinde kullanın:
# kötü
if some_condition
do_something
end
# iyi
do_something if some_condition
unless
içindeelse
kullanmaktan kaçının:
# kötü
unless success?
puts "hata"
else
puts "ok"
end
# good
if success?
puts "ok"
else
puts "hata"
end
- Tek satırlık blok işlerinde
{
}
, çok satırlık blok işlerindedo
end
kullanın. return
kelimesini gerekmedikçe kullanmayın.- Method’larda parametre olarak
default
değer atarken=
etrafında space kullanın.
# kötü
def some_method(arg1=:default, arg2=nil, arg3=[])
# kod...
end
# iyi
def some_method(arg1 = :default, arg2 = nil, arg3 = [])
# kod...
end
- Varlık operatörü kullanmaktan çekinmeyin!
# eğer isim nil ya da false ise isim değişkenine "vigo" ata
isim ||= "vigo"
- Boolean değerler için
||=
kullanmayın!
# kötü
enabled ||= true
# iyi
enabled = true if enabled.nil?
- Parantezli kullanımda method’dan sonra space kullanmayın:
# kötü
f (3 + 2) + 1
# iyi
f(3 + 2) + 1
- Block içinde kullanmayacağınız değişken için değer ataması yapmayın:
# kötü, k boşa gitti
result = hash.map { |k, v| v + 1 }
# iyi
result = hash.map { |_, v| v + 1 }
- Veri tipi kontrolü için
===
kullanmayın!is_a
ya dakind_of?
kullanın.
Naming (İsimlendirmeler)
- Method ve değişken isimleri için
snake_case
kullanın. - Class ve Modül için
CamelCase
kullanın. - Constant için
SCREAMING_SNAKE_CASE
kullanın. - Boolean sonuç dönen method’lar
?
ile bitmeli:User.is_valid?
- Tehlike, nesneyi modifiye eden / değiştiren method’lar
!
ile bitmeli!User.delete!
Class
- Singleton tanımlarken
self
kullanın:
class TestClass
# kötü
def TestClass.some_method
# kod
end
# iyi
def self.some_other_method
# kod
end
end
private
,public
,protected
olan method’larda girintileme method adıyla aynı hizada olsun ve ilgili method’un bir üst satırı boş kalsın:
class SomeClass
def public_method
# ...
end
private
def private_method
# ...
end
end
Exceptions
- Akış kontolü için kullanmayın!
# kötü
begin
n / d
rescue ZeroDivisionError
puts "0’a bölünme hatası!"
end
# iyi
if d.zero?
puts "0’a bölünme hatası!"
else
n / d
end
Diğer
- String’leri concat ederken interpolasyon kullanın:
# kötü
email_with_name = user.name + " <" + user.email + ">"
# iyi
email_with_name = "#{user.name} <#{user.email}>"
- Gerekmedikçe değer atamalarında tek tırnak
’
kullanmayın, çift tırnağı tercih edin"
- String concat işlerinde Array’e ekleme tekniğini kullanabilirsiniz, hızlı da olur:
html = ""
html << "<h1>Page title</h1>"
paragraphs.each do |paragraph|
html << "<p>#{paragraph}</p>"
end