Ruby e Overloading

On Fri, 23 Jun 2006 10:12:34 +0200, Stefano C. wrote:

Beh, ci sara’ un motivo per cui inizialmente esistevano i
singoli metodi e poi a un certo punto hanno deciso di
consolidarli in uno solo…

Tecnicamente esistono tutt’ora, se vai a vedere come girano sotto il
cofano.
Solo che spesso non fanno la cosa “ovvia”, ecco tutto.

Oltretutto, cosa ti impedisce di aggiungere a ActionController::Base il
tuo metodo “render_yaml” e poi chiamarlo dai tuoi controller? Questo
e’ il punto che piu’ mi sfugge del tuo scazzo :slight_smile:

render in se e per se viola l’OCP. Questo mi pare abbastanza evidente.
Il fatto che poi ci si possa girare attorno, non significhi che ci sia
la violazione. E non mi sembra improbabile ritenere che sia un metodo
che uno possa volere estendere. Poi per carità, funzionare funziona e
tutto. ma…

Model.find(1,2,3)
Model.find([1,2,3])
Uguali :slight_smile:

Ok. Diciamo che Ruby rende facilissimo fare collassare i concetti.
Diciamo che più uno vede “magic” (imho) e più gli viene il dubbio che
una cosa sia non necessariamente figa.

Voglio dire… al di la del fatto che funziona (e quindi non protesto)
siamo sicuri che avere i modificatori :first e :all che modificano il
modo (radicalmente) in cui find funzioni non sia meglio di avere un

find che prende gli id
find_all che prende condizioni
find_first (come sopra)

Mi sembra “magia gratuita” visto che find non è altro che

  def find(*args)
    options = extract_options_from_args!(args)
    validate_find_options(options)
    set_readonly_option!(options)

    case args.first
      when :first then find_initial(options)
      when :all   then find_every(options)
      else             find_from_ids(args, options)
    end
  end

Beh, mi pare molto semplice (e pure intuitivo): se gli chiedi di
trovare UN record, ti
ritorna un record; se gli chiedi di trovare un elenco di record, ti
ritorna un elenco di record.
Io con Rails ci lavoro quasi tutti i giorni (negli altri purtroppo mi
tocca PHP) e devo dire
che “fila” come poche cose al mondo.

Il fatto che una cosa fili, non significa che ci si possa chiedere del
perchè di certe scelte.

Non ho seguito l’intero discorso ma mi hanno colpito i ragionamenti sul
framework e mi intrometto. Penso che con ruby dobbiamo ripensare un
attimo
a cosa vuol dire fare framework e cosa significa
estendibilità.
Ad esempio, mentre in java tendevo a costruire meccanismi di
estendibilità
nel framework, usando tecniche spesso prese in prestito dai patterns o
injection of control, in Ruby mi accorgo di fare scelte che prediligono
la
sempicità espressiva del sistema as-is, non come potrebbe esseere. Mi
appoggio molto di più poi alle capacità del linguaggio e non del framework
per estenderlo.

A voi non succede? che ne pensate?

Con il modello di programmazione di ruby secondo me siamo ancora in
periodo
di esplorazione (di certo per quanto mi riguarda) e non è facile capire
quale siano le scelte stilistiche più valide.

On 6/23/06, Stefano C. [email protected] wrote:

molto probabilmente
“render” sarebbe dichiarato final: obietteresti anche in questo caso?
Ma le chiacchere stanno a zero: qualcuno e’ in grado di produrre una
caso realistico
in cui la soluzione migliore a un problema richiede di estendere
il metodo
“render”? Cosi’ poi appoggiamo la discussione su qualcosa di concreto
e non sulla teoria :slight_smile:


Chiaroscuro

Liquid Development: http://liquiddevelopment.blogspot.com/

On Fri, 23 Jun 2006 14:56:49 +0200, chiaro scuro wrote:

Non ho seguito l’intero discorso ma mi hanno colpito i ragionamenti sul
framework e mi intrometto. Penso che con ruby dobbiamo ripensare un attimo
a cosa vuol dire fare framework e cosa significa estendibilità.

Si quoto. In effetti in un altro thread mi stavo giusto interrogando su
qualcosa del genere. In particolare pensavo all’inopportunità di avere
una soluzione classica ad un problema di violazione dell’OCP rispetto
invece ad un semplice uso del dinamismo di Ruby (anche se nel caso
parlando non sarebbe nemmeno tanto dinamismo di Ruby quanto quello di
Rails).

A voi non succede? che ne pensate?

Vero. Viene naturale.

Con il modello di programmazione di ruby secondo me siamo ancora in periodo
di esplorazione (di certo per quanto mi riguarda) e non è facile capire
quale siano le scelte stilistiche più valide.

