Qualche domanda su alcune "best practices"

Ciao a tutti,

riprovo a postare le domande nella speranza che qualcuno sia in grado di
fornirmi qualche indicazione… (temo infatti che la mia email
precedente non sia stata vista da nessuno…).

Avrei alcune domande da porre a chi è un po’ più avanti di me nella
progettazione di applicazioni RoR relative alla risoluzione “DRY” di
alcuni problemi:

  1. Nella applicazione che sto progettando mi sono trovato ad avere
    parecchie tabelle (quasi tutte a dire la verità) che hanno al loro interno
    il campo is_active boolean per la determinazione della visibilità del
    record.
    Ora mi è balenata l’idea che si potrebbe spostare questa colonna su una
    tabella a parte creando una interfaccia (active) in cui implementare
    belongs_to :activable e poi scrivere in tale oggetto una serie di metodi
    per cercare tutti gli oggetti attivati o meno (magari con with_scope
    plugin) (nelle classi che la utilizzano pensavo di gestire un
    has_one :active, :as => :activable), penso che così facendo da un lato se
    un domani avessi un ulteriore flag da gestire andrei a toccare solo una
    tabella ma dall’altro canto gestendo così la cosa, la ricerca sulla
    tabella non sarà ottimizzata come fare una ricerca per il campo messo
    nella direttamente nelle tabelle… Secondo voi è follia o una buona idea
    ?

  2. E’ possibile (o consigliabile) scrivere una serie di applicazioni
    facendo in modo che ognuna gestisca solo le “resources” REST pertinenti
    a tale applicazione ?
    Es. applicazione che gestisce solo le news e applicazione che gestisce
    solo i clienti poi il legame tra news e cliente viene gestito da una
    relazione REST inter applicazione…
    Anche qui secondo voi è una follia o è fattibile ?

Grazie in anticipo e buona giornata a tutti !

un domani avessi un ulteriore flag da gestire andrei a toccare solo una
tabella ma dall’altro canto gestendo così la cosa, la ricerca sulla tabella
non sarà ottimizzata come fare una ricerca per il campo messo nella
direttamente nelle tabelle… Secondo voi è follia o una buona idea ?

Ci sono già alcuni plugin che potresti usare. Dai un’occhiata a

http://agilewebdevelopment.com/plugins/has_states
http://agilewebdevelopment.com/plugins/acts_as_state_machine
http://agilewebdevelopment.com/plugins/has_flags

Per il discorso REST tra applicazioni, non credo di aver capito bene.
Puoi
spiegare meglio perchè dovrebbero essere applicazioni diverse? In ogni
caso
senza rest puoi dare uno sguardo a questo:

http://rails-engines.org/

Mai provato però potrebbe esserti utile.

giovanni lion ha scritto:

un domani avessi un ulteriore flag da gestire andrei a toccare solo una
http://agilewebdevelopment.com/plugins/acts_as_state_machine
http://agilewebdevelopment.com/plugins/has_flags

Grazie Giovanni, non conoscevo questi plugin, credo che has_states sia
quello + vicino alle mie esigenze (anche se ho visto che si deve portare
dietro una tonnellata di altri plugin, ma lo provo senza’altro…).

Per il discorso REST tra applicazioni, non credo di aver capito bene. Puoi
spiegare meglio perchè dovrebbero essere applicazioni diverse? In ogni caso
senza rest puoi dare uno sguardo a questo:

http://rails-engines.org/

Mai provato però potrebbe esserti utile.

rails engines lo sto già usando su alcune applicazioni rails 1.2.x e ora
lo dovrò usare anche sulla nuova app rails 2.x (ho visto che è stato
rilasciato una versione apposita per 2) però la mia richiesta è un po’
diversa, in poche parole vorrei distribuire la mia applicazione su più
applicazioni (applicazione distribuita), ognuna delle quali si concentri
su una particolare problematica.

Mi spiego meglio, ammettiamo di avere una applicazione che gestisca
delle news/newsletter da esporre agli utenti di vari siti in area
pubblica e questi dati si possano anche amministrare in area riservata
mi troverei a gestire:

  • Amministrazione news/newsletter
  • Amministrazione clienti (1 cliente per ogni dominio)
  • Amministrazione utenti/ruoli per ogni cliente/dominio
  • Amministrazione security per dare accesso all’amministrazione di
    news/newsletter ai relativi ruoli utente

