Documente Academic
Documente Profesional
Documente Cultură
3
3
4
6
6
8
20
20
20
CAPITOLUL 1
Introducere n universul obiectelor
nainte de alte explicaii i dezbateri mai mult sau mai puin
academice, fiindc sintagma cel mai des utilizat este modelul obiectual,
credem c este util o clarificare din capul locului a nelesului ct de ct
formal sau mcar att ct se poate la acest moment, asupra acestei noiuni.
Modelul obiectual reprezint un model de abstractizare i formalizare
a soluiilor software la probleme din diverse domenii (n particular i
domeniul economic), avnd la baz conceptul de obiect. Domeniul
concret, abstractizat n contextul software, l vom numi domeniul afacerii,
iar formalizarea acestuia avnd la baz conceptele legate de obiect o vom
numi modelul orientat obiect al afacerii.
Dincolo de elementele revoluionare n domeniul proiectrii i
programrii pe care le promoveaz fa de abordarea structurat,
promotorii modelului obiectual au avut n vedere o deschidere ct mai
larg spre construirea unor structuri ct mai flexibile din punct de vedere
semantic. Prin urmare, pe lng obiectivul creterii productivitii ca
urmare a reutilizrii (de la nivelul structurilor conceptuale pn la
componentele software concrete), modelul obiectual ncearc s pun la
dispoziie un instrumentar care s compatibilizeze ct mai bine
abstraciunile din contextul software cu cele din domeniul problemei
reale. De altfel, latura semantic constituie unul din factorii cheie ai
proliferrii modelului orientat obiect, n special n sfera problemelor
legate de implementarea a ceea ce generic este indicat prin logica
afacerii, la fel ca i n cazul mediilor vizuale1 care au revoluionat
dezvoltarea aplicaiilor prin valorificarea orientrii lor obiectuale.
Prin medii vizuale putem nelege nu doar instrumente pentru construirea grafic a
interfeelor utilizator, ci inclusiv pentru proiectarea aplicaiilor (vezi instrumentele
CASE) sau asamblarea funcional a componentelor reutilizabile (un exemplu mai recent
este cadrul de lucru OpenBlocks, http://dspace.mit.edu/handle/1721.1/41550, rencarnat
n Google App Inventor, http://appinventor.googlelabs.com/about/).
Anexe
Anexe
Anexe
3. comportament, modul de manifestare a obiectelor ca urmare a
interaciunii cu alte obiecte;
4. interaciuni, pentru a descrie schimbul de mesaje: cereri i
rspunsuri, n contextul realizrii colaborrilor.
Limbajele de modelare orientate obiect, cum este UML3, folosesc
pentru a reprezenta aceste concepte elemente specifice cum ar fi:
1. atribut, proprietate sau caracteristic informaional a unui obiect;
2. operaie,
a. sarcin de care poate fi responsabil, tie s o duc la
ndeplinire sau tie s o realizeze, deci o asum, un obiect;
b. cerere care poate fi adresat, pe care o poate satisface sau
de care poate rspunde un obiect;
3. mesaj, baza comunicrii cererilor i schimbului de informaii
ntre obiecte;
4. legtur sau relaie, cale sau canal de comunicare;
5. navigabilitate, direcie de comunicare.
Tabelul 1.1 Sumar al cadrului conceptual pe care se fundamenteaz modelele
orientate obiect
Concepte
fundamentale
Limbajul unificat de
modelare
Identitate
Stare
Atribut
Comportament
Interaciuni
Limbaje de
programare
orientate obiect
Anexe
Anexe
Pentru a simplifica enunurile de mai sus, atuci cnd am
conceptualizat obiectele, am spus c acestea ar trebui s-i asume un set
de responsabiliti, de fapt aceste responsabiliti se vor materializa sub
forma atributelor i operaiilor.
O responsabilitate reprezint o obligaie, o ndatorire, a obiectelor
unei clase. La nivelul cel mai abstract, atributele i operaiile
corespunztoare unei clase sunt de fapt caracteristicile prin care sunt
realizate sau ndeplinite responsabilitile obiectelor acesteia:
Anexe
java.util.Date dataContabilizare;
// membru referin multiplicitate > 1
InregistrareContabila[] inregistrari;
}
Anexe
// Listing 1.3: Iniializare membri, statici i non-statici
//-------------------------------------------------------public class TestCreareObiecte {
public static void main(String[] args){
Cont.numeOrganizatie = "Gama SA";
Cont c_411 = new Cont();
c_411.cod = "411";
c_411.denumire = Clienti";
System.out.println(c_411.getClass() + : c_411 [" +
c_411.cod + , + c_411.denumire
+ , + c_411.numeOrganizatie + ]");
Cont c_401 = new Cont();
c_401.cod = 401";
c_401.denumire = Furnizori";
System.out.println(c_401.getClass() + : c_401 [" +
c_401.cod + , + c_401.denumire
+ , + c_401.numeOrganizatie + ]");
InregistrareContabila i1 = new InregistrareContabila();
i1.id = 1;
i1.nrOrdine = 1;
i1.tip = Debit";
i1.suma = 120.0;
System.out.println(i1.getClass() + : i1 [" +
i1.id + , + i1.tip + , + i1.suma + ]");
InregistrareContabila i2 = new InregistrareContabila();
i2.id = 2;
i2.nrOrdine = 1;
i2.tip = Credit";
i2.suma = 120.0;
System.out.println(i2.getClass() + : i2 [" +
i2.id + , + i2.tip + , + i2.suma + ]");
OperatiuneContabila o = new OperatiuneContabila();
o.idOperatiune = 1;
o.dataContabilizare = new java.util.Date();// data curenta
System.out.println(o.getClass() + : o [" +
o.idOperatiune + , +
o.dataContabilizare + ]");
}
}
Anexe
n Java, iniializarea implicit respect urmtoarele reguli:
10
Anexe
i2.id = 2;
i2.nrOrdine = 1;
i2.tip = Credit";
i2.suma = 120.0;
System.out.println(i2.getClass() + : i2 inainte [" +
i2.id + , + i2.tip + , +
i2.cont + , + i2.suma + ]");
i2.cont = c_5121;
System.out.println(i2.getClass() + : i2 dupa [" +
i2.id + , + i2.tip + , +
i2.cont.cod + , + i2.suma + ]");
OperatiuneContabila o = new OperatiuneContabila();
o.idOperatiune = 1;
o.dataContabilizare = new Date(); // data curenta
System.out.println(o.getClass() + ": o ["
+ o.idOperatiune + ,
+ o.dataContabilizare + ]");
}
}
//-------------------------------------------------------Rezultat:
//-------------------------------------------------------class app.model.contabilitate.Cont: c_411 [411, Clienti, Gama SA]
class app.model.contabilitate.Cont: c_401 [5121, Cont banca, Gama
SA]
class app.model.contabilitate.InregistrareContabila: i1 inainte
[1, Debit, null, 120.0]
class app.model.contabilitate.InregistrareContabila: i1 dupa [1,
Debit, 411, 120.0]
class app.model.contabilitate.InregistrareContabila: i2 inainte
[2, Credit, null, 120.0]
class app.model.contabilitate.InregistrareContabila: i2 dupa [2,
Credit, 5121, 120.0]
class app.model.contabilitate.OperatiuneContabila: o [1, Sun Jan
10 17:22:59 EET 2010]
11
Anexe
12
Anexe
public class OperatiuneContabila {
static String debit = Debit";
static String credit = Credit";
Integer idOperatiune;
Date dataContabilizare;
InregistrareContabila[] inregistrari;
public OperatiuneContabila() {
}
public OperatiuneContabila(Integer idOperatiune,
Date dataContabilizare,
InregistrareContabila[] inregistrari) {
this.idOperatiune = idOperatiune;
this.dataContabilizare = dataContabilizare;
this.inregistrari = inregistrari;
}
}
13
Anexe
i2.id + , + i2.tip + , +
i2.cont.cod + , + i2.suma + ]");
OperatiuneContabila o =
new OperatiuneContabila(1, new Date(), null);
System.out.println(o.getClass() + : o [" +
o.idOperatiune + , + o.dataContabilizare + ]");
}
}
n structura unui obiect, din punct de vedere conceptual, un membruvariabil de instan este caracterizat i prin multiplicitate (pe lng nume
i tip, aa cum am artat mai sus). Practic vorbind, n cazul limbajului
Java, atunci cnd un membru-variabil de instan trebuie s gestioneze
mai multe valori de acelai tip, ceea ce nseamn c din punct de vedere
conceptual este vorba de o multiplicitate > 1, atunci, varianta cea mai
direct presupune c acel membru va fi de fapt de tip array.
14
Anexe
Cont.numeOrganizatie = Gama SA";
Cont c_411 = new Cont("411", Clienti");
Cont c_5121 = new Cont("5121", Cont banca");
// Declarare tablou
InregistrareContabila[] inregistrariContabile;
// Iniializare tablou
inregistrariContabile = new InregistrareContabila[2];
// Iniializare explicit a elementelor
inregistrariContabile[0] = new InregistrareContabila(1, 1,
Debit", 120.0, c_411);
inregistrariContabile[1] = new InregistrareContabila(1, 1,
Credit", 120.0, c_5121);
OperatiuneContabila o =
new OperatiuneContabila(1,
new Date(), inregistrariContabile);
System.out.println(o.getClass() + : o [" +
o.idOperatiune + , + o.dataContabilizare + , +
o.inregistrari.length + ]");
}
}
//-------------------------------------------------------Rezultat:
//-------------------------------------------------------class app.model.contabilitate.OperatiuneContabila: o [1, Sun Jan
10 17:41:24 EET 2010, 2]
15
Anexe
Cont c_411 = new Cont("411", Clienti");
Cont c_5121 = new Cont("5121", Cont banca");
InregistrareContabila[] inregistrariContabile =
{
new InregistrareContabila(1, 1,"Debit", 120.0, c_411),
new InregistrareContabila(2, 1,"Credit", 120.0, c_5121)
};
OperatiuneContabila o =
new OperatiuneContabila(1, new Date(),
inregistrariContabile);
System.out.println(o.getClass() + : o [" +
o.idOperatiune + , + o.dataContabilizare + , +
o.inregistrari.length + ]");
// parcurgere elemente tablou
for (InregistrareContabila i : o.inregistrari){
System.out.println(i.getClass() + : i [" +
i.id + , + i.tip + , +
i.cont.cod + , + i.suma + ]");
}
}
}
//-------------Varianta 2 ----------------------------public class TestCreareObiecte5 {
public static void main(String[] args){
Cont.numeOrganizatie = Gama SA";
Cont c_411 = new Cont("411", Clienti");
Cont c_5121 = new Cont("5121", Cont banca");
OperatiuneContabila o =
new OperatiuneContabila(1, new Date(),
new InregistrareContabila[]{
new InregistrareContabila(1, 1,"Debit",
120.0, c_411),
new InregistrareContabila(2, 1,
"Credit", 120.0, c_5121)
}
);
System.out.println(o.getClass() + : o [" +
o.idOperatiune + , + o.dataContabilizare + , +
16
Anexe
o.inregistrari.length + ]");
// parcurgere elemente tablou
for (int i = 0; i < o.inregistrari.length; i++){
System.out.println(o.inregistrari[i].getClass() +
": i" + i + [" + o.inregistrari[i].id +
", + o.inregistrari[i].tip + , +
o.inregistrari[i].cont.cod +
", + o.inregistrari[i].suma + ]");
}
}
}
17
Anexe
// Listing 1.7: Exemplu iniializare list
//-------------------------------------------------------public class OperatiuneContabila {
static String debit = Debit";
static String credit = Credit";
Integer idOperatiune;
Date dataContabilizare;
List<InregistrareContabila> inregistrari =
new ArrayList<InregistrareContabila>();
// fata de: InregistrareContabila[] inregistrari
public OperatiuneContabila() {
}
public OperatiuneContabila(Integer idOperatiune,
Date dataContabilizare,
List<InregistrareContabila> inregistrari) {
this.idOperatiune = idOperatiune;
this.dataContabilizare = dataContabilizare;
this.inregistrari = inregistrari;
}
}
//-------------------------------------------------------public class TestCreareObiecte_6 {
public static void main(String[] args){
Cont.numeOrganizatie = Gama SA";
Cont c_411 = new Cont("411", Clienti");
Cont c_5121 = new Cont("5121", Cont banca");
List<InregistrareContabila> inregistratiContabile =
new ArrayList<InregistrareContabila>();
inregistratiContabile.add(new InregistrareContabila(1,
1,"Debit", 120.0, c_411));
inregistratiContabile.add(new InregistrareContabila(2,
1,"Credit", 120.0, c_5121));
OperatiuneContabila o =
new OperatiuneContabila(1,
new Date(),inregistratiContabile);
System.out.println(o.getClass() + : o [" +
o.idOperatiune + , + o.dataContabilizare +
18
Anexe
", + o.inregistrari.size() + ]");
for (InregistrareContabila i : o.inregistrari){
System.out.println(i.getClass() + : i [" +
i.id + , + i.tip + , +
i.cont.cod + , + i.suma + ]");
}
}
}
19
Anexe
Anexe
Metodele reprezint formal blocuri de instruciuni care:
De multe ori termenii de operaie i metod sunt folosii interschimbabil. Cu preponderen n contextul claselor se folosete termenul
metode, iar n contextul interfeelor se folosete termenul operaii. Acetia
reprezint totui concepte diferite, operaia reprezint doar o specificaie
de interaciune, formatul mesajelor de interaciune, iar metodele
reprezint formele concrete de re-aciune a obiectelor la aceste mesaje. Pe
scurt, spunem c metodele reprezint implementarea operaiilor.
Structurilele specifice care pot forma blocul de instruciuni ce
concretizeaz o metod constau n:
structuri de date:
variabile interne;
invocarea variabilelor de instan, declarate la nivelul
clasei;
parametri;
structuri de control:
alternative, simple sau generalizate;
repetitive;
recursive.
21
Anexe
<bloc de instruciuni>
} break;
case <valoare int/Integer> : {
<bloc de instruciuni>
} break; // in lips va continua i evaluarea
// celorlalte ramuri introduse prin valori int/Integer
.. ... ...
default <valoare int/Integer> : {
<bloc de instruciuni>
} break;
}// end switch ------------------------------------while (<expr-boolean>) {
<bloc de instruciuni>
break; // prsire bloc while
continue; // salt la iteraia urmtoare
<bloc de instruciuni>
}// end while ------------------------------------for (<iniializare increment>;
<expr-boolean>; <expr-incrementare>){
<bloc de instruciuni>
break;
continue;
<bloc de instruciuni>
}// end for simplu ------------------------------------for (<iniializare var parcurgere elemente> :
<nume tablou sau colecie>){
<bloc de instruciuni>
break;
continue;
<bloc de instruciuni>
}// end for parcurgere colecie ------------------------
22
Anexe
// Listing 1.9: Exemplu iniializare list
//------------------------------------------------------public class ServiciuOperatiuni {
//declaratie operatie
public Double getSold(OperatiuneContabila o)
{ // start metoda implementare operaie
return getDebit(o) - getCredit(o);
} // sfrit metoda implementare operaie
public Double getDebit(OperatiuneContabila o //parametru ){
Double debit = 0.0; // variabila intern
for (InregistrareContabila i: o.inregistrari){
if (i.tip == OperatiuneContabila.debit)
debit += i.suma;
}
return debit;
}
public Double getCredit(OperatiuneContabila o){
Double credit = 0.0;
for (InregistrareContabila i: o.inregistrari){
if (i.tip == OperatiuneContabila.debit)
credit += i.suma;
}
return credit;
}
}
//-------------------------------------------------------public class TestCreareObiecte_7 {
public static void main(String[] args){
Cont.numeOrganizatie = Gama SA";
Cont c_411 = new Cont("411", Clienti");
Cont c_5121 = new Cont("5121", Cont banca");
List<InregistrareContabila> inregistratiContabile =
new ArrayList<InregistrareContabila>();
inregistratiContabile.add(
new InregistrareContabila(1, 1,
"Debit", 120.0, c_411));
inregistratiContabile.add(
new InregistrareContabila(2, 1,
"Credit", 120.0, c_5121));
23
Anexe
OperatiuneContabila o =
new OperatiuneContabila(1, new Date(),
inregistratiContabile);
ServiciuOperatiuni s = new ServiciuOperatiuni();
Double sold = s.getSold(o); // invocare operatie
System.out.println(o.getClass() + : o [" +
o.idOperatiune + , + o.dataContabilizare +
", + sold = + sold + ]");
for (InregistrareContabila i : o.inregistrari){
System.out.println(i.getClass() + : i [" +
i.id + , + i.tip + , +
i.cont.cod + , + i.suma + ]");
}
}
}
//-------------------------------------------------------Rezultat
//-------------------------------------------------------class app.model.contabilitate.OperatiuneContabila: o [1, Sun Jan
10 18:27:19 EET 2010, sold = 0.0]
class app.model.contabilitate.InregistrareContabila: i [1, Debit,
411, 120.0]
class app.model.contabilitate.InregistrareContabila: i [2, Credit,
5121, 120.0]
24