Vero. Spero solo che il buon senso che fino ad ora ha avuto la comunità
dei rubysti permanga. Le potenzialità sono grandissime, ma anche il
rischio di abusarne. Perl è li a dimostrarlo.

On Jun 19, 2006, at 1:19 PM, Enrico F. wrote:

Già che ci sono… c’è modo di fare renderizzare un rjs tramite
render?
Ho già il codice in tale rjs e non vorrei passare a

render :update do |p|
bla bla
end

render :template => ‘my/template’

render :file => ‘/path/to/my/template.rjs’

render :inline => “page.visual_effect :highlight ‘notice’”, :type
=> :rjs

render :update do |page|
page.visual_effect :highlight ‘notice’
end


Stefano C.
[email protected]

On Fri, 23 Jun 2006 15:55:27 +0200, Stefano C. wrote:

render :template => ‘my/template’
render :file => ‘/path/to/my/template.rjs’
render :inline => “page.visual_effect :highlight ‘notice’”, :type => :rjs
render :update do |page|
page.visual_effect :highlight ‘notice’
end

La versione che a me serviva è

render :action => ‘remote_show’

comunque funziona.

— Stefano C. [email protected] ha scritto:

ciao stefano, rispondo in una mail a due tuoi messaggi

Beh, ci sara’ un motivo per cui inizialmente
esistevano i
singoli metodi e poi a un certo punto hanno deciso
di consolidarli in uno solo…

perché “fanno cose simili” è quello che mi hanno detto
al tempo. La mia opinione: si divertono così tanto ad
usare i simboli che hanno voluto metterli anche
lì.

Mentre se ci fossero
normali metodi potrei aggiungere il mio
render_yaml obj.to_yaml

Scusa ma qui non ti seguo (diciamo che l’esempio
scelto non
e’ proprio dei piu’ felici…). Cosa dovrebbe fare
“render_yaml”?

ok, ti faccio due esempio con find che mi sono
capitati: aggiungi un metodo che trova l’ultimo o gli
ultimi inserimenti. O un metodo che trova tutti gli
attributi, invece del tipico
attrs=Obj.find(:all).map {|x| x.attribute } che oltre
a occupare uno sproposito di memoria e di banda è
parecchio più lento che fre l’operazione nel dbms.

Ricordati che stai parlando di uno
dei metodi
fondamentali (e uno dei piu’ invocati) di un
framework.

vero, per quello voglio risparmiare un carattere ogni
volta :wink:

Un framework non si estende genericamente facendo
l’override dei metodi
ma sfruttando i meccanismi che esso stesso ti mette
a disposizione (che
in alcuni casi possono coincidere con l’override
dei metodi - ma
“render” non rientra tra questi).

si, peccato che in questo caso non ne esista uno
pulito

Il metodo giusto
per estender
“render” e’ di integrare il tuo sistema di template
(come si fa con
Liquid, Radius,
Amrita etc.)

sono cose, e livelli di granularità, differenti

Oltretutto, cosa ti impedisce di aggiungere a
ActionController::Base il
tuo metodo “render_yaml” e poi chiamarlo dai tuoi
controller? Questo
e’ il punto che piu’ mi sfugge del tuo scazzo :slight_smile:

il fatto che in questo modo è incoerente con tutto il
resto. Lo so, sono piccole cose. Ma dato che non
riesco a vedere neanche un vantaggio, un piccolo
svantaggio sposta la bilancia da una parte.

riunite insieme.
e infatti l’ho detto, sono io ad essere scemo, tutti
amano i metodi collassati in uno solo. Io lo so che la
penso diversamente dal mondo su certe cose, sono
sfigato ma cosciente e campo sereno :slight_smile:

E #render non è nemmeno pessimo… ma cavolo capire
ad
occhio la differenza tra

Model.find(1,2,3)
Model.find([1,2,3])

Uguali :slight_smile:

Model.find(1) e Model.find([1]) è
una follia.

si, lo so cosa fanno ma sinceramente ho qualche
piccolissimo dubbio che senza aver letto la
documentazione tu sia stato in grado di intuire la
differenza come è intubile ad esempio per
Message.find_all. Io quantomeno non l’ho fatto.

Snippo dall’altra mail:

Se Rails fosse
scritto in Java
molto probabilmente
“render” sarebbe dichiarato final: obietteresti
anche in questo caso?

io si, obietterei a qualsiasi cosa fosse dichiarata
final, e già lo faccio. Chi scrive un framework o una
libreria ha tutto il diritto di farsela come vuole, è
chiaro, solo che non sa come la voglio io.
Qualsiasi final è un limite all’adattabilità del
sistema ai miei bisogni.
Ma lo so, ragiono da appassionato di linguaggi
dinamici, alle volte temo di diventare un nuovo james
robertson.