Ora se faccio tutto in un unica applicazione questa diventa monolitica,
estremamente legata, sarebbe veramente una figata se si potesse creare:

  • Applicazione di gestione news/newsletter (che gestisce solo le risorse
    (intendo proprio resources rest) news/newsletter/categorie/tipi ecc. sul
    db delle newsletter)
  • Applicazione di gestione clienti (che gestisce solo le risorse
    clienti/categorie/tipi ecc. sul db dei clienti)
  • Applicazione di gestione sicurezza (che gestisce solo le risorse
    utenti/ruoli/moduli applicativi con permessi-scadenze ecc. sul db dei
    sicurezza)

Questo tipo di applicazioni in linea del tutto teorica sarebbe anche
fattibile crearle guardandole da un punto di vista di REST, quando poi
la risorsa news ha collegato un id cliente (customer_id) potrei mappare
con il client rest la risorsa che mi espone l’applicazione dei clienti
così da formare una suite di applicazioni che lavorano scambiandosi
risorse; mi rendo conto però che così facendo a livello di model puro
(non rest) perderei completamente la possibilità di fare cose carine
tipo belongs_to :customer oppure fare un News.find(:all, :include =>
:customer) per poter fare ricerche in cui la condizione la metto nella
tabella in join…; oltretutto mi rendo anche conto che così facendo
andrei incontro anche ad un problema non da poco: le transazioni
distribuite, urca non ci avevo pensato, si potrebbe risolvere il
problema lavorando con un solo db, ma allora se lavoro su un solo db
perchè non fare un’unica applicazione ?

Ho come l’impressione che questo tipo di visione da un lato sia
teoricamente possibile, dall’altro sia di difficile implementazione per
le ragioni sopra esposte…

Chiedevo quindi se qualcuno si è mai cimentato in uno sviluppo di questo
tipo…


Ml mailing list
[email protected]
http://lists.ruby-it.org/mailman/listinfo/ml


Gianluca T.
TreNetMediaMaster S.r.l.
The Internet Technology Company
Telefono +39(049)776196
Fax +39(049)8087806
Visit us @: http://www.trenet.it - http://www.mediamaster.it
e-mail me @: [email protected]

Gianluca T. wrote:

… in poche parole vorrei distribuire la mia applicazione su pi�
applicazioni (applicazione distribuita), ognuna delle quali si concentri
su una particolare problematica.

Mi spiego meglio, ammettiamo di avere una applicazione che gestisca
delle news/newsletter da esporre agli utenti di vari siti in area
pubblica e questi dati si possano anche amministrare in area riservata
mi troverei a gestire:

  • Amministrazione news/newsletter
  • Amministrazione clienti (1 cliente per ogni dominio)
  • Amministrazione utenti/ruoli per ogni cliente/dominio
  • Amministrazione security per dare accesso all’amministrazione di
    news/newsletter ai relativi ruoli utente

Ora se faccio tutto in un unica applicazione questa diventa monolitica,
estremamente legata, sarebbe veramente una figata se si potesse creare:

  • Applicazione di gestione news/newsletter (che gestisce solo le risorse
    (intendo proprio resources rest) news/newsletter/categorie/tipi ecc. sul
    db delle newsletter)
  • Applicazione di gestione clienti (che gestisce solo le risorse
    clienti/categorie/tipi ecc. sul db dei clienti)
  • Applicazione di gestione sicurezza (che gestisce solo le risorse
    utenti/ruoli/moduli applicativi con permessi-scadenze ecc. sul db dei
    sicurezza)

Questo tipo di applicazioni in linea del tutto teorica sarebbe anche
fattibile crearle guardandole da un punto di vista di REST, quando poi
la risorsa news ha collegato un id cliente (customer_id) potrei mappare
con il client rest la risorsa che mi espone l’applicazione dei clienti
cos� da formare una suite di applicazioni che lavorano scambiandosi
risorse; mi rendo conto per� che cos� facendo a livello di model puro
(non rest) perderei completamente la possibilit� di fare cose carine
tipo belongs_to :customer oppure fare un News.find(:all, :include =>
:customer) per poter fare ricerche in cui la condizione la metto nella
tabella in join…; oltretutto mi rendo anche conto che cos� facendo
andrei incontro anche ad un problema non da poco: le transazioni
distribuite, urca non ci avevo pensato, si potrebbe risolvere il
problema lavorando con un solo db, ma allora se lavoro su un solo db
perch� non fare un’unica applicazione ?

Ho come l’impressione che questo tipo di visione da un lato sia
teoricamente possibile, dall’altro sia di difficile implementazione per
le ragioni sopra esposte…

