Files
lespiedsdanslecode/content/2007/2007-08-09-ruby-new-vs-initialize/index.html
T
2020-03-27 22:43:43 +01:00

132 lines
5.2 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>Yannick François - Les pieds dans le code</title>
<meta name="DC.title" content="elsif.fr, site de Yannick François aka yaf aka pouype."/>
<meta name="description" content="Yannick François's website. Senior developer, Code pedagogist. /ut7 teammate, proud member of Electrolab, the crazy hackerspace. Eternel supporter of April, a french association about freesoftware."/>
<meta name="keywords" content="code, développement, lean, agile, logiciel, tdd, objet, ruby, site perso, personnel, ruby on rails, refactoring, openbsd, bsd, libre, creative commons, unix"/>
<meta name="author" content="Yannick François, https://elsif.fr"/>
<meta name="designer" content="Yannick François, https://elsif.fr"/>
<meta name="geo.placename" content="Poissy, Ile de france, France"/>
<meta name="robots" content="index,follow" />
<meta name="language" content="French" />
<meta name="HandheldFriendly" content="True" />
<meta name="MobileOptimized" content="320" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0" />
<link rel="index" title="Yannick François / Developer" href="https://elsif.fr" />
<link rel="stylesheet" href="/css/knacss.css" media="all"/>
<link rel="stylesheet" href="/css/elsif.css" media="all"/>
<article>
<h1>
Ruby: new vs initialize
</h1>
<p>Pour certain cest une évidence, mais <a href="http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/255359">un vieux mail</a> sur la <a href="http://www.ruby-lang.org/fr/community/mailing-lists/">liste de diffusion de ruby_core</a> ma donné envie de me pencher sur la question.</p>
<p>Venant du monde Java (enfin je nen suis pas encore sorti), je suis un habitué du:</p>
<p><code>MacLasse monObjet = MacLasse.new();</code></p>
<p>pour <a href="http://www.ruby-lang.org">Ruby</a> ça devient:</p>
<p><code>mon_objet = Mac_lasse.new</code></p>
<p>Bon à part le typage dur de java versus le typage dynamique de ruby, pas de gros changement sur <em>linterprétation</em> de la façon dinstancier un objet entre ces deux langages.</p>
<p>Par contre cest sur la classe elle même que ça change pas mal.</p>
<p>En java MacLasse ressemble à ça:</p>
<pre>
{% highlight java %}
public class MacLasse {
public MacLasse(){
// code a executer lors de l'instanciation de l'objet
}
}
{% endhighlight %}
</pre>
<p>et en ruby on se retrouve avec ça:</p>
<pre>
{% highlight ruby %}
class MaClasse
def initialize
// code a executer lors de l'instanciation de l'objet
end
end
{% endhighlight %}
</pre>
<p>Cette methode en java sappel un <code>constructeur</code> (ça cest pour ceux du fond qui suivent pas hein ! ). On lobtient en définissant une methode portant le même nom que la classe.</p>
<p>Pour ruby, peut importe le nom de la classe, on utilise une methode <code>initialize</code>.</p>
<p><strong>Alors <code>initialize</code> est-elle une methode de type <em>constructeur</em> ?</strong></p>
<p>Non. et en Java non plus finalement. Ces deux methode ne <em>construisent</em> pas linstance, elle linitialise. Elles permettent de préparer linstance avant de la rendre. En java comme en Ruby, on peut très bien ce passer de ces methodes.</p>
<p>Maintenant on va s’éloigner de Java&hellip;</p>
<p>En Ruby on pourrais définir une methode <code>new</code> en lieu et place d@initialize@. Non mais quest-ce que je raconte, heureusement yen a au premier rang qui suivent. Merci.</p>
<p>Je reprend. En ruby on peut surcharger la methode <code>new</code> <em>(Object#new)</em> en plus de la methode <code>initialize</code>. Le seul hic, cest quil faut faire attention. Cette methode <code>new</code> est censé créer linstance de la class. Il faut donc penser à renvoyer la bonne instance en fin de methode (<code>new</code> pour les voisins du radiateur).</p>
<p>Voyons plutôt un petit bout de code:</p>
<pre>
{% highlight ruby %}
class Test_initialize
def initialize
"test_initialiaze"
end
end
class Test_new
def self.new(*args)
"test_new"
end
end
class Test_new_2
def self.new(*args)
"test_new_2"
Object.new
end
end
test = Test_initialize.new
puts test.class # Test_initialize
test = Test_new.new("args")
puts test.class # String
test = Test_new_2.new("args")
puts test.class # Object
{% endhighlight %}
</pre>
<p>On le voit assez bien je pense: Surcharger <code>new</code> ne doit pas se faire à la légère. Utilisé <code>initialize</code> pour initialiser linstance semble bien plus logique.</p>
<p>Là dessus Ruby montre bien un de ces principe de base qui veux que le langage soit simple et logique. Contrairement a Java ou lon parle de constructeur en lieu et place de methode dinitialisation.</p>
<p><em>Cest de la sémantique cest sur, mais le principe est là. Jaime ruby et jaime bien java quand même :-)</em></p>
<article>
<footer style="font-size:75%;text-align:right"><em><a href="/feed.xml">suivre les articles</a></em></footer>
</body>
</html>