Newsgroup: it.comp.lang.visual-basic
Titolo: [TUTORIAL] Spiegatemi il 3tier...con calma eh! son duro!

Forse è meglio che posti come nuovo thread una domanda ....
Riconosco di essere ignorante...e più avanzo e più mi sembra di
regredire....
HPL e altri mi facevano riflettre quanto poco OOP fossero i miei
programmi...per quanto abbastanza ben manutenibili.
Mi piacerebbe fare lo "step" successivo...
Fino ad ora la concorrenza l'ho gestita a "caz di can" (opss scusa java!)
lock ottimistico e "star agli eventi"
ma riconosco che è una fatica immane e da fare tutte le volte (anche se
oramai le sub/funct son quelle)
classi il wodkino ne ha fatte sempre ben poche (2 o 3!)
Ho comprato libri...ma poi mi scocciavo...o non riuscivo a seguire....
io ho capito che se in una ipotesti
MSDE + 3 client
SE
io ponessi di mezzo un serverAcivex avrei fatto una architettura
3tier...sbaglio?
il client ha l'interfaccia
il serverActive la logica di connessione  (business?)
il database la logica business?(no vero?)...insomma ha le stored
ma nell'ipotesi delle concorrenza... non è il motoreDB che segnala il
conflitto?...si vero?
e questo viene intercettato dal server che gestisce le richieste di +
client?...ecco son già perso...anche col libro qui mi perdo...
Avete link e/o libri e/o documentazione da consigliarmi?..più che altro
esempi..perchè dall'esempio riesco a capire più facilmente...
Poi sto cavolo di libro (quello rosso consigliato anche sul ng
"client/server ....etc etc") complica tutto parlando che  il componente
3tier va schierato in MTS....argh! (ossigeno presto....dottore lo stiamo
perdendo!!!!)
purtroppo su questo argomento se ne parla poco sia nel ng che in
chat...perchè?
a) Non serve ad un cavolo...è solo tempo perso!
b) Son pochi quelli che lo padroneggiano
nell'ipotesi b)
rispettosamente potreste indicarmi il percorso per "capetoste" come me?
grazie per la disponibilità!

 grazie per la disponibilità!
ankio, ankio
j.wodka

 > 3tier...sbaglio?
Mi sembra che il modo migliore di avere degli standard (connessione al db,
ecc.) è quello di costruire una o più classi e copiarle in successivi
progetti.
Meno dll , ActiveX , ocx , uno utilizza e meno difficoltà si incontrano
sia nella costruzione, installazione , manutenzione e nelle successive
modifiche.
giuseppeD
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 ha scritto
grazie delle dritte.
proviamo...
ciao, a.

 client?
Le logiche possono essere molteplici, fondamentalmente:
1) puoi intervenire _dopo_ il conflitto, risolvendolo
in base a priorità cronologiche o basate su meccanismi
diversi
2) puoi intervenire _prima_ del conflitto assegnando ai diversi
client le priorità di accesso ai dati in base a...
Ma questo _non_ è spcifico di un'architettura 3tier,
nulla ti vieta di gestire gli stessi pronblemi a livello
client (attraverso codice) e/o a livello server (attraverso le stored).
La "comodità" dell'approccio 3tier è che _potenzialemente_
rende indipendente la logica di business dall'interfaccia e
dallo storage dei dati.
Detto ciò, personalmente, tendo a implementare insieme
interfaccia e logica, e affidare al livello database solo compiti
di storage e di manutenzione globale (backup, replica, procedure batch).
Ma è solo gusto personale.
ciao
ugo

 Ma è solo gusto personale.
CUT
ESEMPI! ESEMPI!
.....(fumata di meningi)
Ipotizzo :
Allora il server avrebbe il suo metodo
ConnDB
 per connettersi al database
