Ruby if unless

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.

  {% highlight ruby %}
    xml.updated @items.first.updated_at.xmlschema unless @items.empty?
  {% endhighlight %}

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

  {% highlight ruby %}
    xml.updated @items.first.updated_at.xmlschema if !@items.empty?
  {% endhighlight %}

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

  {% highlight ruby %}
    if(not this_blog.blog_subtitle.blank?)
      xml.subtitle this_blog.blog_subtitle, "type"=>"html"
    end
  {% endhighlight %}

Assez étrange, nous aurions pu avoir plutôt

  {% highlight ruby %}
    unless this_blog.blog_subtitle.blank?
      xml.subtitle this_blog.blog_subtitle, "type"=>"html"
    end
  {% endhighlight %}

Voir

  {% highlight ruby %}
    xml.subtitle this_blog.blog_subtitle, "type"=>"html" unless this_blog.blog_subtitle.blank?
  {% endhighlight %}

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

  {% highlight ruby %}
    unless global_pings_enabled? && settings.has_key?(:url) && settings.has_key?(:article_id)
      throw :error, "Invalid trackback or trackbacks not enabled"
    end
  {% endhighlight %}

et une bonne.

  {% highlight ruby %}
    unless article.allow_pings?
      throw :error, "Trackback not saved"
    end
  {% endhighlight %}

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

  {% highlight ruby %}
    if !global_pings_enabled? || !settings.has_key?(:url) || !settings.has_key?(:article_id)
      throw :error, "Invalid trackback or trackbacks not enabled"
    end
  {% endhighlight %}

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 ?