2016-02-16 7 views
1

У меня есть этот метод:Используя условие охранника блока кода

def self.get_image(product_id) 
    self.initialize 

    product_id=product_id.to_s 
    if @image_db.key?(product_id) 
     if Time.now.to_i - @image_db[product_id][':cached_at'] > @refresh_period 
     puts Time.now.to_i - @image_db[product_id][':cached_at'] 
     self.cache_image(product_id) 
     else 
     return @image_db[product_id][':uri'] 
     end 
    else 
     self.cache_image(product_id) 
    end 
    end 

и я получаю ошибки rubocop использовать пункт охраны, а не в if - else заявления. Какой был бы лучший способ сделать это?

Я обдумывал этот код:

def self.get_image(product_id) 
    self.initialize 

    product_id=product_id.to_s 
    return if @image_db.key?(product_id) 
    return if Time.now.to_i - @image_db[product_id][':cached_at'] > @refresh_period 
    puts Time.now.to_i - @image_db[product_id][':cached_at'] 
    self.cache_image(product_id) 
    end 

, но эта линия никогда не будет называться:

return @image_db[product_id][':uri'] 

ответ

4

и я получаю ошибки rubocop использовать пункт охраны, а не в , если -else заявление ... Какой был бы лучший способ сделать это?

Прежде всего, внимательно прочитайте несколько статей о том, что такое оговорка о защите.

Вот ваш метод переработан использовать защитные пункты:

def self.get_image(product_id) 
    initialize 

    product_id = product_id.to_s 

    return cache_image(product_id)  unless @image_db.key?(product_id) 
    return @image_db[product_id][':uri'] unless Time.now.to_i - @image_db[product_id][':cached_at'] > @refresh_period 
    puts Time.now.to_i - @image_db[product_id][':cached_at'] 
    cache_image(product_id) 
end 

я бы, вероятно, переместить некоторые части методы вне упростить это немного:

def self.get_image(product_id) 
    initialize 
    product_id = product_id.to_s 
    return cache_image(product_id)  unless @image_db.key?(product_id) 
    return @image_db[product_id][':uri'] unless cached_at_gttn_refresh_period?(product_id) 
    puts Time.now.to_i - @image_db[product_id][':cached_at'] 
    cache_image(product_id) 
end 

private 

def cached_at_gttn_refresh_period?(product_id) 
    Time.now.to_i - @image_db[product_id][':cached_at'] > @refresh_period 
end 
+1

Спасибо Вам Андрей за это, был поучителен , Для кого-либо, кто нуждается в помощи с предложениями охраны, вместе с ответом Андрея, я нашел эти ссылки, которые очень помогли мне: http://www.thechrisoshow.com/2009/02/16/using-guard- в статьях-в-вашем-ruby-code/ http://stackoverflow.com/questions/31943125/how-to-correctly-use-guard-clause-in-ruby http://www.rubydoc.info/GitHub/bbatsov/rubocop/Rubocop/Cop/Стиль/GuardClause – snowflakekiller

Смежные вопросы