e
RendiRS(sql as string)
per eseguire una query e farsi dare un recordset dal motoreDB
oppure sta roba rimarrebbe solo di suo appannaggio? (credo sia solo sua no?i
client manco dovrebbero avere il riferimento ad  ADO no??)
Invece al client esporrebbe una classe? Un oggetto?
RendiMovimento(codCliente,Nomeclient) as Variant
quindi potrebbe essere così?
Tmov as variant
Tmov=RendiMovimento(001,"Wodka")
...e poi
txtImportoMov.text=Tmov(1)
etc etc
l'ho capita giusta?
I dati per riempire il client vengono solo ed esclusivamente richiamando
metodi del server
in modo di fregarsene di accessi connessioni e concorrenze no?
...sbaglio?
Ganzo!.....a metterlo in pratica sarà il difficile!
quindi le varie interfaccie...ops i vari client chiamerebbero
questo metodo ed il server si occupa di gestire concorrenza e reperimento
dati

Wodka4U <marc_AnTiSpaM_o@ma_1Togliere451_rtek.it> wrote in message
WmDX8.73443$
vm5.2...@news2.tin.it
...Leggo lunedě la risposta!
"Wodka on the Highway"
...tutti al mare...tutti al mare ...a mostrar le chiappe chiare...
p.s.
se i black colored hanno nuovi cd vi informerň!

modifiche.
??? Perché, una stessa classe copiata ed incollata in 8 progetti diversi
è più semplice da manutenere? Non credo proprio, anzi...
Ciao,
Moreno
-- 
sirri at morenosoft dot com
Moreno Sirri VB Site - 
http://www.msvbsite.net
---------------------------------------------------------------------------
Le risposte alle tue domande le trovi sul Sito Comune di questo NewsGroup:
 
http://www.it-lang-vb.net
---------------------------------------------------------------------------

Ma č solo gusto personale.
Piů che altro presumo dettato dalle tue specifiche esigenze. Se la bl
venisse utilizzata, anche solo in parte, da altre ui (*) allora credo
che il gusto personale lascerebbe spazio... :-)
(*) non necessariamente un'altra appl.


"Moreno Sirri" ha scritto nel messaggio
Torna More', 'sto niuggě aspiett'a ttč !
Bye, G.

 scusa java!) lock ottimistico e "star agli eventi"
[cut]
Qui ti posso aiutare poco perché i database (fortunatamente)
non sono il mio campo.
Però ti posso fare un esempio di cosa intendessi quando
parlavo a Lupo. Si tratta di design a livello più basso di
quello del three-tier.
Appena ho un po' di tempo butto giù due righe (tanto prima di
lunedì non leggi i messaggi...).
Ciao.
--
BSD is for UNIX-lovers -- linux is for Windows-haters.

 (*) non necessariamente un'altra appl.
Se la ui non è in un'altra app, meglio una classe
interna a una esterna, richiamata tutte le volte che vuoi...
ciao
ugo

interna a una esterna, richiamata tutte le volte che vuoi...
Certo, ma chi dice che la distinzione tra ui, bl e dl non ci possa
essere, anche se a questo punto molto sottile e fondamentalmente logica
piů che pratica, anche all'interno di una stessa applicazione (chiamala,
se vuoi, "componente")? Emoziooni... :-)


 se vuoi, "componente")? Emoziooni... :-)
certo, ma non parlerei in tal caso di 3tier...
ciao
ugo

