Comunicare intre componente

Intrebari despre Flex

Comunicare intre componente

Mesajde alphagon » Lun Oct 12, 2009 1:15 pm

Salut din nou! Problema e mai mult de "cum ar trebui conceputa" treaba...
Scenariu:
Cod: Selectaţi tot
mainApplication
 |
 ...
 |
TriviaBox
   |
   |--- QuestionBox
   |--- HintBox
    \ -- AnswerBox


Toate componentele implementeaza UIComponent. QuestionBox comunica lui HintBox trecerea la o noua intrebare, HintBox genereaza sugestii corespunzatoare, iar la epuizarea acestora (prin intermediul incercarilor din AnswerBox), HintBox ii comunica inapoi lui QuestionBox sa incarce o alta intrebare.
Asadar, AnswerBox-ul comunica cu HintBox: la introducerea unui raspuns incorect, afiseaza urmatoarea sugestie; apoi, la epuizarea sugestiilor, va comunica QuestionBox-ului sa incarce o noua intrebare.

Un mic exemplu din ce am incercat eu:
QuestionBox.mxml:
Cod: Selectaţi tot
this.parentApplication.hintBox.dispatchEvent(new Event("newQuestion"));

HintBox.mxml:
Cod: Selectaţi tot
this.addEventListener("newQuestion",onNewQuestion);


...varianta care ar merge, insa... mi se pare cam aiurea. De ce? Nu stiu exact...Probabil pt ca pana la final, addEventListener-urile se vor inzeci si depind de id-urile componentelor.
Voi ce pareri aveti? Multumesc...
alphagon
 
Mesaje: 83
Membru din: Sâm Ian 17, 2009 4:11 am

Re: Comunicare intre componente

Mesajde Barna Biro » Lun Oct 12, 2009 8:08 pm

In mod ideal, componetele tale sunt de sine statatoare... Adica: QuestionBox nu ar trebui sa aibe treaba directa cu HintBox, si nici AnswerBox cu restul ( cel putin din ce am inteles ca ai explicat ). Fiecare componenta ar trebui sa se ocupe de treaba lui, fara sa dispatch-uie evenimente cine stie ce alt box, care la randul sau sa dispatch-uie evenimentu mai departe si tot asa ( devine extrem de complex codul astfel si greu de urmarit/inteles ).

O solutie mai ok ( in parerea mea ) ar fi sa faci un QuestionManager de exemplu. Acel QuestionManager, ar fi responsabil pentru "legarea componentelor". In acel manager, te inscrii la diferite evenimente si chemi diferite operatii pe diferite componente.

De exemplu: ai QuestionBox-u contine intrebarile ( pasate/citite de unde vrei tu ), HintBox contine hint-urile coresponzatoare question-urilor din QuestionBox ( de AnswerBox, sincer, nu vad de ce ai nevoie... Din ce ai descris, mi se pare cam in plus ). La initializare, QuestionManager apeleaza o metoda publica din QuestionBox numita "getQuestion" ( de exemplu ), in urma apelarii, QuestionBox-u ia o intrebare din lista cu intrebari posibile si o afiseaza. Daca user-ul nu se descurca atunci apasa pe un "HintButton" ( presupun ca ai asa ceva, daca nu... whatever, sper sa intelegi ideea ) care face un call la QuestionManager pentru a afisa HintBox-u cu un hint... Daca user-u nici acuma nu stie raspunsul, da din nou pe buton, iar QuestionManager-u iara cheama o metoda ( s-o numim "getHint" ) din HintBox... HintBox, la randul lui, tot cauta prin lista cu Hint-uri posibile... Daca la un moment dat, hint-urile au fost epuizate, atunci HintBox dispatch-uie un eveniment de genul "noHintsLeft" la care asculta QuestionManager-u... In momentul declansarii evenimentului, poti face ce doresti din QuestionManager ( sa afisezi o avertizare, sa inchizi HintBox-u, sa-i spui user-ului ca "you're dumb as a brick... get lost!", etc. ).

Scenariul doi: raspunde user-u la intrebare... In urma raspunsului corect, chemi metoda "getQuestion" pentru a afisa urmatoarea intrebare... Si aici, poti proceda la fel: in momentul in care a ajuns la ultima intrebare, ii afisezi un mesaj "Congrats, you're SMART!".

Evident, tu cunosti mai bine aplicatia... Ceea ce am descris eu mai sus nu e neaparat o solutie 100% ok pentru cazul tau, dar din moment ce nu cunosc multe detalii, cu atata te pot ajuta. Ce iti pot spune sigur, e ca, e extrem de nasol sa "legi componentele" in asa fel, incat una sa depinda de cealalta si sa comunice una direct cu alta ( exista si exceptii, dar in 99.9% din cazuri, exista mereu solutii mult mai bune ).

