Juste pour réagir vis à vis de l'héritage,

Je serais pas aussi radical personnellement. Si on voulait raisonner façon
FP dans 80% des cas, autant aller faire du Clojure. On est en Ruby, le
principe de classes/instances/mixins est omniprésent. On retrouve très
clairement des composantes ou inspirations fonctionnelles un peu partout
(coucou Enumerable), mais cela ne veut pas dire qu'il faut  considérer les
classes et l'héritage comme étant une construction à éviter. Au contraire,
on a nos objets absolument partout et on vient tirer parti du fort
dynamisme de Ruby pour y inclure des constructions habituelles dans les
langages fonctionnels, justement grâce à ce dynamisme.

Pour ma part, je le résume ainsi le choix entre l'héritage et les mixins:

- Si le concept que j'implémente est concret et autonome. Il s'agit d'une
contrainte forte que l'on met en place, il ne peut être conjugué qu'au
travers une composition et sera hérité pour être étendu.
- Si le concept que j'implémente n'existe pas tout seul et doit forcément
être conjugué à un autre alors il s'agit d'un mixin (module).

Tu vas me répondre, oui mais AR et DataMapper, les deux implémentent la
même chose. Sauf que ce n'est pas exactement le même cas : AR implémente un
"Record", un enregistrement db donc qui sera étendu pour devenir un objet
métier là où DataMapper vient apporter la "persistance" en db à un objet
métier.

C'est donc l'approche qui change, avec AR on a très clairement la notion
qu'il s'agit d'une ligne dans la db a qui je fais faire des trucs business,
d'ailleurs sa structure est définie dans la db, c'est donc la DB qui
détermine quels attributs sont persistés, soulignant ainsi sa nature.
D'ailleurs rien n'est fait pour le masquer. Bref, c'est moins souple, mais
c'est plus facile à utiliser (j'ai choisi "facile" ici, pas "simple", la
différence est subtile mais importante).

A côté, tu as DataMapper, où je viens indiquer dans mon objet métier
quelles sont les propriétés persistées directement dans le corps de la
classe et les différents comportements sont splittés au sein de différentes
gems, que j'inclus selon ce dont j'ai besoin. C'est clairement moins facile
à utiliser, le comportement ne m'est pas imposé mais c'est beaucoup plus
souple.

Bref, clairement on peut implémenter n'importe quel problème avec une
approche ou l'autre, il s'agit simplement de savoir quel focus on veut
donner, c'est lui qui conditionnera l'usage qui en est fait, genre est-ce
que ça va me paraitre logique/évident/sensé ou pas. C'est toute la beauté
de Ruby je trouve.

Enfin pour le STI, je comprends tout à fait ce que tu veux dire, mais
serait plus judicieux à mon goût de le formuler autrement : on sort le STI
uniquement quand le problème à modéliser s'y prête parfaitement, ce qui est
tout de même pas si courant que ça, d'où la méfiance envers son usage. Si
j'implémente la notion d'être humain, je vais avoir des trucs genre
House.has_many(:humans) et je trouverais donc Man et Woman qui sous
classent Human. Les deux sont très très similaires, sauf qu'à l'heure
actuelle l'homme n'est pas encore capable d'être "enceint", donc j'ai un
attribut supplémentaire sur la classe Woman. Maintenant, si je viens
implémenter un truc genre Workshop.has_many: tools, Tool comporte une
tétrachiée de différentes subtilitées et potentiellement de concepts
différents (outil qui a besoin du courant, outil à la con genre marteau)
là, je me tire une balle dans le pied en sortant le STI.

My 2 euros (oui car quand même j'ai beaucoup écris là ^^),


2014-09-19 14:39 GMT+02:00 Tim <itsumo.sibyl...@gmail.com>:

>
> Merci beaucoup pour la justification,
> en effet je pensais que private avait le meme comportement dans tous les
> langages et j'ai commencé avec le JAVA...
>
Comme beaucoup d'entre nous (ou le C++), c'est parfaitement normal de
raisonner ainsi quand tu n'as été exposé qu'à ceux-ci.

>
> Bon ben je m'écrase, merci pour vos liens/explications.
>

>
> Le vendredi 19 septembre 2014 14:13:18 UTC+2, Tim a écrit :
>>
>> Salut à tous
>>
>>
>> Je viens de tomber sur quelque chose qui perturbe totalement mon
>> intuition de dev :
>>
>> apparemment une méthode déclarée comme privée est accessible par son
>> enfant dans le controller : voici mon code réel :
>>
>> Rails 4.1.5 (fonctionne aussi sur 3.2.19), Ruby 2.1.2
>>
>> class ApplicationController < ActionController::Base
>>   protect_from_forgery with: :exception
>>
>>   private
>>
>>   def method_privee
>>     p "method_privee accessible"
>>   end
>> end
>>
>>
>> class PhrasesController < ApplicationController
>>   def index
>>     method_privee # affiche "method prive accessible"
>>   end
>> end
>>
>> Ce code (je viens de le lancer plusieurs fois) fonctionne lorsque l'on va
>> sur /phrases/index et ne fais pas "raise error, NoMethodError" mais affiche
>> bien "method_privee accessible"
>>
>> Quelqu'un peut m'expliquer ? merci
>>
>> Ciao.
>>
>  --
> --
> Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de
> Google Groups.
> Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse
> railsfrance@googlegroups.com
> Pour résilier votre abonnement envoyez un e-mail à l'adresse
> railsfrance-unsubscr...@googlegroups.com
> ---
> Vous recevez ce message, car vous êtes abonné au groupe Google Groupes
> "Railsfrance".
> Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le
> concernant, envoyez un e-mail à l'adresse
> railsfrance+unsubscr...@googlegroups.com.
> Pour obtenir davantage d'options, consultez la page
> https://groups.google.com/d/optout.
>



-- 
Jean-Hadrien Chabran

-- 
-- 
Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de 
Google Groups.
Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse 
railsfrance@googlegroups.com
Pour résilier votre abonnement envoyez un e-mail à l'adresse 
railsfrance-unsubscr...@googlegroups.com
--- 
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes 
Railsfrance.
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, 
envoyez un e-mail à l'adresse railsfrance+unsubscr...@googlegroups.com.
Pour plus d'options, visitez le site https://groups.google.com/d/optout .

Répondre à