Administratie | Alimentatie | Arta cultura | Asistenta sociala | Astronomie |
Biologie | Chimie | Comunicare | Constructii | Cosmetica |
Desen | Diverse | Drept | Economie | Engleza |
Filozofie | Fizica | Franceza | Geografie | Germana |
Informatica | Istorie | Latina | Management | Marketing |
Matematica | Mecanica | Medicina | Pedagogie | Psihologie |
Romana | Stiinte politice | Transporturi | Turism |
METODE VIZUALE - C#
1 Introducere
C# este un limbaj de programare conceput pentru a se putea crea cu ajutorul sau o gama variata de programe. care pot fi rulate folosind .NET framework. C# este un limbaj simplu, puternic tipizat. C# este limbaj de programare care foloseste paradigma programarii orintate pe obiecte. Cu multele sale inovatii C# permite dezvoltarea rapida de aplicatii retinand de asemenea expresivitatea si eleganta limbajelor bazate pe sintaza C.
.NET framework pune la dispozitie o gama larga de operatii care se pot executa care accelereaza timpul de dezvoltare a unei aplicatii. Aceste operatii sunt realizate cu ajutorul unor clase bine proiectate.
Dupa compilarea unui program C# acesta este transcris in IL (Intermediate Language). In acest fel cu ajutorul CTS (Common Type System) si CLS (Common language specification) acelasi program poate fi create in oricare limbaj care suporta .NET framework astfel intre .NET framework si C# exista o legatura bijectiva.
Avantajele folosirii .NET framework:
POO - NET. framework si C# sunt bazate in intregime pe paradigma programarii orientate pe obiecte din start
Un bun design - Toate clasele din .NET framework sunt construite din start intr-o maniera intuitiva si eficienta
Multilimbaj - Toate programele din orice limbaj care suporta .NET framework sunt compilate intr-un limbaj comun Intermediate Language astfel aceste limbaje sunt interoperabile intr-un mod in care nu au mai fost pana acum
Un bun suport pentru paginile web dinamice
Un bun suport pentru accesul la date - Un de componente .NET cunoscut sub numele de ADO.NET asigura accesul la bazele de date relationale. Alte componente asigura accesul la fisiere, directoare si XML.
Securitate imbunatatita
Instalare foarte usoara a programelor create in .NET datorita suportului oferit pentru versiuni si faptului ca .NET este multiplatforma
Suport pentru servicii web
Rezultatul compilarii unui program din C# este un assembly sau un modul, din mai multe module putandu-se crea un assembly. Un assembly este o unitate care se descrie singura avand toate informatiile necesare folosirii acestuia in interiorul sau. De exemplu are informatii despre: tipurile care sunt definite, versiunea sa, alte assembly care sunt necesare etc. Acelasi assembly poate fi incarcat de mai multe ori in memoria folosita de acelasi proces daca versiunile acestui assembly sunt diferite. Assembly-urile sunt de doua tipuri: private si publice. Assembly-urile private sunt folosite de o singura aplicatie iar pentru instalarea acestui tip de assembly este necesara doar copierea acestuia in directorul aplicatiei. Assembly-urile publice pot fi folosite de mai multe aplicatii iar pentru instalarea lor trebuie urmata o procedura speciala acestea fiind instalate in GAC (Global Assembly Cache). Pentru instalarea acestor assembly este nevoie de o cheie privata la care are acces numai cel care instaleaza assembly-ul dorit. Daca se doreste inlocuirea acestui assembly el nu poate fi inlocuit decat daca se cunoaste cheia privata cu care a fost instalat. Acesta metoda de instalare este una din multele metode prin care .NET incearca sa imbunatateasca securitatea aplicatiilor.
2 Clase. Obiecte. Proprietati. Metode
Toate tipurile din .NET framework(inclusiv din C#) au o clasa de baza din care sunt derivate, aceasta clasa se numeste object. In C# este facuta distinctia intre tipurile valoare si referinta. Variabilele de tip valoare sunt retinute pe stiva. Variabilele de tip referinta se memoreaza in managed heap. Continutul unei variabile de tip valoare este chiar valoarea care trebuie retinuta de tip. Exemple de tipuri valoare: int, float, unsigned int etc. Alte tipuri valoare sunt cele declarate ca fiind struct sau enum. Continutul unei variabile de tip referinta este o referinta catre locul unde se retine informatia propriu-zisa. Exemplu tip referinta : tipul string.
Pana la aparitia programarii orientate pe obiect programele erau implementate in limbaje de programare procedurale(C, Pascal) sau in limbaje care nici macar nu ofereau o modalitate de grupare a instructiunilor in unitati logice(functii, proceduri) cum este cazul limbajului de asamblare(assembler). Altfel spus o problema preluata din natura trebuia fragmentata in repetate randuri astfel incat sa se identifice elementele distincte, implementabile intr-un limbaj de programare. O mare problema a programarii procedurale era separarea datelor de unita ile care prelucrau datele(subrutinele), ceea ce facea foarte dificila extinderea si intretinerea unui program. Astfel s-a pus problema ca aceste doua entitati(date si subrutine) sa fie grupate intr-un anumit mod, astfel incat subrutinele sa 'stie' in permanenta ce date prelucreaza si, mai mult decat atat, ele sa formeze un modul, adica o unitate care separa implementarea de interfata, ceea ce implica posibilitatea refolosirii codului. A aparut astfel conceptul de clasa. Clasa realizeaza, in speta, ceea ce am vazut mai inainte: grupeaza datele si unitatile de prelucrare a acestora intr-un modul, unindu-le astfel intr-o entitate mult mai naturala. Desi tehnica se numeste 'Programare Orientata Obiect', conceptul de baza al ei este este Clasa. Clasa, pe langa faptul ca abstractizeaza foarte mult analiza/sinteza problemei are proprietatea de generalitate, ea desemnand o multime de obiecte care impart o serie de proprietati.
De exemplu: Clasa 'floare' desemneaza toate plantele care au flori, precum clasa 'Fruct' desemneaza toate obiectele pe care noi le identificam ca fiind fructe. Bineinteles, in implementarea efectiva a programului nu se lucreaza cu entitati abstracte, precum clasele ci se lucreaza cu obiecte, care sunt 'instantieri' ale claselor. Altfel spus, plecand de la exemplul de mai sus, daca se construieste un program care sa lucreze cu fructe, el nu va prelucra entitatea 'fruct' ci va lucra cu entitati concrete ale clasei 'fruct', adica 'mar', 'para', 'portocala', etc.
Apare insa urmatoarea problema: 'cum se trece de la o structura generala la una particulara, mai precis ce inseamna efectiv procesul de instantiere?'. Instantierea(trecerea de la clasa la obiect) inseamna atribuirea unor proprietati specifice clasei, astfel incat aceasta sa indice un obiect anume, care se diferentiaza de toate celelalte obiecte din clasa printr-o serie de atribute. Daca vom considera ca 'fruct_exotic' care desemneaza clasa tuturor fructelor exotice contine proprietatea 'culoare' atunci atribuind acesteia valoarea 'galben' noi vom crea o noua multime( clasa fructelor exotice care au culoarea galbena ) care este o subclasa a clasei 'fruct_exotic', deci realizam astfel o particularizare. Mai mult decat atat, daca vom adauga noi si noi atribute vom individualiza clasa astfel incat sa ajungem la un caz concret, care este Obiectul.
Sa consideram in continuare ca in magazin avem si fructe care trebuie pastrate la temperaturi joase. Pentru ele vom avea nevoie de un raft special. Acest nou raft(sa-l numim raft frigorific) este in esenta tot un raft doar ca are in plus proprietatea de racire. Acest lucru ne duce cu gandirea la faptul ca putem reutiliza codul scris pentru 'Raft' pentru a implementa o clasa numita 'RaftFrigorific'. Altfel spus, dorim ca noua noastra clasa sa fie o subclasa a clasei 'Raft' deoarece ea 'are toate proprietatile clasei 'Raft' plus altele particulare, care o diferentiaza'. Acest lucru, in mod intuitiv, este numit mostenire. Mostenirea este o relatie statica(definita in momentul programarii) care pune in legatura o clasa cu alta(sau mai multe) astfel incat clasa rezultata sa 'preia' toate atributele clasei/claselor pe care o/le mosteneste. Clasa care mosteneste atributele altei clase se numeste 'clasa derivata' iar clasa care are mostenitori se numeste 'clasa de baza'. Terminologia este, si in acest caz, intuitiva. Unul din avantajele mostenirii, care se observa direct, este acela al reutilizarii codului: clasa derivata nu va mai implementa metodele clasei de baza, ci va implementa numai metodele ei specifice; mai mult clasa derivata va contine (prin intermediul mostenirii) toate atributele(date si subrutine sau 'metode') ale clasei de baza. Astfel spus si clasa 'RaftFrigorific' va avea atributele 'numar' si 'continut'. Mostenirea este de asemeni o relatie fundamentala in programarea orientata pe obiecte, care este recunoscuta ca fiind un principiu de baza, alaturi de incapsulare, si polimorfism.
Am vazut mai sus ca o clasa poate mosteni o alta clasa, ceea ce inseamna ca o entitate preia toate atributele altei entitati. Putem avea, de asemeni, mai multe clase care mostenesc o clasa. Fie clasa 'A' si clasele 'B', 'C' si 'D'; sa presupunem ca 'B', 'C', 'D' mostenesc pe 'A'. In acest caz putem face afirmatia: 'B, C si D sunt de tip A'. Aceasta inseamna ca B, C si D mostenesc toate caracteristicile clasei A deci pot fi identificate cu o clasa de tip A.
Facand o analogie cu exemplul anterior, daca A -> 'Fruct', B -> 'mar', C -> 'nuca', D -> 'pruna', afirmatia de mai sus ar suna in felul urmator: 'marul, para si nuca sunt fructe', lucru care este in mod evident adevarat. Dar sa consideram urmatoarea situatie: 'Fruct' poate implementa o subrutina pe care o vom numi 'mananca-ma!'. Deoarece, prin mostenire, clasele 'Mar', 'Par' si 'Nuca' preiau toate atributele clasei 'Fruct', deci si subrutina 'mananca-ma!' inseamna ca un mar se mananca la fel ca o pruna! Bineinteles, daca incercam sa muscam cu pofta dintr-o nuca Asta inseamna ca 'mananca-ma!' trebuie sa se particularizeze pentru fiecare clasa in parte, reflectand un comportament adecvat cu proprietatile acesteia. Acest lucru mai este numit si polimorfism.
El este al treilea si cel mai important principiu al programarii orientate pe obiecte. El asigura faptul ca fiecare clasa se comporta diferit(polimorfic) la un anumit mesaj trimis catre obiect(in cazul nostru, apelul subrutinei 'mananca-ma!'). Se observa ca polimorfismul exista in stransa legatura cu mostenirea, fara de care nu ar exista. El aduce insa o nuanta mostenirii: 'Preiau din clasa de baza doar acele proprietati care sunt comune si reflecta un comportament adecvat structurii mele'. Altfel spus, prin polimorfism pot face o mostenire selectiva.
In C# exista o mare diferenta intre clase si structuri. Clasele sunt de tip referinta iar structurile sunt de tip valoare. Structurile pot avea si acestea constructori dar la structuri poate fi definit un constructor care nu are nici un parametru. Aceasta restrictie este datorata faptului ca campurile structurilor sunt implicit initializati cu valoarea lor neutra. De exemplu membrii de tip int sunt initializati implicit cu zero, cei de tip bool cu false iar membrii de tip referinta cu null.
In C# clasa poate avea: campuri. metode, proprietati, evenimente. Proprietatile sunt o inovatie adusa in C# fata de C++. In C++ pentru a incapsula un camp era nevoie sa se scrie functii Get/Set. Aceste functii aveau rolul de a regasit/schimba continutul unui membru al clasei. Aceste functii Get/Set sunt inlocuite in C# de proprietati. Acestea permint utlizatorului clasei sa afle/schimbe valoarea campurilor prin proprietati acestea la randul lor fiind asemanatoare ca utilizare unor campuri obisnuite dintr-o clasa. Proprietatile pot avea la randul lor permisiunile de acces obisnuite in C#: public, protected, private, internal si internal protected. Permisiunile de acces public, private, protected sunt deja cunoscute pentru utlizatorii C++ noutatea vine in cazul permisiunii internal. Membrii care sunt etichetati internal sunt vizibili de oriunde din assembly-ul unde au fost definiti. Membrii internal protected sunt ca si cei internal sau ca si cei proctected adica pot fi vizibili de oriunde din assembly-ul unde au fost declarati dar si din clasele derivate care nu sunt neaparat definite in acelasi assembly unde au fost declarati membrii internal protected. O proprietate poate fi de mai multe tipuri: read/write, read-only sau write-only (caz nerecomdat, recomandat sa se foloseasca o functie in acest caz). Prin proprietate read/write se intelege ca se poate citi/scrie in campul pe care proprietatea o exporta, o proprietate read-only poate doar sa citeasca ce contine campul pe care aceasta il exporta. Un nou lucru adus in plus fata de C++ sunt delegatii si evenimentele. Delegatii pot fi comparati cu pointerii la functii din C/C++ cu exceptia faptului ca delegatii sunt puternic tipizati. In C# se pot crea instante la un delegat definit luand ca paramentru functia care va fi folosita de acea instanta a delegatului.
3 Evenimente
In programarea de windows sunt folosite evenimentele. De exemplu cand utilizatorul da click pe o ferestra programatorul scrie functia in care se suprascrie evennimentul WM_MOUSECLICK. Pentru majoritatea actiunilor care se desfasoara asupra unei ferestre sunt definite evenimente acestea fiind captate de catre programator raspunzandu-se numai la care este nevoie sa se execute o actiune particulara. Cand ceva interesant se intampla intr-un obiect sunt sanse mari ca alte obiecte sa fie interesate de acest lucru. Din nou evenimentele vin ajutorul programatorului. La fel precum .NET framework foloseste evenimentele de windows la fel se pot folosi evenimentele din C# ca mijloc de comunicare intre obiectele diferitelor clase. Evenimentele din C# folosesc delegatii pentru a se putea suprascrie ce actiune sa se execute cand un eveniment are loc. Un eveniment poate fi receptionat sau trimis. Modalitatea de a trimite un eveniment este diferita fata de modalitatea de a receptiona un eveniment. Un delegat care este folosit pentru un eveniment ia ca parametru o functie cu doi paramentri. Primul parametru reprezinta obiectul care a trimis evenimentul tipul acestuia este object, iar cel de-al doilea paramentru reprezinta informatia despre eveniment. Tipul celui de-al doilea paramentru este o clasa care trebuie sa fie derivata din clasa EventArgs.
4 Interfete
O alta noutate adusa in C# fata de C++ o reprezinta interfetele. Intr-o interfata sunt declarate functii, propritati, evenimente etc. care trebuie implementate in clasa care foloseste interfata. Membrii unei interfete nu au nici un modificator de acces. In clasele care implementeaza interfetele membrii care sunt definiti in interfete trebuie trecuti in clasa cu modificatorul de acces public. Interfetele permit ca se foloseasca in mod asemanator clase care nu au nici o legatura directa. Interfetele garanteaza ca toate clasele care le implementeaza vor avea aceleasi functii care functioneaza in acelasi fel chiar daca clasele sunt diferite singurul punct comun fiind reprezentat de interfete. Interfetele pot fi privite ca un contract intre doua parti. O parte obligandu-se sa faca un anumit lucru stabilit de la inceput (aceasta parte fiind clasa) iar cealalta parte stiind exact ce poate fi folosit de oricine care "semneaza acest contract"(partea care foloseste clasa prin intermediul interfetei).
5 Colectii. Generics. Atribute
Un nou lucru adus in C# fata de C++ este introducerea tipului string. Acesta memoreaza siruri de caractere unicode. Are multime de functii care ajuta la manipularea mai usoara a sirurilor. De asemenea este o introdusa o clasa pentru expresii regulare.
In C# colectiile de date fac parte din biblioteca standard. Acesta biblioteca include clase pentru lista simplu inlantuita, dublu inlantuita, stiva, hash etc. Aceste clase sunt usor de utilizat si ofera un bun randament atat ca rapiditate cat si management al memoriei folosite.
Un concept nou adus in versiunea 2.0 fata de versiunea 1.0 a .NET framework sunt "generics". Un concept asemenator gasim de asemenea si in C++ prin template. Dar spre deosebire de C++ in C# se pot scrie librarii care folosesc generics, in C++ pentru folosirea template-urilor era nevoie de codul sursa pentru a crea program neputandu-se crea librarii folosindu-se template-uri. Faptul ca in C# (.NET) se pot scrie librarii este datorat CLR. CLR(Common Language Runtime) transforma codul IL in instructiuni care pot fi intelese de procesor. Astfel nu conteaza ce tip este folosit cu generics datorita faptului ca CLR transform IL in timpul rularii programului in cod care poate fi inteles direct de procesor. Generics poate fi folosit la metode, delegati, clase etc.
Un nou lucru adus in C# (.NET framework) sunt atributele. Folosind atributele se poate "nota" informatii despre o clasa, metoda, camp, etc direct in assembly. Aceste notatii pot fi apoi regasite si folosite pentru a indeplini diferite roluri. De exemplu cu un atribut se poate spune ca o functie sa fie folosita numai daca programul este compilat in Debug.
O alta nouatate adusa in C# ( .NET) este procesul de reflection. Prin acest proces se pot afla informatii despre ceea ce se gaseste intr-un assembly. Folsind procesul de reflection se poate gasi ce tipuri sunt definite intr-un assembly, ce metode campuri, etc au tipurile respective, ce atribute sunt folosite si pentru ce tipuri, campuri etc. versiunea unui assembly etc.
6 Fisiere. Serializare
In .NET ca de asemenea in C++ sunt folosite fluxurile de date. In .NET acest lucru este realizat indeosebi folosing clasa de baza Stream. Din aceasta clasa abstracta sunt derivate alte clase care sunt folosite pentru fluxurile de date, fiecare fiind specializata: pentru fisiere, pentru memorie, pentru retea, pentru comprimare, pentru criptare etc.
Un alt lucru care vine in ajutorul programatorului este folosirea serializarii. Prin serializare se intelege in genereal trecerea (transferul) starii unui obiect din memorie intr-un flux de date (stream). Deserializarea este este procesul invers al serializarii adica trecerea (transferul) din fluxul de date intr-un obiect. Serializarea se realizeaza cu ajutorul fluxurilor de date, de aici rezultand ca un obiect poate fi serializat intr-un fisier, pe retea, in memorie etc. Pentru a marca o clasa ca sa poate fi serializara este necesara folosirea atributului [Serializable]. Daca nu se doreste (nu este posibil) ca un camp sa fie serializat acesta trebuie sa fie marcat cu atributul [NonSerialized]. In procesul de serializare se folosesc "object graphs". Un object graphs este alcatuit din obiectul care va fi serializat alaturi de toate datele necesare seralizarii lui (inclusiv alte tipuri cu care clasa obiectului are o relatie).
Exista mai multe feluri cum poate fi retinute obiectele serializate. Pot fi serializate folosind BinaryFormatter astfel rezultand un sir de bytes in care este retinut obiectul, acest tip nu tine cont de modificatorii de acces aplicati asupra campurilor clasei din care face parte obiectul care va fi serializat. Un alt tip este SoapFormatter care foloseste SOAP pentru a serializa un obiec dar SoapFormatter serializeaza numai campurile care sunt declarate publice sau care sunt exportate prin proprietati publice. Acelasi lucru se intampla folosind XmlSerializer singura diferenta fata de SoapFormatter fiind faptul ca se foloseste XML pentru a serializa obiectul dorit. Fiecare din aceste tipuri au doua functii Serialize si Deserialize una pentru a serializara respectiv pentru a deserializa.
7 Concluzii
Programarea orientata obiect este unul din cei mai importanti pasi facuti in evolutia limbajelor de programare spre o mai puternica abstractizare in implementarea programelor. Ea a aparut din necesitatea exprimarii problemei intr-un mod mai natural fiintei umane. Astfel unitatile care alcatuiesc un program se apropie mai mult de modul nostru de a gandi decat modul de lucru al calculatorului.
Limbajul C# este un limbaj puternic tipizat, acceptand paradigma de programare orientata pe obiecte. In C# se pot dezvolta aplicatii foarte rapid, avand o bibleoteca de clase bine organizata fiind intuitiva pt utilizator. Se pot realiza aplicatii pe mai multe domenii (baze de date, comunicare prin retea, comunicare pe serial, etc.). Securitatea este mult inbunatatita fata de aplicatii clasice care nu ruleaza pe platforma .NET. Practic prin C# s-a trecut la un alt nivel de programare.
Acest document nu se poate descarca
E posibil sa te intereseze alte documente despre: |
Copyright © 2024 - Toate drepturile rezervate QReferat.com | Folositi documentele afisate ca sursa de inspiratie. Va recomandam sa nu copiati textul, ci sa compuneti propriul document pe baza informatiilor de pe site. { Home } { Contact } { Termeni si conditii } |
Documente similare:
|
ComentariiCaracterizari
|
Cauta document |