POOPOO- Vasile Stoicu-Tivadar Stoicu

-

1 /58

Proiectarea orientată pe obiecte și
Unified Modelling Language (UML)

ŞABLOANE DE PROIECTARE

POOPOO- Vasile Stoicu-Tivadar Stoicu-

2 /58

Avantajele analizei și proiectării orientate pe obiecte
Aceste beneficii includ: • eventualele schimbări în proiect sunt localizate și interacțiunile cu alte module de program, improbabile • moștenirea și polimorfismul fac ca sistemele construite cu tehnologii orientate pe obiecte (OO) să fie mai ușor de extins, realizând astfel dezvoltare mai rapidă • proiectarea orientată pe obiecte eset potrivită pentru implementare paralelă, distribuită sau secvențială, în egală măsură • obiectele corespund mai adecvat entităților din lumea conceptuală abordată de proiectant și de utilizator, putând astfel mai ușor urmări schimbările necesare •datele partajate sunt încapsulate, reducându-se astfel posibilitatea unor modificări neprevăzute sau alte anomalii legate de actualizări ale acestora

POO - Vasile Stoicu-Tivadar Stoicu-

3 /58

Pașii analizei și proiectării orientate pe obiecte
Acești pași sunt: • găsirea căilor de interacțiune a sistemului cu exteriorul (cazurile de utilizare) • identificare a obiectelor, a atributelor și metodelor acestora • stabilirea relațiilor dintre obiecte • stabilirea interfețelor obiectelor și a tratării excepțiilor • implementarea și testarea obiectelor • asamblarea și testarea sistemului Analiza orientată pe obiecte este nu numai analiză ci conține și elemente de sinteză. Astfel, abstractizarea cerințelor utilizatorului și identificarea obiectelor cheie din domeniu sunt urmate de asamblarea acestor obiecte în structuri care să suprote proiectarea efectivă în etapele ulterioare

POO - Vasile Stoicu-Tivadar Stoicu-

4 /58

Ce este UML ?
UML este o notație standard internațională pentru analiza și proiectarea orientate pe obiecte. Este definită de Object Management Group (www.omg.org) UML = Unified Modelling Language UML furnizează elemente de notație descrise în detaliu în Ian Graham, Object-Oriented Methods (Addison-Wesley, 2001); UML permite dezvoltare bazată pe componente. Dar UML nu înseamnă numai notații ci și un anumit principiu de gândire și modelare. Astfel, un inginer software trebuie să știe și proceduri de utilizare a notațiilor respective, în afara dezvoltării efective de aplicații: modelarea cerințelor afacerii (business), procesul de dezvoltare propriu-zis, gestiunea proiectelor (project management), metrici (măsuri), trasabilitate, gestiunea reutilizării software (reuse).

POO - Vasile Stoicu-Tivadar Stoicu-

5 /58

Introducere UML.UML. Obiecte. Exemple.Vasile Stoicu-Tivadar Stoicu- 6 /58 . Exemple. POO . Introducere Obiecte.

Vasile Stoicu-Tivadar OOStoicu7 /58 .UML . Introducere Introducere Comportament Obiectele colaborează pentru a asigura funcţionalitatea dorită POO.

Introducere UML.UML. Introducere Clase Exe Clase. Exemple POO .Vasile Stoicu-Tivadar Stoicu- 8 /58 .

Introducere UML. Introducere Un exemplu de diagramă simplă de clase (sistem autopilot cu o clasă autopilor și diferiți senzori și elemente de execuție pe care această clasă îi folosește) POO .UML.Vasile Stoicu-Tivadar Stoicu- 9 /58 .