Chiedevo quindi se qualcuno si è mai cimentato in uno sviluppo di questo
tipo…

Avere un controllo completo sul dominio del problema e’ fondamentale per
estrarne il meglio.
Partizionare il dominio comporta penalizzazioni alle prestazioni e alla
flessibilità .

Considera per esempio la tua idea di separare la gestione sicurezza in
un’altra applicazione.
La sicurezza e’ una funzionalita’ trasversale all’applicazione.

Praticamente ogni azione, prima di essere eseguita, richiede un
controllo di autorizzazione.
Non solo.
Spesso anche oggetti di view dipendono dalla sicurezza: pensa alle voci
di menu che vorresti visibili solo all’amministratore, per fare un
esempio.
Puoi permetterti di accedere via web al gestore di sicurezza una o piu’
volte ad ogni azione?

Talora invece ci possono essere altre esigenze e REST ci permette
qualcosa altrimenti molto piu’ difficile.

Ti accenno ad una mia esperienza.
La nostra applicazione doveva gestire contatti, e piuttosto che
implementare ex-novo la gestione contatti, abbiamo preferito utilizzare
le API REST di Highrise (http://www.highrisehq.com).
I tempi di sviluppo si sono ridotti notevolmente, ma abbiamo sacrificato
una buona fetta di prestazioni, sia perchè devi andare sulla rete a
prendere dati, sia perchè rinunci a tutte le ottimizzazioni che il
database permette per reccogliere dati relazionati.

Se hai una porzione della tua applicazione che vedi come una componente
verticale “isolabile” (low coupling, high cohesion) puoi considerare
l’approccio external-REST, ma solo se ti porta grandi benefici.

Se hai controllo sul codice, l’approccio migliore e’ sicuramente quello
dei plugin.
Anche se forse Rails non ha una gestione di componenti all’altezza di
Django (Python) o Seaside (Smalltalk), si possono ottenere elevati
livelli di riusabilita’.

Claudio Petasecca D. ha scritto:

pubblica e questi dati si possano anche amministrare in area riservata

fattibile crearle guardandole da un punto di vista di REST, quando poi
problema lavorando con un solo db, ma allora se lavoro su un solo db
Avere un controllo completo sul dominio del problema e’ fondamentale per
Non solo.
La nostra applicazione doveva gestire contatti, e piuttosto che

Se hai controllo sul codice, l’approccio migliore e’ sicuramente quello
dei plugin.
Anche se forse Rails non ha una gestione di componenti all’altezza di
Django (Python) o Seaside (Smalltalk), si possono ottenere elevati
livelli di riusabilita’.

Ciao Claudio, ti ringrazio moltissimo dell’intervento, in effetti, più
ragiono sulla problematica e più mi accorgo che probabilmente è meglio
che vada tranquillo creando una applicazione completa di tutte le sue
parti (che espongo anche come risorse così le riutilizzo in seguito su
altri progetti); magari seguo la strada dei plugin così almeno cerco di
sviluppare il + DRY possibile…

Grazie ancora !

cercare tutti gli oggetti attivati o meno (magari con with_scope

dietro una tonnellata di altri plugin, ma lo provo senza’altro…).
Prego :slight_smile:

(intendo proprio resources rest) news/newsletter/categorie/tipi ecc. sul
con il client rest la risorsa che mi espone l’applicazione dei clienti
così da formare una suite di applicazioni che lavorano scambiandosi
risorse; mi rendo conto però che così facendo a livello di model puro
(non rest) perderei completamente la possibilità di fare cose carine
tipo belongs_to :customer oppure fare un News.find(:all, :include =>
:customer) per poter fare ricerche in cui la condizione la metto nella
tabella in join…; oltretutto mi rendo anche conto che così facendo
andrei incontro anche ad un problema non da poco: le transazioni
distribuite, urca non ci avevo pensato, si potrebbe risolvere il
problema lavorando con un solo db, ma allora se lavoro su un solo db
perchè non fare un’unica applicazione ?

Forse questo può esserti utile se decidi di intraprendere questa strada:

http://jamesgolick.com/resource_controller/rdoc/index.html

Ho come l’impressione che questo tipo di visione da un lato sia

teoricamente possibile, dall’altro sia di difficile implementazione per
le ragioni sopra esposte…

Chiedevo quindi se qualcuno si è mai cimentato in uno sviluppo di questo
tipo…

Personalmente non ancora, ma credo che la via dell’ActiveResource sia
promettente.
Sorry, ma ora il lavoro mi chiamaaaaaaaa…