0634f6ac01
Reprise de l'index des journaux. J'apprend des choses pour panash : - faire un script d'installation ou une configuration qui permet de dire s'il faut utiliser un fichier header, un css pandoc à part, un footer... - prévoir la lecture de méta données dans le fichier source pour permettre l'usage de divers template
132 lines
5.2 KiB
HTML
132 lines
5.2 KiB
HTML
<!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 c’est 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 n’en 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>l’interprétation</em> de la façon d’instancier un objet entre ces deux langages.</p>
|
||
|
||
<p>Par contre c’est 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 s’appel un <code>constructeur</code> (ça c’est pour ceux du fond qui suivent pas hein ! ). On l’obtient 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 l’instance, elle l’initialise. Elles permettent de préparer l’instance 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…</p>
|
||
|
||
<p>En Ruby on pourrais définir une methode <code>new</code> en lieu et place d’@initialize@. Non mais qu’est-ce que je raconte, heureusement y’en 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, c’est qu’il faut faire attention. Cette methode <code>new</code> est censé créer l’instance 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 l’instance 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 l’on parle de constructeur en lieu et place de methode d’initialisation.</p>
|
||
|
||
<p><em>C’est de la sémantique c’est sur, mais le principe est là. J’aime ruby et j’aime 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>
|
||
|
||
|