Ma le chiacchere stanno a zero: qualcuno e’ in grado
di produrre una
caso realistico
in cui la soluzione migliore a un problema
richiede di estendere
il metodo
“render”?

boh, quello proposto da giuliano uboldi due giorni fa
che è stato risolto ridefinendolo? Per me non c’è
bisogno di un esempio, io vedo i sorgenti di render e
mi sembrano orrendi. Sarà che programmavo in ruby
prima di vedere rails (come massimilano mirra, appunto
:slight_smile:

Cosi’ poi appoggiamo la discussione su
qualcosa di concreto
e non sulla teoria :slight_smile:

eh no così mi smosci, il bello è fare discorsi campati
per aria, sennò che ci perdevo tempo a fare sulle
mailing list :wink:

PS
a me piace un sacco rails, comunque :slight_smile:
PPS
mi awaizzo per qualche tempo, in caso rispondessi


icq: #69488917
blog it: http://riffraff.blogsome.com
blog en: http://www.riffraff.info

Chiacchiera con i tuoi amici in tempo reale!
Yahoo Search - Ricerca nel Web | Motore di Ricerca

On Jun 23, 2006, at 7:43 PM, gabriele renzi wrote:

ok, ti faccio due esempio con find che mi sono
capitati: aggiungi un metodo che trova l’ultimo o gli
ultimi inserimenti.

intendi:
Model.find(:first :order => ‘created_on desc’)
?

O un metodo che trova tutti gli
attributi, invece del tipico
attrs=Obj.find(:all).map {|x| x.attribute }

meglio:
attrs = Model.find(:all).map(&:attribute)

:slight_smile:

che oltre
a occupare uno sproposito di memoria e di banda è
parecchio più lento che fre l’operazione nel dbms.

Credo proprio che questo sia uno dei casi in cui
sia necessario andare “to the metal”, anche perche’
usare ActiveRecord per estrarre singoli attributi
non mi pare proprio la cosa piu’ intelligente da fare :slight_smile:
Il metodo “connection” e’ li’ proprio per questi casi.

si, peccato che in questo caso non ne esista uno
pulito

Il fatto che non esista potrebbe essere dovuto al fatto
che nelle intenzioni degli autori non dovrebbe esistere…

sono cose, e livelli di granularità, differenti

eh, ma se non mi fai degli esempi concreti come faccio
a darti ragione? :slight_smile:

il fatto che in questo modo è incoerente con tutto il
resto. Lo so, sono piccole cose. Ma dato che non
riesco a vedere neanche un vantaggio, un piccolo
svantaggio sposta la bilancia da una parte.

Il vantaggio in termini di “lavoro mentale” per me e’
lampante, e credo che sia cosi’ per molti, altrimenti
ci sarebbe stata un’insurrezione :slight_smile:

io si, obietterei a qualsiasi cosa fosse dichiarata
final, e già lo faccio. Chi scrive un framework o una
libreria ha tutto il diritto di farsela come vuole, è
chiaro, solo che non sa come la voglio io.
Qualsiasi final è un limite all’adattabilità del
sistema ai miei bisogni.

Ma un sistema infinitamente adattabile a bisogni non previsti
da chi l’ha scritto non e’ un piu’ un “sistema”, non trovi?
E inoltre, ripeto, qui stiamo parlando di framework e non
di librerie. Un framework e’ “giusto” che abbia qualche
rigidita’ che gli permetta di mantenere la sua “forma”; una libreria
deve essere estendibile al massimo perche’ deve assumere
la forma dell’applicazione in cui e’ usata.

boh, quello proposto da giuliano uboldi due giorni fa
che è stato risolto ridefinendolo?

Veramente io l’ho risolto con un before_filter :slight_smile:

Per me non c’è
bisogno di un esempio, io vedo i sorgenti di render e
mi sembrano orrendi. Sarà che programmavo in ruby
prima di vedere rails (come massimilano mirra, appunto
:slight_smile:

ah beh, se e’ per quello anch’io. ma ammetto di non leggere
spesso i sorgenti di rails :slight_smile:


Stefano C.
[email protected]

On Jun 29, 2006, at 12:23 PM, gabriele renzi wrote:

intendo
Model.find(:all, :order => ‘created_on DESC’, :limit=>
num)

scritto come
Model.find_last(n)

E come farebbe “find_last” a sapere in base a quale criterio deve
cercare gli ultimi n record?
Va bene che Ruby e’ espressivo e Rails ancora di piu’, ma qui siamo
nel campo della programmazione paragnosta :slight_smile:
Oppure non ho capito io cosa volevi dire…

Cmq facciamo un esempio concreto:

class Post < ActiveRecord::Base
belongs_to :blog
end

class Blog < ActiveRecord::Base
has_many :posts do
def find_latest(n)
find(:all, :order => ‘created_on DESC’, :limit => n)
end
end
end

posts = Blog.find_by_name(‘My blog’).posts.find_latest(10)

per me e’ quasi poesia :slight_smile:

in ogni caso nessuno ti impedisce di fare:

class ActiveRecord::Base
def find_latest(n, sort_on=‘created_on’)
find(:all, :order => “#{ sort_on } desc”, :limit => n)
end
end

Allargando il discorso un attimo, se nel mio codice vedo che metodi
“tuttofare” come “find” e “render”
vengono chiamati parecchie volte con molte varianti, i casi possono
essere due: o non ho ancora rifattorizzato,
oppure non ho rifattorizzato abbastanza :slight_smile:
Una volta che tutte queste chiamate specializzate sono “nascoste” nel
vocabolario dell’applicazione (perche’
in Ruby e ancora di piu’ in Rails ogni applicazione scritta “bene”
genera il suo particolare DSL, alla lunga),
la differenza fra “find_all” e “find(:all)” diventa veramente
irrilevante. Buona giusto per una discussione
da ML :slight_smile:

— Stefano C. [email protected] ha scritto:

?
intendo
Model.find(:all, :order => ‘created_on DESC’, :limit=>
num)

scritto come
Model.find_last(n)

O un metodo che trova tutti gli
attributi, invece del tipico
attrs=Obj.find(:all).map {|x| x.attribute }

meglio:
attrs = Model.find(:all).map(&:attribute)

si, to_proc è fico, anche se io preferivo un approccio
con gli unbound method :slight_smile:

casi.
infatti, è una stupidaggine creare il metodo, il fatto
è che non è integrato. Per dirla da fighetti è
impossibile adattare il linguaggio al mio dominio
appplicativo ottenendo delle sinergie tra
metaprogrammazione e domain driven design, o una cosa
del genere :wink:

si, peccato che in questo caso non ne esista uno
pulito

Il fatto che non esista potrebbe essere dovuto al
fatto
che nelle intenzioni degli autori non dovrebbe
esistere…

già. Per me sbagliano.

sono cose, e livelli di granularità, differenti

eh, ma se non mi fai degli esempi concreti come
faccio
a darti ragione? :slight_smile:

te ne ho fatti, solo che evidentemente non sono
riuscito a spiegarti quello che intendevo, scusa :frowning:

ci sarebbe stata un’insurrezione :slight_smile:
ho difficoltà a pensare che “inserisci underscore
nome” sia più arduo da ricordare di “inserisci spazio
nome uguale maggiore”, ma capisco quello che dici.
Ancora una volta, te l’ho detto sono io ad essere
strano :slight_smile:

previsti
da chi l’ha scritto non e’ un piu’ un “sistema”, non
trovi?

no, e comunque non vorrei usare rails per programmare
i lego, semplicemente vorrei che le cose venissero
lasciate semplici invece di essere complicate quando
non serve.

E inoltre, ripeto, qui stiamo parlando di framework
e non
di librerie. Un framework e’ “giusto” che abbia
qualche
rigidita’ che gli permetta di mantenere la sua
“forma”; una libreria
deve essere estendibile al massimo perche’ deve
assumere
la forma dell’applicazione in cui e’ usata.

si, semplicemente questa non è una rigidità del
framework (i.e. mi pare non si possano più definire
due modelli nello stesso file da qualche versione di
rails), solo un fastidio aggiunto tanto per.


icq: #69488917
blog it: http://riffraff.blogsome.com
blog en: http://www.riffraff.info

Chiacchiera con i tuoi amici in tempo reale!
Yahoo Search - Ricerca nel Web | Motore di Ricerca

1abd79f7cc3794008bec7f39592d5b9b

2005-09-20.html
http://coxup.trudnodostupna.info/2005-08-07.html
2005-08-08.html


2005-08-05.html

http://spanishbooksinprint.imikkladanno.info/2005-07-10.html
2005-07-23.html


2005-09-03.html

http://simongroupinc.perekatinetuzaba.info/2005-08-18.html 2005-08-13.html


2005-09-20.html
http://sitele.perekatinetuzaba.info/2005-09-15.html

2005-07-08.html


2005-07-17.html

http://s-zimmermann.wertzaobtara.info/2005-08-23.html
2005-09-05.html


2005-09-25.html

http://memory4cisco.wertzaobtara.info/2005-09-19.html
2005-08-28.html


2005-07-05.html

http://barbarella-carousel.lopatajovtara.info/2005-09-12.html 2005-08-13.html


2005-08-24.html

http://deadvoltage.pratereoutdra.info/2005-09-07.html
2005-09-24.html

62391812410bcc1759701cfaa7e33dba