concepte, modele si practici care descriu esenta programarii – Programare structurata (functionala) = un program este conceput pe baza unei secvente de functii, fara a avea o stare – Programare orientata obiect = programele sunt vazute ca fiind niste colectii de obiecte care interactioneaza unele cu altele Programarea structurată • Programarea structurată - caracteristici: • se bazează pe descompunerea funcţională şi abordarea top- down (de sus în jos) • este focalizată aproape în întregime pe producerea de instrucţiuni (porţiuni de cod) necesare rezolvării unei anumite probleme; proiectarea structurilor de date nu reprezintă o prioritate în această abordare • funcţiile care manipulează aceleaşi structuri de date pot diferi ca şi convenţii de numire, listă de parametri, etc. făcînd dificilă utilizarea acestora iar codul astfel rezultat este greu de înţeles existînd de multe ori porţiuni semnificative de cod duplicat • codul rezultat este difícil de reutilizat în alte proiecte: datorită faptului că proiectarea începe pornind de la o problemă concretă dată, divizînd-o în părţi componente, tendinţa este aceea de a rezulta cod specific acelei probleme particulare • extinderea ulterioară a aplicaţiilor este dificilă Programarea orientata pe obiecte • Programarea orientata pe obiecte =.> reprezinta o tehnica de programare alternativă la programarea structurată care se bazează pe conceptul modular de obiect. Un obiect este un fascicul de informaţie care modelează un concept de nivel înalt din domeniul problemei pe care o implementeză. • abordare bottom-up (de sus in jos) • programarea orientată pe obiecte, avînd la bază conceptul de obiect şi conceptele fundamentale de încapsulare, moştenire şi polimorfism, prezintă următoarele avantaje : – paradigma transmiterii de mesaje între obiecte, caracteristică programării orientate pe obiecte furnizează o sintaxă clară şi consistentă pentru manipularea obiectelor; – obiectele sunt prevăzute cu un set complet de funcţii necesare şi suficiente pentru manipularea acestora – încapsularea previne accesul neautorizat şi necontrolat asupra datelor – moştenirea permite definirea de noi structuri de date pe baza altora existente, reutilizînd codul existent (şi testat) Obiecte • obiectul = reprezinta o componenta software care incorporeaza atit atribute cit si operatii (metode) care pot fi utilizate pentru manipularea obiectului (obiectelor) • paradigma schimbarii de mesaje intre obiecte furnizeaza o sintaxa consistenta pentru manipularea obiectelor => dezvoltare bazata pe responsabilitati (responsibility-guided development • obiectul = reflecta concetele domeniului in cod Obiecte • reprezinta conceptele constructive de baza ale sistemelor software – un program consta dintr-o colectie de obiecte care interactioneaza unele cu altele – obiectele coopereaza pentru realizarea unei anumite functionalitati prin transmiterea de “mesaje” unele catre altele • sunt caracterizate de: – capabilitati (functionalitate): ce pot sa faca – proprietati: descriu starea obiectului Clase • conceptul de clasa – class – este utilizat pentru a descrie un set de obiecte individuale la nivel abstract • clasa descrie proprietatile si capabilitatile comune a setului de obiecte • defineste un cadru (template) pentru crearea de instante Clase si obiecte
• clasele reprezintǎ elementele constructive de bazǎ ale programelor
dezvoltate în tehnologie obiectualǎ. • obiectele cu care programul lucreaza sunt concepute pe baza claselor definite în cadrul acestuia. • obiectul reprezinta entitatea fundamentala in POO: un obiect inglobeaza o abstractizare; un obiect in POO incapsuleaza atit o stare cit si o functionalitate. • obiectele reprezinta entitatile de baza ale unei aplicatii orientate pe obiecte • programarea orientata pe obiecte poate fi văzuta ca o schimbare continua de mesaje intre obiecte. • obiectul, in sine, este vazut ca o masina abstracta capabila sa raspunda acestor mesaje: totalitatea mesajelor la care este capabil sa raspunda un obiect este data de multimea metodelor asociate obiectului respectiv. • clasa (class), serveste la descrierea, la nivel abstract, a comportarii obiectelor care fac parte din acea clasa. Obiectele sunt numite instantieri sau instanţe ale acelei clase. Concepte fundamentale
• Incapsularea = previne accesul neautorizat asupra
datelor => ascunderea informatiei => mentenanta mai simpla • Mostenirea = permite definirea de noi structuri de date pe baza celor existente, prin adaugarea de noi caracteristici si facilitati => promoveaza reutilizarea codului • Polimorfismul = permite crearea de programe mult mai generale => promoveaza reutilizarea codului => utilizarea componentelor software in alte proiecte, cu impact semnificativ asupra costurilor si costurilor de dezvoltare ale aplicatiei Avantajele programarii orientate pe obiecte Programarea orientată pe obiecte, avînd la bază conceptul de obiect şi conceptele fundamentale de încapsulare, moştenire şi polimorfism, prezintă următoarele avantaje: • paradigma transmiterii de mesaje între obiecte, caracteristică programării orientate pe obiecte furnizează o sintaxă clară şi consistentă pentru manipularea obiectelor; • obiectele sunt prevăzute cu un set complet de funcţii necesare şi suficiente pentru manipularea acestora • încapsularea previne accesul neautorizat şi necontrolat asupra datelor • moştenirea permite definirea de noi structuri de date pe baza altora existente, reutilizînd codul existent (şi testat) Reutilizarea. Limbaje orientate pe obiecte • Reutilizarea reprezintă abilitatea unor componente software de a putea fi utilizate la construcţia mai multor aplicaţii software diferite. Beneficiile reutilizării se traduc în reducerea timpul de codificare/testare şi implicit a timpului de livrare precum şi a costurilor aplicaţiei. • Un limbaj orientat pe obiecte dispune de mecanismele-suport necesare utilizarii acestui stil de programare. Limbajul, deci, este inzestrat cu mecanismele care fac programarea orientata pe obiecte suficient de comoda Exemplu – definirea unei clase cu cimpuri de date si metode class Punct static void Main(string[] args) { { int x; //cimpurile de date //creaza un obiect din clasa Punct int y; // referinta //metodele Punct testpt = new Punct(); public void set_x(int xval){x=xval;} int coord_x, coord_y; public void set_y(int yval){y=yval;} //acces prin intermediul metodelor public int get_x(){return x;} testpt.set_x(5); public int get_y(){return y;} testpt.set_y(7); } coord_x = testpt.get_x(); coord_y = testpt.get_y(); Console.WriteLine("Coordonata x = "+coord_x+" Coordonata y = "+coord_y); Console.ReadKey(); } Exemplu – clase (obiecte) cu proprietati using System; class Program using System.Collections.Generic; { using System.Text; static void Main(string[] args) namespace FormeGeometrie { { //creare obiect din clasa Punct class Punct //referinta { Punct testpt = new Punct(); int m_x; testpt.X=5; //setarea proprietatii X int m_y; testpt.Y=7; //setarea proprietatii Y public int X //definire proprietatea X //afisare proprietati { Console.WriteLine("Coordonata x = get { return m_x; } "+testpt.X+" Coordonata y = set { m_x = value; } "+testpt.Y); } Console.ReadKey(); public int Y //definire proprietatea Y } { } get { return m_y; } } set { m_y = value; } } } Cimpuri si proprietati • pentru cîmpuri se rezervǎ loc de memorie, acestea conţinînd datele propriu- zise ale unei clase. • proprietǎţile oferǎ doar acces la date, dar nu reprezintǎ datele propriu-zise. • proprietǎţile par sǎ atenueze diferenţa între cod şi date: pentru un program care utilizeazǎ o clasǎ, proprietǎţile aratǎ ca nişte cîmpuri de date, chiar dacǎ ele reprezintǎ de fapt cod. În multe situaţii, o proprietate publicǎ asigurǎ altor clase accesul la un cîmp privat al clasei. • proprietatea are, spre deosebire de cîmp, avantajul cǎ poate face în plus şi verificǎri de validitate. • proprietǎţile pot fi private sau publice, de tip read/write, read-only sau write- only. • în C#, proprietǎţile nu pot avea parametri (în Visual Basic, de exemplu, acest lucru fiind posibil).. • sintaxa generalǎ pentru o proprietate de tipul read/write este urmǎtoarea:
public tip_proprietate NumeProprietate
{ get { aici se returneaza o valoare } set { aici se atribuie o valoare } } Proprietati auto-implementate • valabile pentru versiunea C# 3.0 class Punct • proprietatile auto- { implementate furnizeaza o //definire proprietatea X public int X maniera mai simpla si { get; set; } concisa de a de a defini proprietati, atunci cind //definire proprietatea Y implementarea acestora nu public int Y { get; set; } necesita cod aditional …… • compilatorul creaza un cimp } privat care poate fi accesat doar prin intermediul proprietatii (get/set) Structura generala a unei clase • cîmpuri de date • proprietăţi • metode – inclusiv constructori şi destructor • elemente de indexare • delegaţi • evenimente • eventual, alte clase încuibate Clase incuibate • Clasele încuibate sunt declarate în interiorul • Instanţierea unui obiect dintr-o clasă unor alte clase; în esenţă, ele se comportă încuibată poate fi realizată astfel: ca şi clasele obişnuite, pot conţine metode şi cîmpuri de date, etc.: Clasa_Incuibata.Incuibata obj = new Clasa_Incuibata.Incuibata(); class Clasa_Incuibata Console.WriteLine("Valoarea membru_in = { "+obj.Membru_In()); public int membru_out; Console.WriteLine("Valoarea alt_membru_out = public static int alt_membru_out = 13; "+Clasa_Incuibata.alt_membru_out); //definire clasa incuibata public class Incuibata • Metodele clasei încuibate pot accesa toţi { membri acesteia dar nu pot accesa decît int membru_in; membri statici ai clasei exterioare (deci, public Incuibata() accesul la alt_membru_out este posibi în { schimb la membru_out nu). În consecinţă, membru_in = 0; nu este necesar să existe o instanţă a clasei } exterioare pentru a crea o instanţă a clasei încuibate. De asemenea, crearea unei public int Membru_In() instanţe a clasei exterioare nu implică { crearea unei instanţe a clasei încuibate. return membru_in; } } } Structuri in C# using System; class Program using System.Collections.Generic; { using System.Text; static void Main(string[] args) namespace Structuri { { Coordonate punct1 = new Coordonate(10, 20); struct Coordonate Coordonate deplasare = new Coordonate(20, 35); { Coordonate punct2; public int x; punct2 = punct1.Deplaseaza(deplasare); public int y; Console.WriteLine("noile coordonate punct2: public Coordonate(int x, int y) x= "+ punct2.x + " y = " + punct2.y); { Console.ReadKey(); //evitarea conflictelor de nume folosind this } this.x = x; } this.y = y; } } • variabilele de tip struct pot fi instanţiate cu new, desi acest lucru un e necesar public Coordonate Deplaseaza • structurile pot fi utilizate ca şi tipurile valoare: (Coordonate pt) • structurile nu pot avea destructori { • structurile nu pot moşteni sau nu pot fi //crearea unei variabile struct fără instanţiere moştenite , ca şi în cazul claselor; în schimb, cu new structurile pot implementa una sau mai multe Coordonate nou; interfeţe nou.x = x + pt.x; • în general, utilizarea structurilor implică un nou.y = y + pt.y; overhead mai mic decît alternativa claselor, return nou; datorită faptului că acestea sunt tip valoare (stocate pe stivă) şi nu referinţă (stocate în } heap). } Spatii de nume (1) • un spaţiu de nume în MicroSoft .NET este asemănător cu un container de obiecte. • poate conţine o serie de elemente precum: clase, structuri, interfeţe, enumeratori, delegaţi • utilizat pentru organizarea ierarhică a programelor, care are ca şi consecinţă directă evitarea conflictelor de nume în cadrul unui proiect complex (nume de clase, funcţii, variabile) • în MicroSoft .NET, fiecare program este creat împreună cu un spaţiu de nume implicit, aşa numitul spaţiu de nume global. În cadrul programului însă pot fi create şi alte spaţii de nume, fiecare cu un nume distinct, şi conţinînd propriile clase, funcţii, variable sau chiar alte spaţii de nume, al căror nume trebuie să fie unic în cadrul spaţiului de nume respectiv. • conceptul de spaţiu de nume (namespace) faciliteazǎ de asemenea utilizarea bibliotecilor de clase de la diverşi furnizori şi care ar putea conţine clase cu nume similare. Pentru declararea unui spaţiu de nume în C# se utilizează cuvîntul cheie namespace. Spatii de nume (2) namespace Compania1.BibliotecaUtila { .. directiva using utilizată class ClasaUtila {....} pentru a se specifica, la } începutul programului, la namespace Compania2.BibliotecaExtinsa ce spaţiu sau spaţii de nume se face referire (se { doreşte utilizarea claselor .. incluse î class ClasaUtila {....} n cadrul acelor spaţii de } nume) Compania1.BibliotecaUtila.ClasaUtila Compania2.BibliotecaExtinsa.ClasaUtilǎ
• MicroSoft .NET Framework defineşte peste 90 de spaţii de nume care
încep cu cuvîntul System şi 5 spaţii de nume care încep cu cuvîntul MicroSoft: System, System.Drawing, System.Windows.Forms, etc. - fiecare clasǎ definitǎ în cadrul unui proiect va fi plasatǎ în cadrul unui spaţiu de nume propiu proiectului şi se specificǎ prin directiva using ce spaţii de nume utilizeazǎ clasa respectiva • spaţiile de nume permit de asemenea atribuirea de nume existente deja în .NET Framework în cadrul programelor dezvoltate. Încapsularea şi controlul accesului (1) • încapsularea implică faptul că structura internă a obiectului este ascunsă total sau parţial de obiectele din exteriorul său; accesul se realizează prin intermediul aşa numitei interfeţe publice a obiectului respectiv în mod controlat şi sigur. • este de dorit să se ascundă starea internă a unui obiect faţă de accesul direct din afara clasei prin intermediul aşa numiţilor membri wrapper care garantează consistenţa informaţiilor accesate, controlul accesului putȃnd fi realizat prin intermediul modificatorilor de acces asociaţi membrilor clasei • încapsularea presupune reuniunea în cadrul claselor a structurilor de date împreună cu codul necesar prelucrării acestor structuri • implică modularitate, si reprezintă mecanismul prin care se combina structuri de tip inregistrare (cimpuri de date) cu proceduri si functii (metode) care manipulează cimpurile de date ale structurilor, formind un nou tip de date numit clasa. Încapsularea şi controlul accesului (2) • private, protected si public controlează accesul atit la cimpurile unui obiect cit si la metodele şi propietăţile acestuia, in urmatoarea maniera: • Private - elementele sunt direct accesibile numai in interiorul clasei; altfel, din exterior accesul trebuie sa se faca numai prin metode definite explicit, şi care nu sunt private (publice sau protected, dupǎ caz). In mod automat, dacǎ nu se specificǎ nimic în acest sens, in C# elementele respective (cîmpuri de date, proprietăţi sau metode) se considerǎ implicit private; totuşi este indicată precizarea explicită a acestuia. • Protected - reprezinta nivelul doi de acces, mai putin restrictiv decit private, care permite membrilor claselor derivate sa aibe acces direct la datele private ale claselor stramosi Încapsularea şi controlul accesului (3) • public - reprezinta nivelul trei de acces, in mod normal utilizat numai pentru metode sau proprietǎţi, si care confera acestora proprietatea de a fi accesate in mod direct, de oriunde din afara obiectului • internal permite accesul prin program numai în cadrul aceluiaşi ansamblu; modificatorul internal este de regulă utilizat în cazul în care se crează o bibliotecă de clase pentru a restricţiona accesul din afară la codul declarat internal. • protected internal reprezintă o combinaţie a celor doi modificatori implicaţi adică şi protected şi internal: permite accesul din cadrul aceluiaşi ansamblu dar şi din clase derivate care nu fac parte din acelaşi ansamblu. • modificatorii de acces pot fi aplicaţi şi tipurilor de date (claselor); însă tipurile de date acceptă doar doi modificatori de acces: public şi internal (implicit); internal implică accesul numai la tipurile definite în cadrul aceluiaşi ansamblu (assembly). Structura generala a unui using System; program C# • Observaţie: în C# nu sunt permise metode şi namespace UnNamespace variabile globale: acestea trebuie sǎ fie conţinute { fie într-o clasǎ sau într-o structurǎ class OClasa • aplicaţiile C# sunt constituite din mai multe { ... } fişiere; fiecare fişier poate conţine mai multe struct OStructura spaţii de nume { ... } • in cadrul unui spaţiu de nume sunt definite interface OInterfata tipurile necesare aplicaţiei care pot fi de { ... } urmǎtoarele categorii: clase, structuri (struct), delegate int UnDelegat(); interfeţe, enumerǎri, delegaţi. Spaţiul de nume enum OEnumerare (namespace) poate conţine mai multe clase cu { ... } nume diferite şi funcţionalităţi înrudite. namespace • în cadrul unui spaţiu de nume mai poate apărea UnNamespaceIncuibat definiţia unui alt spaţiu de nume, caz în care { avem de-a face cu spaţii de nume imbricate struct OStructura • mai pot fi definite de asemenea structuri, { ... } interfeţe şi delegaţi. } • pentru a facilita dezvoltarea aplicaţiilor class ClasaMain complexe, la care, de regulă, sunt implicaţi mai { mulţi programatori, există posibilitatea de a static void Main(string[] segmenta aplicaţia în mai multe fişiere aşa args) numitele ansambluri (assembly). Într-un { //... ansamblu se pot implementa mai multe spaţii de } nume sau părţi ale aceluiaşi spaţiu de nume se } pot regasi în mai multe ansamble. }