FacetsTip #1: Class.subclasses

Anche se l’esempio è banale,
colgo lo spunto di Gabriele e incomincio la gloriosa…

*** Ruby-it FacetsTip Series
*** FacetsTip #1: Class.subclasses

Facile facile giusto per cominciare:

E:\prj\archeodata>irb
irb(main):001:0> class Base; end #=> nil
irb(main):002:0> class Ext1 < Base; end #=> nil
irb(main):003:0> class Ext2 < Base; end #=> nil
irb(main):004:0> require ‘facets/core/class/subclasses’ #=> true
irb(main):005:0> Base.subclasses #=> [Ext2, Ext1]
irb(main):006:0> Ext1.subclasses #=> []
irb(main):007:0> class Ext11 < Ext1; end #=> nil
irb(main):008:0> Ext1.subclasses #=> [Ext11]
irb(main):009:0> Base.subclasses #=> [Ext2, Ext11, Ext1]

In pratica vi restituisce un’array con le sottoclassi. Molto carino no?
L’unica cosa è che oltre al debugging non mi viene in mente come si possa
usare in maniera profittevole…

PS: i FacesTip presuppongono spunti e commenti sugli snippet, quindi
dateci
sotto :stuck_out_tongue:


Paolo Donà
SeeSaw | Another point of view

[email protected]

— Paolo Donà [email protected] ha scritto:

Anche se l’esempio è banale,
colgo lo spunto di Gabriele e incomincio la
gloriosa…

*** Ruby-it FacetsTip Series
*** FacetsTip #1: Class.subclasses

In pratica vi restituisce un’array con le
sottoclassi. Molto carino no?
L’unica cosa è che oltre al debugging non mi viene
in mente come si possa
usare in maniera profittevole…

esempio reale: supponi di avere una cosa tipo
activerecord, in cui dichiari tante sottoclassi di
Base per poi usarle in qualche modo automaticamente.

Invece di smanettare con #inherited per tenerne
traccia puoi usare

def Base.setup
subclasses.each do |c|
fai qualcosa con c
end
end

Oppure se hai un qualcosa in cui caricare dei plugin
(sottoclassando BasePlugin), e poi vuoi mostrarli
all’utente (per farglieli
attivare/deattivare/modificare) invece di lavorare a
livello di file puoi usare #subclasses.

Immagino che gli Smalltalker ci vedano più usi, io
sono in un caso di mezzo blub paradox :slight_smile:


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

Il giorno ven, 14/07/2006 alle 13.08 -0700, gabriele renzi ha scritto:

Oppure se hai un qualcosa in cui caricare dei plugin
(sottoclassando BasePlugin), e poi vuoi mostrarli
all’utente (per farglieli
attivare/deattivare/modificare) invece di lavorare a
livello di file puoi usare #subclasses.

Immagino che gli Smalltalker ci vedano più usi, io
sono in un caso di mezzo blub paradox :slight_smile:

Beh, nell’esempio dei Plugin Smalltalk usa #subclasses perché non ha
file con cui lavorare, visto che Smalltalk non usa file sorgenti se non
come meccanismo di backup.

Altri usi di #subclasses sono legati agli strumenti di sviluppo (class
browser etc).

Inoltre, poiché in Smalltalk le variabili di instanza sono gestite in
maniera diversa da Ruby, se si aggiunge una variabile di instanza ad una
classe che abbia sottoclassi occorre effettuare delle modifiche in tutte
le sottoclassi (tramite il metodo #subclasses o la sua variante
#allSubclasses)

Giovanni