-
Metodun beklediği parametre(ler) varsa,
def
ile parantez kullanın. Eğer metot bir parametre beklemiyorsa, parantez kullanmanız gerekmez.def some_method #metod içeriği end def some_method_with_parameters(arg1, arg2, ...) #metod içeriği end
-
Metot parametrelerini tek tek tanımlamak yerine hash içerisinde göndererek metot içerisinde tanımlamak daha kullanışlıdır.
# kötü def obliterate(things, gently = true, except = [], at = Time.now) .... end # iyi def obliterate(things, options = {}) options = { gently: true, #burada kullanılan parametreler için except = [], #acıklama yazmak, ileride bu metotu kullananlar için at: Time.now, #sağlıklı bir yöntem olabilir. }.merge(options) .... end
-
Tek satırlık metot yazımlarından kaçının.
# kötü def too_much; something; something_else; end # iyi def some_method ... end
metot çağrılarında parantez kullanın:
-
Eğer metot bir değer döndürüyorsa
# kötü @current_user = User.find 2312 # iyi @current_user = User.find(2312)
-
Metotun ilk parametresi parantez içerisindeyse;
# kötü put! (x + y) % len, value # iyi put!((x + y) % len, value)
-
Metot adı ile parantez arasına asla boşluk bırakmayın.
# kötü f (3 + 2) + 1 # iyi f(3 + 2) + 1
-
Metot deger beklemiyorsa, parantez kullanmanız gerekmez.
# kötü nil?() # iyi nil?
-
Metot bir değer döndürmezse(veya önemsenmezse), parentez kullanımı isteğe baağlıdır. Eğer parametreler çoksa, parantez kodun okunabilirliğini kolaylaştırır.
# iyi render(:partial => 'foo') # iyi render :partial => 'foo'
-
Eğer metot son değişken olarak hash bekliyorsa,
{
}
parantez kullanmayın.# kötü get '/v1/reservations', { :id => 46352 } # iyi get '/v1/reservations', :id => 46352
-
Eğer
if/unless
metotunuz birden fazla satırdan oluşuyorsa (multi-line), aslathen
kullanmayınız.# kötü if some_condition then ... end # iyi if some_condition ... end
-
Eğer
while
veyauntil
metotunuz, multi-line ise aslado
kullanmayınız.# kötü while x > 5 do ... end until x > 5 do ... end # iyi while x > 5 ... end until x > 5 ... end
-
and
,or
,not
yerine&&
,||
,!
kullanınız. -
Metot içeriği ve koşulları basit ise tek satır kullanım iyidir.
# kötü add_trebuchet_experiments_on_page(request_opts[:trebuchet_experiments_on_page]) if request_opts[:trebuchet_experiments_on_page] && !request_opts[: trebuchet_experiments_on_page].empty? # güzel if request_opts[:trebuchet_experiments_on_page] && !request__opts[:trebuchet_experiments_on_page].empty? add_trebuchet_experiments_on_page(request_opts[:trebuchet_experiments_on_page]) end # kötü - Karmaşık. Birden çok satır ve yorum gerektiriyor :( parts[i] = part.to_i(INTEGER_BASE) if !part.nil? && [0, 2, 3].include?(i) # güzel return if reconciled?
-
Asla
unless
ileelse
i kullanmayınız. Olumlu durumuyla tekrardan yazın.# kötü unless success? puts 'failure' else puts 'success' end # iyi if success? puts 'success' else puts 'failure' end
-
unless
metotunda, birden fazla koşul kullanmaktan kaçının.# kötü unless foo? && bar? ... end # iyi if !(foo? && bar?) ... end
-
Eğer
unless
yerineif
operatörünü kullanabiliyorsanız,if
i tercih ediniz.# kötü unless x == 10 ... end # iyi if x != 10 ... end # kötü unless x < 10 ... end # iyi if x >= 10 ... end # güzel unless x === 10 ... end
-
if/unless/while
koşullarında, parantezden kaçının.# kötü if (x > 10) ... end # iyi if x > 10 ... end
Kısaltılmış if yapısı da diyebiliriz( if
kullanılmadan :) ).
örn:
not > 50 ? durum = 'geçtin' : durum = 'kaldın'
veya
durum = not > 50 ? 'geçtin' : 'kaldın'
-
Koşullar, kapsamlı ise ternary operatöründen
(?:)
kaçının. Tek Satırlık koşullarda, ternary operatörü tercih edin.# kötü result = if some_condition then something else something_else end # iyi result = some_condition ? something : something_else
-
İç içe geçmiç ternary operatör kullanmak yerine,
if/else
yapsını tercih edin.# 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
-
ternary operatörlerde çoklu koşullardan kaçının.
-
Çok satırlı(multi-line) ternary operatör
(?:)
yerine,if/then/else/end
i tercih edin.# kötü some_really_long_condition_that_might_make_you_want_to_split_lines ? something : something_else # iyi if some_really_long_condition_that_might_make_you_want_to_split_lines something else something_else end
-
İç içe kullanımı önlemek (daha fazla bilgi için)
Genel ilkeleri özetlersek:
- Fonksiyonun artık birşey yapamadığını gördüğünüz zaman hemen geri dönün.
- İç içe girintiyi farkettiğiniz durumda, bu durumu gidermeye çalışın. Böyle yaparak kodunuzun, okunabilirlik ve anlaşılabilirliğini arttırmış olursunuz.
- Önemli akışlar, az girinti gerektirir.
# kötü def compute server = find_server if server client = server.client if client request = client.make_request if request process_request(request) end end end end # iyi def compute server = find_server return unless server client = server.client return unless client request = client.make_request return unless request process_request(request) end
Döngü içlerinde, iç içe yapılar yerine
next
i tercih edin.# kötü [0, 1, 2, 3].each do |item| if item > 1 puts item end end # iyi [0, 1, 2, 3].each do |item| next unless item > 1 puts item end