Incearca sa construiesti componetele in asa fel, incat daca e nevoie, sa poti sa le refolosesti si chiar sa extinzi aplicatia usor in cazul unui nou feature. Legand o componenta de alta, si alea de inca alte componente rezulta intr-o structura extrem de greoaie... Try to avoid stuff like this. ;)

Sper ca o sa-ti fie sfaturile de ceva folos. Bafta!
Imagine
Avatar utilizator
Barna Biro
Administrator
 
Mesaje: 2037
Membru din: Vin Iul 25, 2008 1:06 am
Localitate: Lucerne, Switzerland

Re: Comunicare intre componente

Mesajde alphagon » Mar Oct 13, 2009 11:55 am

O solutie mai ok ( in parerea mea ) ar fi sa faci un QuestionManager de exemplu.

QuestionManager - bun. Ar trebui as fie si el un UIComponent, nu?
- daca da, QuestionBox, HintBox si AnswerBox sunt adaugate intr-un TriviaBox.mxml (care e defapt un TitleWindow)...si atunci as putea trata TriviaBox-ul ca si un Manager, QuestionManager;
- daca nu, ar trebui sa fie un QuestionManager.as - fisier pur action script? (sper sa nu fie asta cazul ca mi se pare mai complicat sa manevreze din .as componente existente, definite in mxml - sau nu am prea incercat eu);

AnswerBox, sincer, nu vad de ce ai nevoie... Din ce ai descris, mi se pare cam in plus

AnswerBox-ul...mda..posibil inutil.. nu va contine decat un TextInput modificat si definit extern si un Button. Cel putin asta prevad deocamdata ca va contine. Insa poate va trebui sa fac un ControlBox pentru niste butoane gen Urmatoarea (intrebare), un slider modificat pentru nivelul jocului (dificultate) si alte posibile porcarii.

Evident, tu cunosti mai bine aplicatia...

Aplicatia pe care o incerc e o reproducere a jocului de trivia de pe IRC, daca o mai tineti minte... :) Am petrecut ceva vreme pe jocul ala si in plictiseala mea mi-am zis Hai sa-ncerc! ... Acum mesteresc la a doua varianta. In prima facusem un user-login (cu salvare scor, nivel) si o fereastra de trivia cam ... seaca. Functionabila, insa nu-s multumit, mai ales din cauza haosului (in cod) ce mi se pare ca a rezultat. De asta am si apelat aici si, acum, incerc sa ...
sa construiesti componetele in asa fel, incat daca e nevoie, sa poti sa le refolosesti si chiar sa extinzi aplicatia usor in cazul unui nou feature.

Multumesc.
alphagon
 
Mesaje: 83
Membru din: Sâm Ian 17, 2009 4:11 am

Re: Comunicare intre componente

Mesajde Barna Biro » Mar Oct 13, 2009 8:21 pm

In general, o clasa manager e o clasa simpla si nu o componenta sau something. Clasa respectiva incapsuleaza informatiile necesare pentru a manipula un set de obiecte ( in general, obiecte de acelasi tip... ).

Manager-u ar trebui sa stocheze diferite referinte la obiectele pe care doreste sa le manipuleze iar tu ar trebui sa faci pur si simplu call-uri la manager de genu "getQuestion" ( care la randul lui, ar apela metoda care afiseaza urmatoarea intrebare din QuestionBox ), "showHint" ( care ar apala o metoda din HintBox pentru a fisa un hint ) si etc.

Don't worry daca nu construiesti aplicatia perfect de la inceput... Incearca doar sa separi componentele in asa fel incat sa nu depinda functionarea componentei X de componenta Y. Fiecare componenta ar trebui sa functioneze pe "propriul cont" iar cu ajutorul claselor manager sa realizezi comunicarea intre diferite componente ( facand asta, doar clasa Manager va fi mai "tight coupled" ceea ce nu e o problema mare deoarece clasele manager oricum nu sunt prea refolosibile... fiecare clasa manager e dezvoltat in asa fel incat sa faca fata unei probleme concrete, iar sansele ca sa te lovesti de exact aceeasi problema intr-o alta aplicatie si sa poti sa refolosesti clasa manager scrisa anterior asa cum e, sunt destul de mici ).

Acuma, daca ai vrea sa complici lucrurile, ai putea sa definesti diferite interfete pentru a face clasa manager mai "loose coupled" si sa poti sa swap-uri componentele pe viitor ( daca e nevoie ) si toate cele. Jump right into it, si vezi ce iasa... don't worry daca nu e perfect. ;)
Imagine
Avatar utilizator
Barna Biro
Administrator
 
Mesaje: 2037
Membru din: Vin Iul 25, 2008 1:06 am
Localitate: Lucerne, Switzerland


Înapoi la Adobe Flex

Cine este conectat

Utilizatorii ce navighează pe acest forum: Niciun utilizator înregistrat şi 1 vizitator

cron