Ruby if unless 3

Publié par Yannick Francois Dim 18 jan 2009 20:40:00 GMT

Une des choses très agréable avec Ruby c’est ça syntaxe. Un des mots bien particulier en Ruby est unless.

Je partage tout à fait l’avis de ce billet Unless, The Abused Ruby Conditional unless c’est bien, très bien même dans certain cas, mais en abuser c’est mal. Ce mot peut rendre les choses plus lisible tout comme il pourrait les compliquer.

Une condition doit représenter une intention, unless permet de le faire, mais cela doit rester une intention.

xml.updated @items.first.updated_at.xmlschema unless @items.empty?

Ce code, extrait de la classe feed.atom.builder de Typo est une bonne utilisation de unless. On évite ainsi le vilain:

xml.updated @items.first.updated_at.xmlschema if !@items.empty?

Un peu comme, et dans la même classe, nous avons un peu plus haut:

if(not this_blog.blog_subtitle.blank?)
    xml.subtitle this_blog.blog_subtitle, "type"=>"html"
  end

Assez étrange, nous aurions pu avoir plutôt

unless this_blog.blog_subtitle.blank?
    xml.subtitle this_blog.blog_subtitle, "type"=>"html"
  end

Voir


xml.subtitle this_blog.blog_subtitle, “type”=>"html" unless this_blog.blog_subtitle.blank?

Il y a part contre dans la méthode ping_article! du modèl blog.rb une mauvaise utilisation de unless (à mon avis)

unless global_pings_enabled? && settings.has_key?(:url) && settings.has_key?(:article_id)
   throw :error, "Invalid trackback or trackbacks not enabled"
end
et une bonne.
unless article.allow_pings?
   throw :error, "Trackback not saved"
end

Pour la bonne, rien à dire. Par contre, la première n’exprime pas assez clairement l’intention.


if !global_pings_enabled? || !settings.has_key?(:url) || !settings.has_key?(:article_id)
throw :error, “Invalid trackback or trackbacks not enabled”
end

Je trouve que là c’est plus clair, on comprend mieux que si l’une des trois conditions n’est pas rempli, on lève un exception.

Tout ceci est une histoire de gout peut-être, vous en pensez quoi ?