Sunteți pe pagina 1din 23

Paradigme de programare

• Paradigme de programare = un set de


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.
}

S-ar putea să vă placă și