Introducere Relaţii între clase şi obiecte Asociaţii – relații care se manifestă la rulare pentru a permite schimb de mesaje între obiecte (reprezentate prin linii simple). Introducere UML. un mesaj este în ultimă instanță un apel de metodă Agregare – relația stabilită atunci când un obiect conține logic un alt obiect (romb la capătul dinspre proprietar) Compoziţie .UML.în care proprietarul este explicit responsabil pentru crearea obiectului parte (este o formă tare de agregare) Generalizare (sau relație este-parte-a(al)) – linii cu săgeți umplute. un software presupune utilizarea unui pachet – în accepțiunea din JAVA) Multiplicitate – numărul obiectelor care participă într-o relație. pentru fiecare dintre cei implicați (numerele se pun la fiecare capăt al liniei care simbolizează relația) POO .Vasile Stoicu-Tivadar Stoicu10 /58 .(linii punctate cu săgeți deschise) – când există o dependență între parteneri (ex. este inversul moștenirii Dependenţă.

Introducere UML. Introducere Tipul de asociere Moştenire(Gen-Spec) Agregare Compoziţie Asociere unidirecţională Asociere bi-direcţională Dependenţă Clasă Simbol de asociere Clasă Subclasã Superclasã Întreg Parte Întreg Client Parte Furnizor A Client POO .UML.Vasile Stoicu-Tivadar Stoicu- B Furnizor 11 /58 .

UML. Introducere UML.Vasile Stoicu-Tivadar Stoicu- 12 /58 . Introducere Diagrame de clase Exemplu: Relații de Clasă Fereastră Exemplu: Relații de Clasă Senzor POO .

Vasile Stoicu-Tivadar Stoicu- 13 /58 . Introducere Diagrame UML şi notaţii UML cuprinde un set bogat de notații și semnatici și le grupează pe tipuri de reprezentări (diagrame) O notă text .un element de diagramă fără impact semantic (dreptunghi cu colțul din dreapta sus îndoit) este un comentariu pentru a îmbunătăți înșelesul Constrângere – restricție suplimentară adăugată unui element de modelare (între paranteze acoladă. Introducere UML. de obicei în cadrul unei note text) Exemplu: constrângeri de timp evidențiate pe diagrame de secvență Note text și constrângeri POO .UML.

o clasă a unei tereotipul entități în UML care permite utilizatorilor extinderea limbajului de modelare pentru a permite acestora o mai bună exprimare conform necesitățilro proiectelor (notație cu paranteze ascuțite. pe liniile ce reprezintă relația în care e implicată entitatea în cauză) Exemple de stereotipuri POO .Vasile Stoicu-Tivadar Stoicu14 /58 .UML Stereotipul .

spre exemplu subsisteme sau chiar clase. Utilizare în etapele de început ale analizei. diagrama cazurilor de utilizare prezintă capabilitățile funcționale ale sistemului privit ca o cutie neagră (se văd doar intrările și ieșirile). Un actor este un obiect în afara scopului sistemului considerat dar care are interacțiuni semnificative cu acesta.Analiza cerințelor pentru cerințelor sisteme în timp real CAZURI DE UTILIZARE (USE CASES) Un caz de utilizare este o capabilitate nominalizată a unei entități structurale în cadrul unui model Adeseori. POO . Un actor interacționează direct cu sistemul. analiza cazurilor de utilizare se aplică sistemului ca un întreg. dar se poate realiza și pentru alte entități structurale. Cazurile de utilizare sunt realizate prin colaborări între clase.Vasile Stoicu-Tivadar Stoicu- Exemplu: câteva cazuri de utilizare ale unui sistem de control al traficului aerian (doar un actor este un utilizator uman – controlorul de zbor) 15 /58 .

Vasile Stoicu-Tivadar Stoicu- 16 /58 .Analiza cerințelor .continuare Examplu: Sistem de Anestezie Cazuri de Utilizare Subsistem Interfețe Utilizator Cazuri de Utilizare pentru subsistem Subsisteme POO .

Vasile Stoicu-Tivadar Stoicu- Exemplu de exprimare a Cerințelor. O constrângere este o regulă aplicată unui set al elementelor modelului. în afara regulilor definite de UML Constrângerile sunt texte în paranteze acoladă. Exemplu: {Sistemul trebuie să returneze o balanță de cont în max. inclusiv prin constrângeri (v. Notele text) 17 /58 .Analiza cerințelor .continuare Cerințele Cerințele funcționale sunt reprezentate direct de cazurile de utilizare. Cerințele sunt codificate și sub formă de restricții (constrângeri constraints). 30 s} POO .

continuare Diagrame Diagrame de Secvență Secvență -prezintă secvenţa mesajelor dintre obiecte Sintaxa pentru Diagrama de secvenţă Liniile verticale de instanță reprezintă obiectele. activitățile. POO . acțiunile.Analiza cerințelor . Fiecare linie care simbolizează un mesaj pleacă de la obiectul de origine și sfârșește la obiectul destinație și are un nume de mesaj pe linie.Vasile Stoicu-Tivadar Stoicu18 /58 . Acest nume poate fi însoțit în fazele ulterioare de o listă de parametri (parametrii de apel ai operației care este apelată pentru a transmite mesajul). Notațiile textuale identifică condițiile inițiale.

asincron) Acțiuni: SendAction asociat cu un Semnal (Signal )(o specificare a unui Stimul (Stimulus) asincron.lista parametrilor și valoarea returnată .Analiza cerințelor .modelul (pattern) de sosire (periodic sau aperiodic) .trimiterea unui semnal .continuare Mesaje esaje Mesajul Mesajul – abstracție a unei unități de comunicare între un obiect sursă și un obiect țintă (cel care recepționează mesajul) .atunci când un Signal este recepționat.Vasile Stoicu-Tivadar Stoicu19 /58 CallEvent în obiectul receptor .emițătorul .invocarea (apelul) unei operații .tipuri UML de mesaje .lista obiectelor țintă .proprietăți: . poate genera asincron un eveniment numit SignalEvent care poate produce o tranziție de stare Exemplu: Metamodelul unei Acțiuni CallAction – recepționarea invocării unei operații (diferite tipuri de acțiuni) (CallAction ) care poate produce un eveniment POO .acțiunea .modelul (pattern) de sincronizare (sincron.

Extensii pentru Timp Real Așa arată firele de execuție concurente pe o diagramă de fire de execuție: POO .Vasile Stoicu-Tivadar Stoicu- 20 /58 .

O diagramă de stare este complet constructivă – adică o singură diagramă de stare descrie întregul comportament al Clasificatorului al cărui comportament o descrie. de utilizare Pozitionare Telescop al unui O stare este o condiție de existență a unui sistem de comandă a unui telescop clasificator (clasă sau caz de utilizare) care persistă o perioadă semnificativă de timp și poate fi cumva distrinsă față de alte condiții similare de existență. fiecare fiind valabilă în anumite condiții specifice. Distinctibilitatea poate fi analizată în termeni de: •comportament al obiectului în timpul intrării. POO . Un Clasificator este o metaclasă în UML.Vasile Stoicu-Tivadar Stoicu21 /58 .continuare O diagramă de stare conține dreptughiuri cu Exemplu: mașină de stare pentru cazul colțuri rotunjite numite stări. care are proprietatea că are asociată o mașină de stare (exemple: clase. ieșirii sau persistenței într-o/dintr-o stare. cazuri de utilizare).Diagrame de stare Analiza cerințelor . •evenimente acceptate în starea respectivă •graful de accesibilitate al stărilor subsecvente Mașinile de stare sunt utile deoarece furnizează o descompunere a comportamentului complex în bucăți mai mici.

Vasile Stoicu-Tivadar Stoicu- . a mesajelor pe care le trimit și recepționează (acestea alcătuiesc scenariile) și apoi gruparea acestora în cazuri de utilizare •se pleacă de la scenarii. apoi identificarea actorilor și scenariilor în cadrul fiecărui caz de utilizare •Identicarea actorilor sistemului. se identifică actorii care participă la acestea apoi se agregă în cazuri de utilizare Analistul stă de vorbă cu clientul și îi adresează întrebări cheie precum: •Care sunt funcțiile primare ale sistemului ? •Care sunt funcțiile secundare ale sistemului ? •De ce a fost construit sistemul ? Ce înlocuiește și de ce? Analistul trebuie să identifice pentru fiecare caz de utilizare: •rolul actorilor și al sistemului în fiecare scenariu •interacțiunile (fluxurile) •secvențele de evenimente și date •posibilele variațiuni Exemplu: Diagrama cazurilor de utilizare a unui Monitor ECG 22 /58 POO .continuare Identificarea cazurilor de utilizare Există 3 abordări primare pentru identificarea acestora: •Listarea capabilităților primare ale sistemului.Analiza cerințelor .

continuare Identificarea Cazurilor de Utilizare .continuare Exemplu (continuare) •Funcționalitățile primare ale unui monitor ECG •afișarea formelor de undă eelctrocardiografice pentru medic •furnizarea unor valori numerice calculate din semnale (spre exemplu frecvența bătăilor cardiace) •furnizarea unor alarme pentru pacienții cu risc •Funcționalitățile secundare: •furnizarea informațiilor pentru un display la distanță pentru chirurgie •facilitatea de actualizare a softului •posibilitatea de confirgurare •existența unui regim de funcționare demo •De ce este construit sistemul ? (în comparație cu altele similare) •furnizează o mai bună detecție a aritmiilor •colorarea graficelor pentru o mai bună diferențiere a traseelor ECG •timp de răspuns mai bun •interfațarea cu rețeaua spitalului și cu echipamentele de anestezie din sala de operații POO .Analiza cerințelor .Vasile Stoicu-Tivadar Stoicu- 23 /58 .

Definirea structurii obiectelor Conectarea Modelului de Obiecte cu Modelul Cazurilor de Utilizare Este important deoarece: •Modelul cazurilor de utilizare determină modelul obiectelor (fiecare caz de utilizare va fi realizat de un set de obiecte care lucrează împreună în UML: colaborare) colaborare •Dacă suntem siguri de conectarea obiectelor la modelul cazurilor de utilizare. avem șanse mai mari să realizăm un sistem care corespunde cerințelor . creșterea costurilor •omiterea unor caracteristici deoarece cerințele nu au fost suficient de îndeaproape urmărite POO .Vasile Stoicu-Tivadar Stoicu24 /58 . dar => riscul unor probleme: •adăugare de facilități mai multe decât cele necesare=> testare și întreținere mai dificile.

and messages. Identify causal objects Identify services (passive Identify realworld items Identify physical devices Identify key concepts Strategii cheie Strategii pentru identificarea obiectelor Cel mai bune stfel de strategii: Key concepts may be modeled as objects. Identify Information that must persist for significant periods of persistent time may be objects or attributes. histograms. Bank accounts exist only conceptually. buttons. bitmaps. but are important objects in a banking domain. Frequency bins for an online autocorrelator may also be objects. Examples include objects such as respiratory gases. icons. Identify the sources of actions. Identify the targets of actions. Missing objects will become apparent when required actions cannot be achieved with existing objects. Examples include bus messages and queued data. air pressures. Identify Transactions are finite instances of associations transactions between objects that persist for some significant period of time. includes the coordinators of actions. cazurile de utilizare de la nivelul sistemului pot fi rafinare pentru a lua în considerare obiectele identificare și relațiile dintre acestea.Vasile Stoicu-Tivadar Stoicu- 25 /58 . This persistence may information extend beyond the power cycling of the device. Identify visual User interface elements that display data are objects elements within the user interface domain. the analyst underlines each noun or noun-phrase in the problem statement and evaluates it as a potential object. events. and fonts.Definirea structurii obiectelor Table 3-1: Object Discovery Strategies Strategy Underline the noun Description Used to gain a first-cut object list. and so forth. as well as the electronic devices they monitor or control. Identify control Control elements are objects that provide the interface elements for the user (or some external device) to control system behavior. Real-world items are entities that exist in the real world but are not necessarily electronic devices. forces. and messages. such as windows. anatomical organs. menus. POO . Physical devices include the sensors and actuators provided by the system. chemicals. they are processors or ancillary electronic "widgets. vats. waveforms. In the internal architecture. scroll bars." După ce modelul obiectelor a fost creat. Apply scenarios Walk through scenarios using the identified objects. events. as well as entities that passively provide services when requested.

comportament și interfețe pentru clasele descendente. pentru ca aceste obiecte să își realizeze rolurile în cadrul colaborărilor. sunt definite între obiecte si pot să apară și să dispară în timpul execuției ca legături . cuprinzând 4 din aceste tipuri de relații. Agregarea şi compoziţia sunt forme specializate de Agregarea asociere care implică un mai mare grad de proprietate și responsabilitate. Instanțele asocierilor . senzor și element de execuție. între pachete – în accepțiunea din JAVA). Dependenţa Dependenţa înseamnă că un element de model depinde cumva de un alt element (exemplu: o dependență la compilare.Vasile Stoicu-Tivadar Stoicu- 26 /58 . Generalizarea Generalizarea este o relație dintre clase (mai degrabă decât dinter obiecte) deoarece definește un set de atribute. POO . numite legături.Definirea structurii obiectelor Definirea relaţiilor dintre clase relaţiilor Tipuri de relaţii: •asocierea •agregarea •compoziţia •generalizarea •dependenţa Asocierile sunt structurale. Exemplu: o diagramă de clase cu clasele primare controller. însemnând că trebuie să fie parte a claselor din care sunt instanțele (de aceea analiza consideră că asocierile aparțin claselor).

}. }. void BeMelancholy(void) { pT->Wag(5). }. fără delimitare client-server) sunt mai puțin uzuale : Peer-to•Fiecare obiect trebuie să știe despre celălalt •În general sunt implementate ca două relații independente client-server POO . Exemple: El are un câine. void BeExcited(void) { pT->Wag(50).SendDog->Wag (Caine. bolnave) și adăugarea de noi clienți ar fi mai dificilă •Este necesar un singur nume de rol pentru o asociere unidirecționale (tipic. void BeSad(void) { pT->Wag(2). }.SendTail->Wag mai degrabă decât Tail.Definirea structurii obiectelor Asocierile Sunt logic bidirecționale dacă nu se definesc constrângeri explicite.TrimiteLaCaine->DaDinCoada) Cel mai adesea sunt implementate ca și pointeri sau referințe la obiecte. Exemplu: Class Dog { Tail* pT.TrimiteCatreCoada->DaDinCoada mai degrabă decât Coadă.Vasile Stoicu-Tivadar Stoicu27 /58 . public: void BeHappy(void) { pT->Wag(20). }. Asocierile navigabile într-o singură direcție sunt cunoscute sub numele de asocieri client-server client•Serverele nu trebuie să știe despre clienți deoarece ar introduce asfel cuplaje patologice (nedorite. Câinele îi aparține. În practică sunt exercitate într-un singur sens. la capătul dinspre server) Asocierile Peer-to-peer (adică egale în ranG. sau Floor Request Button trimite o cerere la Elevator (Lift) Elevator primește o cerere de la Floor Request Button (ButonCerereEtaj). Exemplu: Dog.

în care părțile Compoziția (componentele) sunt în întregime în responsabiliyayea clasei compozite. multiplictatea trebuie precizată în colțul din dreapta sus. •Componentele nu pot fi partajate înter compozite. •Compoziția este reprezentată prin includere grafică a componentelor în cadrul compozitelor sau prin romb de agregare umplut. •Compoziția este o formă “tare” de agregare. •Dacă se folosește includerea. •Compozitele trebuie să își creeze și distrugă componentele.Vasile Stoicu-Tivadar Stoicu- 28 /58 .dacă multiplicitatea capătului “parte” este 1 (adică “întregul” accesează direct “partea”) •catalog – dacă multiplicitatea părții este fie opțională fie mai mare ca 1 Ambele tipuri de agregare suportă partajarea acelorași părți între diverși proprietari. gregarea Unii autori preferă termenul agregare. Poate fi •fizică . POO . termenul parte/întreg agregare parte/întreg. alții.Definirea structurii obiectelor Agregarea şi Compoziţia Agregarea Compoziţia Agregarea este un tip special de asociere care implică proprietatea logică sau fizică.

Definirea structurii obiectelor Clase asociative În sistemele distribuite. locul etc. exemplul cel mai la îndemână de clasă asociativă este clasa mesaj.Vasile Stoicu-Tivadar Stoicu- 29 /58 . obiectul mesaj poate să conțină informații adiționale specifice legăturii și relației: prioritate. număr de secvență. POO . Asocierea dintre serverul de măsurare și cliențli de afișare este de interes pentru acest exemplu. un subsistem conține clasa senzor și acționează ca un server pentru datele de la senzori. calea mesajului. Exemplu: într-o căsătorie (asociere între două persoane) unde localizăm apartenența următoarelor atribute ? data căsătoriei. mesaj În afară de informația de trimis. O clasă asociativă este folosită când inforamțiile nu par să aparțină nici unui obiect implicat în asociație sau mai degrabă aparține în mod egal ambelor. informații despre formatul datelor și a integrității acestora (exemplu: sume de control) etc. indetificator de sesiune. În exemplul modelului sistemului distributi din figură. informație de control al fluxului. Subsistemul client afișează datele pentru utilizator.

) xtindă •substitutabilitatea (o instanță a unei subclase poate fi substituită totdeauna cu o instanță a superclasei substitutabilitatea sale. fără a încălca semantica modelului – Principiul de Substituție al lui Liskov . Clasele derivate au toate proprietățile părinților dar pot să le extindă sau să le specializeze.Vasile Stoicu-Tivadar Stoicu30 /58 .d. Atunci când mulțimea subclaselor (claselor derivate) enumeră toate posibilele subclase ținând cont de caractersiticile acestora.a. asocieri ș. operații. asocierile și dependențele superclasei sale) •Subclasa poate să specializeze (subclasa poate să redefinească polimorfic o operație) specializeze •extindă proprietăți moștenite (subclasa poate să adauge noi atribute. superclasă. această mulțime de subclase -> completă completă Exemplu: Subclasele buton sunt specializate pe linii de comportament.PSL) PSL adică putem folosi pointeri de tipul clasei de bază pentru a accesa metode ale unor obiecte d e tip derivat (dar numai pentru metode moștenite) POO . In UML – generalizarea implică: •moştenirea (o sublcasă are toate atributele.Definirea structurii obiectelor Generalizarea Clasa cea mai sus în ierarhie se numește părinte.m. operațiile. generalizare. de bază sau generalizare.

class cat: public Animal { public: void speak (void) { cout << “Miew !” << endl. }. Example pentru extensie : class dog: public Animal { public: void speak (void) { cout << “Arf !” << endl. } . void SnubOwner(void). class fish: public Animal { public: void speak (void) { cout << “Blub!” << endl.Vasile Stoicu-Tivadar Stoicu- 31 /58 . class cat: public Animal { public: void speak (void) { cout << “Miew !” << endl.Definirea structurii obiectelor Exemple de specializare și PSL: void main(void) { Animal *A. fish f. // virtual base class }. } . Clasă Clasă abstractă – acea clasă care nu poate fi instanțiată direct (conține cel puțin o funcție virtuală pură) POO . A=&c. }. dog d. }. A->speak(). }. class Animal { public: virtual void speak (void)=0. A->speak(). }. void slobber(float slobberIndex). }. } . A=&f. A->speak(). void AttackJogger(int fearLevel). } . void ClawFurniture(long ClawLength). cat c. class dog: public Animal { public: void speak (void) { cout << “Arf !” << endl. } . A=&d.

Acesta leagă structura obiectului. Tipuri de comportament: simplu (funcții matematice simple. căutaream sortarea. O tranziție este un răspuns la un eveniment care provoacă o schimbare de stare. astfel încât obiectul să poată să facă față responsabilităților sale. inclusiv relațiile dintre acestea. precum și acțiunile realizate sunt diferite.Definirea comportamentului obiectelor Am văzut cum putem descompune sistemele în structuri de obiecte. un indicator care afișează numărul de clicuri etc.Vasile Stoicu-Tivadar Stoicu- 32 /58 . Operațiile unui obiect implementează comportamentul acestuia. de graful de accesibilitate.) de stare (dacă comportamenul se schimbă datorită intrării precedente) continual Comportament de stare (determinat de stări -state-driven. de setul complet de perechi tranziție-stare țintă Sistemul persistă în stări pentru perioade semnificative de timp Sistemul poate schimba condițiile doar într-un număr finit de căi (tranziții) complete bine determinate POO . de activitățile realizate cât timp obiectul persistă într-o stare. Modelarea unui obiect ca un mașincă cu stări finite (MSF) încearcă să reducă complexitatea comportamentală prin asumarea următoarelor simplificări: Sistemul poate să parcurgă doar un număr finit de condiții de existență (stări) Comportamentul sistemului este definit de mesajele și evenimentele acceptate. O stare este dinstinctivă față de altele în sensul în care evenimentele acceptate tranzițiile survenite ca urmare a acceptării acestor evenimente. de acțiunile întreprinse la intrarea sau părăsirea stărilor. poate fi distinsă (diferențiată) de alte astfel de condiții și este disjunctă (diferită) față de acestea. cu atributele și relațiile. O altă problemă importantă care trebuie rezolvată în cadrul analizei orientate pe obiecte este specificarea comportamentului dinamic. reactiv) O stare este o condiție ontologică (de existență) care persistă o perioadă semnificativă de timp.

algoritmi numerici de reglare spre exemplu buclele PID etc.Definirea comportamentului obiectelor Comportamentul continuu Multe obeicte prezintă un comportament continual (filtre numerice. elementele capabile de comportament de stare sunt doar Clasificatorii (clasele. POO . starea țintă.Vasile Stoicu-Tivadar Stoicu33 /58 Temporizator re-armabil nerepetititv . Ieșirea curentă depinde de istorie (valorile precedente de intrare și ieșire) într-un mod “netezit”. Definirea comportamentului de stare al obiectelor În metodologiile orientate pe obiect. cazurile de utilizare) și doar obiectele execută (funcționează ca) mașini de stare. modelarea respectivă poate fi realizată în limbaje de programare/modelare clasice iar UML poate fi folosit pentru a modela acele entități de program. Tranzițiile sunt reprezentate ca săgeți care încep de la starea de pornire și se termină la de descriptorul (eticheta) tranziției printr-un slash. Cu toate acestea.) – de fapt este comportament cvasi-continual. UML este un limbaj de modelare discret și nu furnizează mijloace pentru modelarea sistemelor continuale. Stările sunt reprezentate ca dreptunghiuri cu colțuri Acțiunile sunt prezentate într-o listă de acțiuni. continuu. Tranzițiile au de obicei asociate nume de evenimente declanșatoare urmate de acțiuni înterprinse dacă se realizează tranziția. separate rotunjite. întrucât este implementat ca și calcul numeric.

obiectul tranzacție poate fi distrus. atunci acea cale de tranziție este luată. Acele Guards sunt reprezentate între paranteze patrate. mesajul este retransmis. acesta persistă până când poate fi verificată recepția sigură de către obiectul care recepționează. un obiect tranzacție este creat temporar .Vasile Stoicu-Tivadar Stoicu34 /58 . Diagrama de stare a Tranzacției Mesaj Dacă apare un eveniment care duce la evaluarea condiției Guard pe TRUE. După ce confirmarea este recepționată.Definirea comportamentului obiectelor Un alt exemplu: un obiect de tip tranzacție mesaj cu o schemă sigură de comunicație. Atunci când obiectul emițător trimite un mesaj către un obiect la distanță utilizând un protocol de comunicație sigur. Dacă se scurge un interval de timp predefinit fără să se primească o confirmare de recepție de la obiectul care recepționează. POO . Rombul reprezintă o pseudo-stare de ramificare pseudo(branch pseudostate ) care permite selecția uneia din căile de tranziție pe baza unor condiții (guarding conditions). Tranzacția trebuie limitată la un număr finit de reîncercări.

the pacemaker is put into a refractory state for a set period of time. T. a detected cardiac contraction) will inhibit the delivery of a pace from the pacemaker. The refractory period is fixed. as programmed by the physician. then the pace is inhibited (the I). To avoid inadvertent programming by electrical noise. the pacemaker resumes monitoring for the next cardiac event. The first letter is either A. indicated by a three-letter acronym. or dual pacing modes. POO . a sensed heart event (that is. during which all cardiac activity is ignored. indicating inhibited. the pacemaker conducts an electric current of a programmable voltage (called the pulse amplitude) for a programmable period of time (called the pulse widtli).Vasile Stoicu-Tivadar Stoicu- 35 /58 . The period of time trie pacemaker will wait in the waiting state is computed based on the pacing rate and the pulse width. In an inhibited mode. or D. and AVI pacing modes. AAT.Definirea comportamentului obiectelor Exemplu Stimulator cardiac Enunțul problemei problemei: Problem Statement: A Cardiac Pacemaker A cardiac pacemaker is an implanted device that assists cardiac function when underlying pathologies make the intrinsic heart rate too low or absent. V. Pacemaker parameters are programmed via a telemetric interface to an external programmer. The last letter is J. are being paced. This particular pacemaker operates in WI. In triggered mode. Following the refractory period. a pacing pacemaker waits for a sense event. or both (dual). If a ventricular sense does occur. Most of the time. WI mode means that the ventricle is paced (the first V) if a ventricular sense (the second V) does not occur. When it decides to pace. WT. Dual modes are more complex and will not be discussed here. For example. Following a pace. AAI. the ventricle. V. Telemetry is sent by pulsing an electromagnetic coil a certain number of times to indicate a "CT bit and a different number of times to indicate a "I" bit. a reed switch must be closed with a magnet before programming is enabled. Pacemakers operate in different behavioral modes. The second letter is also A. triggered. a sensed heart event will immediately trigger a pace from the pacemaker. The commands constructed from the bits must be checked prior to acting on them. or D depending on whether the atrium. or D. depending on which heart chamber is being monitored for intrinsic activity. The rate of pacing is determined by the programmable pacing rate.

Vasile Stoicu-Tivadar Stoicu- 36 /58 .Definirea comportamentului obiectelor Exemplu Exemplu Stimulator Cardiac continuare continuare 1 Acest enunț de problemă poate fi transpus într-un model simplu de clase: POO .

Vasile Stoicu-Tivadar Stoicu- 37 /58 .Definirea comportamentului obiectelor Exemplu Exemplu Stimulator Cardiac .continuare 2 continuare Comportamentul (diagrame de stare): Comutator Reed (acționat prin apropierea unui magnet) Driverul bobinei de recepție a comenzilor (comenzile sunt transmise prin inducție) POO .

Definirea comportamentului obiectelor Exemplu Exemplu de Stimulator Cardiac .Vasile Stoicu-Tivadar Stoicu- 38 /58 .continuare 3 continuare Comportamentul: Comportamentul Modelul de stare al unității de comunicații Model de stare al compartimentelor inimii POO .

Definirea comportamentului obiectelor Exemplu Exemplu de Stimulator Cardiac . Prin trimiterea acestor evenimente în ambele sensuri între cele două obiecte care colaborează.Vasile Stoicu-Tivadar Stoicu39 /58 . trimite un eveniment APaceDone înapoi la Modelul Ventricular. POO .continuare 4 continuare Comportamenul: Model de stare atrial Model de stare ventricular Când Modelul Atrial recepționează un semnal de la Modelul ventricular în starea Waiting (așteptare). emițătorul de fapt determină propagarea la Modelul Atrial a unui eveniment APace (Stimulare). mașinile lor de stare rămân sincronizate. După ce Modelul Atrial realizează stimularea (adică trimiterea unui semnal electric la un electrod din inimă).

ca în exemplul de mai jos: Notația este o modalitate standard de a exprima temporizările între mesaje sau valorile trimise (vezi figura). iar acest lucru poate fi subliniat prin adăugarea unor markeri de stare pe liniile verticale de instanță.Vasile Stoicu-Tivadar Stoicu- 40 /58 .Definirea comportamentului obiectelor Diagrame de Secvență iagrame Secvență Sunt cea mai uzuală cale de reprezentare a scenariilor. Aceste reprezentări trebuie să fie strâns corelate cu modelele corespunzătoare de stare. Se folosesc linii verticale pentru a reprezenta obiectele care participă la scenariu și săgeți orizontale pentru a reprezenta mesajele trimise între obiecte. POO .

Metoda este realizarea unei operații. unele din acestea având interfețe ale clasei (adică sunt funcții publice).Definirea comportamentului obiectelor Definirea operaţiilor operaţiilor Toate operațiile claselor manipulează mesaje sau ajută la aceasta. indecșii de matrice nu sunt verificați (dar în FORTRAN sunt verificați). dar putem supraîncărca oepratorul de indexare pentru a realiza această verificare. Aceasta este distinctă față de metodă. În cea mai simplă situație. parametrii formali descriși în prototipurile de funcții sunt comparați cu parametrii actuali la apelare și neconcordanțele sunt semnalate. există o corespondență 1-1 între comportamentul clasei și operațiile acesteia. dar nu neapărat. Dar anumite limbaje au verificări de tip mai severe decât altele. o operație este specificarea unui comportament.Vasile Stoicu-Tivadar Stoicu- 41 /58 . altele sunt interne sau ascunse (private). Exemplu: în C++. incluzând comportamente de sincronizare În limbajele în care cerințele asupra tipurilor sunt severe. Operațiile au un protocol (set de reguli) de utilizare corectă. ceea ce nu se întâmplă în C. Comportamentul general al unui obiect este descompus într-un set de operații. iar operația este cuanta fundamentală de comportament al obiectului. compilatorul însuși verifică numărul și tipul parametrilor. POO . care constă în: •invarianți precondiționali – condiții pe care mediul trebuie să le satisfacă înainte de invocarea (apelul) operației •o semnătură – conținând o listă ordonată de parametri formali. tipurile acestora și tipul returnat de operație •Invarianți postcondiționali – condiții care sunt îndeplinite garantat dacă se derulează operația •reguli pentru interacțiuni sigure între fire de execuție. În schimb. În UML.

. node current_node. Câteodată construcția unui obiect se realizează în doi pași: ințial. Acestea pot fi: 1. (vezi capitolul despre Tipare) Exemplu: o clasă colecție simplă (un arbore binar): class Bunch_O_Objects { node* p. node* previous(void). Selector – citește valori sau solicită servicii de la un obiect fără ca acesta să fie modificat . Constructor – crează obiecte de o anumită clasă. pentru a putea realiza inițializarea completă a obiectului). node* go_right(void). POO . node* next(void). Este uzual ca obiectele să acceseze colecții de alte obiecte numite colecții sau containere.conceptul de urmator (next) sau precedent (previous) : class Bunch_O_Objects { node* p. apoi un anumit apel completează procesul (atunci când nu toate informațiile sunt disponibile la creare. Dar o mai bună abordare ar fi furnizarea unei semantici fundamentale . Modificator (Modifier) – schimbă valori în cadrul unui obiect. constructorul construiește infrastructura obiectului. Iterator – furnizează acces ordonat la componentele unui obiect.Vasile Stoicu-Tivadar Stoicu- 42 /58 . node current_node. node* go_left(void).Definirea comportamentului obiectelor Tipuri de operaţii Operațiile sunt manifestările comportamentelor. public: void insert(node n). public: void insert(node n). Destructor – distruge obiecte de o anumită clasă 3. 5. 2. Modificator 4. }. }.

node* previous(node* p). node* last(). P. niciunul nu va putea citi toată lista deoarece unele elemente se duc la primul utilizator. node* next(void). }. altele la celălalt. node* find(node &n).Vasile Stoicu-Tivadar Stoicu43 /58 class Bunch_O_Objects { node* p. node* find(node &n). node* first(). }. BOO_Iterator(Bunch_O_Objects& B) : BOO(B) {current_node=BOO . node current_node. node* last(). }. public: void insert(node n).Definirea comportamentului obiectelor Poate unii clienți ar dori să caute sau mai mult. POO . să repornească o căutare : Dacă doi utilizatori doresc să parcurgă lista cu next() în același timp. }. Bunch_O_Objects& BOO. node* next(node* n). public: void insert(node n). node* previous(void). node* first(). node* next(void). . node* previous(void). O soluție este crearea unor obiectede tip iterator separate și fiecare iterator să aibă propriul pointer de nod curent: class Bunch_O_Objects { node* p. friend class BOO_Iterator. class BOO_Iterator { node* current_node.

dar de eventual în mod simplist să furnizeze int acquire(void) { asemenea simplifică utillizarea clasei. valorii.Definirea comportamentului obiectelor Strategii pentru definirea operaţiilor Există reguli euristice (rezultate din experiență) care ne ajută la identificarea operațiilor: •furnizarea unui set ortogonal de operații (cât mai diferite. clasa senzor poate public: necesității de aducere la zero.Vasile Stoicu-Tivadar Stoicu44 /58 . atribute sau asociații •toate mesajele direcționate spre obiect trebuie să fie acceptate și traduse în acțiuni definite (evenimente tratate de modelul de stare al clasei și mesajele prezentate în scenarii trebuie să aibă operații care să le accepte. cu operații de tip get sau set -citire sau scriere valoare-care să asigure accesul la atribute oridecâteori este necesar) •acțiunile și activitățile identificate pe diagramele de stare trebuie să se traducă în operații definite în clasele care furnizează aceste acțiuni Operația acquire() determină •operațiile trebuie să testeze invarianții precondiționali class sensor respectarea unui protocol de aducere { la zero a senzorului înainte de citirea Exemplu: void doZero(). POOPOO. la ultimul nivel de simplitate) de interfață •ascunderea structurii interne a clasei prin operații de interfață care expun doar caracteristicile semantice esențiale ale clasei •furnizarea unui set de operații ne-primitive pentru a impune utilizarea unor reguli de protocol și surprinderea celor mai utilizate combinații de operații •o clasă părinte comună ar trebui să furnizeze operații comune utilizate de clasele înrudite •fiecare responsabilitate a unei clase sau a unui obiect trebuie să corespundă unei combinații de operații. combinarea lor într-o }. pentru operația get() prin îndeplinirea înainte de a fi folosit. totdeauna apelate în această le combină: }. succesiunie. operațiile primitive doZero() și get() sau doZero(). disjuncte) primitive (elementare. Deoarece doZero() și get() sunt poate să furnizeze o operație acquire() care return get(). Nu doar asigură precondiția Un senzor trebuie să fie adus întâi la zero int get(). operație non-primitivă de utilitate curentă este de dorit.

JAVA sau datorită unor extensii recente. a tuturor celorlalte diagrame UML •Marele avantaj al mediului este că se integreză în suita Rational și astfel activitățile de dezvoltare software sunt integrate unitar inclusiv la nivelul gestiunii configurațiilor.sourceforge. •Aplicația este capabilă să genereze cod în C++.Vasile Stoicu-Tivadar Stoicu- 45 /58 . nu numai la codificare/testare. http://www-01. chiar în .ibm. îndeosebi dacă se urmează metodologia RUP. ca și mediile utilizate la laboratorul de PC sau POO) care oferă suport pentru utilizarea UML .com/software/awdtools/developer/rose/enterprise/index. Cea mai cunoscut ă astfel de aplicație este Rose din pachetul Rational (IBM).net/en/ POO .Instrumente CASE Există câteva instrumente comerciale de tip CASE (Computer Aided Software Engineering – instrumente software utile în mai multe etape din ciclul de viață al programelor. a diagramelor de clase care le realizează.NET (implementăruile metodelor nu sunt generate) Există și aplicații unele chiar gratuite care însă nu sunt de complexitatea acestui instrument.html •Este conceput să se integreze în suita Rational care oferă suport pentru toate etapele de dezvoltare software. •Permite crearea cazurilor de utilizare.Rational Unified Process (IBM). testare etc. Exemplu: StarUML http://staruml. Multe dintre acestea sutn editoare care analizează corectitudinea sintactică a modelelor UML și unele chiar generează cod (de fapt un schelt al viitoarei aplicații) de folos ulterior la codificare.

ŞABLOANE DE PROIECTARE (Design Patterns) 46 /58 .

1979) Permite utilizarea soluţiei de multe ori în contexte diferite Abstractizează şi identifică aspectele cheie ale unei structuri comune de proiectare pe care o face utilă pentru crearea unui design OO. reutilizabil. Identifică clasele şi instanţele participante.Şabloane de proiectare Un şablon (pattern) ≡ o regulă care exprimă o relaţie dintre un context. în proiectarea software (OO software design) 47 /58 . o problemă şi o soluţie (Cristopher Alexander. rolurile şi colaborările lor şi distribuţia responsabilităţilor iniţial folosit în arhitectură ulterior.

The use of temporary pointers within normal C++ functions or class member functions may not be properly cleaned up if an exception is thrown. because the inline delete operator may be bypassed. Further. Constă în: o problemă comună o abordare generală pentru o soluţie consecinţele pentru a realiza un şablon Exemplu: Exemplu Consequences: The smart pointer makes the design more robust in the presence of thrown exceptions. their destructors are called. Raw pointers do not have destructors. to determine whether other smart pointers are referring to the same object in memory. The smart pointer is responsible for identifying if it must deallocate memory when the pointer is destroyed. Solution: rather than use a raw pointer. such as reference counting. This does not apply to objects. but it increases the code complexity somewhat and requires an additional level of indirection for each pointer reference. Problem: when exception handling is used. 48 /58 . because when objects go out of scope. reference counting should be disabled.cont. it involves a small run-time overhead. Although this can be made syntactically invisible to the user. Enforcement of the smart pointer policy cannot be automated. a smart pointer object can be used when a temporary pointer is needed. raw pointers can lead to memory leaks when exceptions are thrown. but must be ensured by consensus and review. if smart and raw pointers are both applied against the same object.Sabloane de proiectare . This require an interrral mechanism.

Exporta un numar de clase si mecanisme pe care utilizatorii le pot adapta. Cadrele (frameworks)–reprezintă colecţii de clase care oferă un set de servicii pentru un domeniu particular.ABORDĂRI GENERICE Idiomuri . 49 /58 .convenţii general acceptate de utilizare a unui anumit limbaj de programare. Şabloane de proiectare (DP) structuri în cadrul cărora obiectele colaborează în vederea obţinerii unui anumit comportament care să satisfacă o anumită cerinţă a problemei.

Exemple de şabloane 50 /58 .

51 /58 Șablonul e reprezentat ca un oval punctat din care săgeți punctate arată către clasele din cadrul șablonului . Exemplu: devine mai ușoară adăugarea unui nou container . deleteLast).Şablonul Interface De ce interfață ? O implementare comună poate fi potrivită pentru o varietate de utilizări. Dacă o clasă poate furniza diverse interfețe. devine mai ușoară schimbarea unei implementări sau adăugharea unei noi interfețe diferite. cozi sau stive pot de fapt să fie implementate ca liste înlănțuite. getLast. o singură implementare poate satisface multe necesități. Exemple: arbori.un vector extensibil – prin crearea unei interfețe care asigură clienților serviciile cerute de aceștia dar folosesc operațiile promitive ale containerelor existente Interfețele pot fi construite astfel ca să asigure diverse nivele de acces. Prin separarea de utilizator prin intermediul unei interfețe.UML funizează stereotipul <<interface>> Client Object are nevoie de un container tip stivă deci de un obiect myStack . Acesta nu gestionează direct colecția dar furnizează interfața potrivită pentru Client (precum metodele Push și Pop) dar implemenetază această interfață prrin utilizarea operațiilor furnizate de clasa de listă înlănțuită (insertAtEnd. Este un șablon foarte simplu .

Deși mecanismul e simplu. proiectarea de detaliu a clasei smart pointer ascunde multă funcționalitate. de asemenea Smart Pointer este un șablon uzual care elimină aceste surse de erori: Dacă pointerii obișnuiți nu au constructor.ablonul Smart Pointer Binecunoscute probleme sunt legate de utilizarea acestora în C++ : pot fi utilizați din greșeală înainte de a fi inițializați pot fi utilizați (tot din greșeală) după ce memoria către care arată a fost eliberată memoria poate (eventual) să nu fie eliberată după ce nu mai e necesară aritmetica pointerilor poate duce la erori de utilizare. smart pointers vor folosi constructori pentru a inițializa cu NULL sau a forța precondiții pentru ca pointerii să indice spre obiecte valide Dacă pointerii obișnuiți nu au destructor. smart pointers determină dacă memoria trebuie eliberată când nu mai e necesară Dacă pointerii obișnuiți încă mențin adresa memorie unde e obiectul utilizat. 52 /58 . dacă eliberarea memoriei nu se face corect. smart pointers pot automat detecta condiția că obiectul nu mai există și să refuze accesul.

Participanții în cadrul unui șablon Container: Container – gestionează colecția și furnizează operațiile de acces Iterator – acționează ca un smart pointer și mediază accesul de către Client (first. Adăugarea unui obiect container pentru a gestiona obiectele agregate nu rezolvă în întergime problema. next. cursul despre tipare).Şablonul Container Când un obiect are asociere 1-la-mai mulți și dorim să îmbunătățim reuzabilitatea. Client – obiectele care doresc accesul la obiectele Parte gestionate de Container Parte Parte – obiectele gestionate de Container inclusiv stocate de acesta 53 /58 .) la obiectele Parte. o soluție este ca acea clasă de la capătul “1” să gestioneze un set de obiecte stocate într-un container (v. deletion etc. chiar dacă un container în siner poate fi intern foarte complex. cursul despre tipare).parte a standardului ANSI C++ furniezează o varietate de containere și iteratori (v. deoarece adesea mai mulți clienți doresc să acceseze simultan containerul. Șablonul Container este foarte simplu. insertion. se folosesc iteratori în conjuncție cu containerele (țin evidența poziției din container a fiecărui client). Pentru a rezolva problema. Standard Template Library (STL) .

Pentru aplicații în timp real cu date citite de senzori. problema este cum proiectăm o modalitate eficientă de notificare (anunțare) a tuturor clienților Soluția: Șablonul Observer (sau PublishSubscribe) – un singur obiect (Server) furnizează automat date pentru clienții săi (Observers). episodic sau epi-periodic (amândouă) .Şablonul Observer Problema: este uzuală situația în care o singură sursă de informație acționează ca un server pentru mai mulți clienți care trebuie să își actualizeze autonom datele când acestea se schimbă. Observerii se înregistrează la server prin apelul metodei Subscribe() a acestuia și se dezabonează prin apelul metodei Detach() .periodic. Politica de actualizare definește criteriile după care datele sunt trimise la observer . crează un obiect Notification Handle care include adresa obiectului. Acestea sunt clase abstracte care au clase derivate (Concrete Server și Concrete Observer) care adaugă comportamentul specializat pentru situația concretă de funcționare. Atunci când serverul primește un apel subscribe. 54 /58 .

periodic. Acesta are o valoare dintr-o enumerare updatePolicy care conține valorile episodic. Atunci când această metodă este apelată. Acesta incrementează atributul CurrentTime . serverul scanează lista de notificare alcătuită din obiecte cu notificare periodică r Periodic Notification Handle la care valoarea trebuie actualizată. Atunci când metoda este apelată.Observer – cont. vor fi notificați asupra datelor. • Detach(target address) dez-abonează ceea ce a fost transmis prin Subscribe() prin ștergerea obiectului Notification Handle corespunzător obiectului cu adresa target address. . epiPeriodic. 1 Șablonul Observer este util dacă mulți clienți vor să acceseze un singur obiect. policy) adaugă obiectul indicat de target address la o listă de notiificare prin crearea unui obiect NotificationHandle. mesaje de date sunt trimise la toate obiectele din lista cu Episodic 55 /58 Notification Handles. Metodele de interes ale clasei sunt: • Subscribe(target address. conform politicii de actualizare definite. Clasa derivată specifică creată depinde de parametrul policy. Șablonul simplifică crearea acestor clienți deoarece după ce aceștia se înregistrează. • Gimme() permite o interogare directă a valorii urmărite • AcceptTick() este apelat de un obiect de asigurare a unei temporizări (precum timerele furnizate de sistemul de operare) care indică trecerea unui interval de timp sau contorizarea unei secvențe de eevnimente. Entitățile participante în șablon: Server este o clasă abstractă care definește interfața la care clasa abstractă observer aderă Folosește metoda Update() method a clasei Observer pentru a transmite valoarea către Observer. Concrete Server este o clasă derivată din Server și o extinde cu datele propriu-zise de interes și metoda Acquire(): • Acquire() preia datele concrete pentru server.

Atre metoda • Update(value) apelată de Server pentru pasarea valorii. precum și celelalte metode cerute de funcționarea dorită a clientului propriu-zis. care este o referință la funcția Update() din Observer. este o funcție callback (apel invers. obiectul Observer referit este acutalizat și TimeOfNextUpdate is recalculat. Este creată atunci când un Observer apelează Subscribe() și este distrusă când acesta apelează Detach(). 2 • • • Observer – clasa abstractă Observer apelează metoda Subscribe() a clasei Server pentru ca ulterior să fie notificată automat asupra datelor și metoda Detach() când nu mai dorește să fie la curent cu aceste date. Notification Handle este o referință locală la un Observer îmregistrat. înapoi) Concrete Observer – este o subclasă a clasei Observer și adaugă stocarea locală în atributele dorite. Setul tutuor Notification Handles este utilizat ca listă de notificare. • • Episodic Notification Handle – este o subclasă a Notification Handle și generează o ierarhie separată de clase cu baza Notification Handle . Clasa Server scanează Periodic Notification Handles periodic și atunci când s-a scurs perioada de notificare. Subclasa adaugă atributele Period șiTimeOfNextUpdate. deținută și gestionată de Server. Observers înregistați cu aceastăp politică sunt actualizați cu date oridecâteori aceste date se schimbă. 56 /58 . Conține atributul Object Address. Aceasta permite îmbunătățirea serviciilor clasei Observer în situația pierderii sau coruperii de mesaje. Periodic Notification Handle – este o subclasă a clasei Notification Handle și este utilizat pentru a notifica periodic Observers astfel înregistrați. Aceasta este utilizată de Server astfel încât acesta poate apela metodele Update() ale obiectelor Observer atunci când e cazul.Observer – cont. Din punct de vedere logic.

bătăile inimii pot fi vizualizate/prezentate în mai multe moduri: iconografic. un mic set de obiecte care colaborează și lucrează împreună pot să rezolve problema Este aplicabil în sistemele în timp real care au afișaje. Modul de prezentare nu are consecințe asupra modului de achiziție sau manipulare. numeric. • Poate fi implementat prin utilizarea pointerilor sau a metodelor publish-subscribe din Șablonul Observer. • Este o formă specializată de Șablon Observer.Şablonul Model-View-Controller (MVC) Este alcătuit din setul de componente ortogonale: Model – componenta de date și procesare specifică a aplicației (business model) View – cuprinde modul de afișare a rezultatelor Controller – recepționeză și procesează evenimentele din vizualizare Exemplu: într-un monitor ECG. 57 /58 . alarmă. în particular atunci când valorile trebuie controlate și afișate simultan. atunci abordarea cu subscriere este de preferat. Dacă obiectele se schimbă dinamic (în timpul rulării) sau dacă obiectele Controller sau View s-ar putea să nu fie cunoscute la compilare. grafic. Prin separarea acestei funcționalități. Exemplu: o valvă care este controlată de un buton cu valoare vizualizată sub formă de deschidere pe ecran. Exemplu: arhitectura document-view (v. cursul despre MFC) unde CDocument este clasa Model. sunet. metoda UpdateAllViews a acestei clase transmite actualizările iar OnUpdate din vizualizarea derivată din CView tratează actualizarea în fiecare vizualizare.

Vasile Stoicu-Tivadar Stoicu- .Mulțumesc pentru atenție atenție ! POO .