Scusate il ritardo, ma ho avuto molto da fare...
Cerco di spiegare con un esempio, volutamente semplice ed
incompleto, per evidenti ragioni di spazio e tempo, cosa io
intendessi
quando parlavo di dare un design più OO, per rendere più
facilmente modificabili ed estendibili gli applicativi
sviluppati. Non utilizzerò ADO e DAO (anche se il discorso era
nato proprio su questi) per l'esempio perché, come ho già
detto, non lavoro sui database, per cui finirei sicuramente
per scrivere qualche imprecisione o sarei costretto a
documentarmi meglio e, purtroppo, in questo momento non ne ho
il tempo.
Visto che in questo periodo sto, nel (poco) tempo libero,
sviluppando (non in VB però) un newsreader (a dire la verità
sono ancora alla fase "su carta"), prendo spunto da questo per
l'esempio:
supponiamo di avere una finestra che debba visualizzare un
insieme di messaggi.
Quale è il tradizionale approccio VB (perfettamente in
sintonia con la "filosofia" RAD)?
Creare una nuova finestra, aggiungervi il componente che
abbiamo deciso di utilizzare per la visualizzazione dei
messaggi, in questo caso una ListView, e scrivere tutto il
codice che ci serve nella form.
Dal punto di vista del funzionamento nulla da eccepire, ma
supponiamo che, portato avanti lo sviluppo dell'applicativo ed
aggiunte nuove funzionalità, ci si renda conto che la ListView
non sia più adatta a visualizzare i messaggi e che sia
necessario (per esempio) un controllo WebBrowser (per poter
visualizzare dell'html). Ecco che i limiti degli ambienti RAD
vengono a galla. Un simile cambiamento richiede modifiche
molto pesanti del codice della form, una gran quantità di
copia-incolla, un debug ex novo dell'applicativo, ecc... e
sicuramente insidiosi bug.
Eppure un design più oculato (ma decisamente in antitesi con
la "filosofia" RAD) all'inizio avrebbe reso possibile un
cambiamento simile modificando semplicemente *UNA* riga di
codice della form. Come?
Occorre stabilire l'interfaccia (funzioni e proprietà) che il
componente che si occupa di visualizzare i messaggi deve
esporre ai clienti (segue esempio minimale e buttato giù di
corsa):
<code>
'file MsgPresentation.cls
Public Sub Init(ByRef parent As Form)
End Sub
Public Function AddMessage(ByVal msg As String) As Long
End Function
Public Sub RemoveMessage(ByVal msgID As Long)
End Sub
Public Function FindMessage(ByVal msgID As Long) As String
End Function
Public Property Get Height() As Long
End Property
Public Property Let Height(ByVal vNewValue As Long)
End Property
Public Property Get Width() As Long
End Property
Public Property Let Width(ByVal vNewValue As Long)
End Property
Public Property Get Top() As Long
End Property
Public Property Let Top(ByVal vNewValue As Long)
End Property
Public Property Get Left() As Long
End Property
Public Property Let Left(ByVal vNewValue As Long)
End Property
</code>
A questo punto non ci resta che scrivere l'implementazione:
<code>
'file MsgList.cls
Implements MsgPresentation
Private WithEvents ctl_ As ListView
Private parent_ As Form
Private Sub MsgPresentation_Init(ByRef parent As Form)
    Set parent_ = parent
    Set ctl_ =
parent_.Controls.Add("MSComctlLib.ListViewCtrl.2", "ctl_")
    ctl_.Visible = True
End Sub
Private Property Get MsgPresentation_Height() As Long
    MsgPresentation_Height = ctl_.Height
End Property
'[...] ecc...
</code>
Ora il codice della form diventa:
<code>
'file form1.frm
Private msgCtl_ As MsgPresentation
Private Sub Form_Load()
    Set msgCtl_ = New MsgList
    msgCtl_.Init Me
End Sub
Private Sub Form_Resize()
    With msgCtl_
        .Height = Me.ScaleHeight - 20
        .Width = Me.ScaleWidth - 20
    End With
End Sub
'[...] ecc...
</code>
A questo punto per passare dal controllo ListView a quello
WebBrowser è sufficiente scrivere una nuova classe che
implementi l'interfaccia MsgPresentation e che aggiunga alla
form il controllo WB, e nella form è sufficiente cambiare la
riga "Set msgCtl_ = New MsgList" in
"Set msgCtl_ = New MsgWebBrowser".
In questa maniera abbiamo reso possibile passare da un
controllo all'altro in modo decisamente indolore.
Lo stesso discorso, con un po' di esperienza, si può applicare
anche ad ADO e DAO, in modo da rendere possibile l'utilizzo di
una o l'altra tecnologia indifferentemente, con la modifica di
una sola riga (o comunque di pochissime righe) di codice
dell'applicativo.
Poi, per eliminare il fastidioso (e pericoloso) inconveniente
di doversi ricordare di inizializzare le classi, possiamo
utilizzare il pattern Factory:
