Ingineria programarii: Stilul de scriere a codului. Tratarea exceptiilor

download Ingineria programarii: Stilul de scriere a codului. Tratarea exceptiilor

of 20

Transcript of Ingineria programarii: Stilul de scriere a codului. Tratarea exceptiilor

  • 8/8/2019 Ingineria programarii: Stilul de scriere a codului. Tratarea exceptiilor

    1/20

    1

    Ingineria programriiLaboratorul 2

    Stilul de scriere a codului. Tratarea excepiilor

    1. Obiective2. Stilul de scriere a codului3. Tratarea excepiilor4. Interfaa grafic cu utilizatorul n Microsoft Visual Studio .NET5. Elemente de C#6. Aplicaii

    1. Obiective

    Obiectivele laboratorului 2 sunt urmtoarele:

    Sublinierea importanei unui stil unitar de scriere a codului ntr-o firm de dezvoltare de software; Descrierea standardului de scriere a codului pe care l vom utiliza la laboratoarele de IP; Explicarea modalitilor de tratare a excepiilor n C#; Reamintirea unor aspecte legate de dezvoltarea de aplicaii cu interfa grafic; Reamintirea modului de lucru cu proprieti C#.

    2. Stilul de scriere a codului

    Unul din scopurile urmrite la scrierea de programe trebuie s fie ntreinerea ulterioar a codului,adic facilitarea modificrilor i completrilor viitoare, foarte probabil de ctre persoane diferitedect autorul iniial. De asemenea, unele studii au artat c dup 6 luni de la scrierea unui program,acesta i apare la fel de strin autorului ca i un program scris de altcineva.

    Unul din aspectele principale ale codului uor de ntreinut este posibilitatea de a gsi anumitebuci de cod i de a le modifica fr a afecta celelalte seciuni. Claritatea este esenial. Altfel, ncazul programelor de mari dimensiuni, aa cum sunt majoritatea situaiilor n software-ul industrial,n loc s adugai funcionaliti i s lucrai efectiv, vei pierde timpul ncercnd s gsii poriunilerelevante de cod care trebuie modificate.

    Formatarea codului poate simplifica nelegerea structurii semantice sau poate cauza confuzie. Poatechiar ascunde defecte greu de depistat, de exemplu:

    bool error = DoSomething();if (error)

    Console.WriteLine("Eroare");Environment.Exit(1);

    Nu conteaz ct de bine este proiectat un program; dac prezentarea sa arat neglijent, va fineplcut de lucrat cu el.

    Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/lab_ip.htm

    FlorinLeon,

    Ingineriaprogramarii-Laborator,http://florinleon.byet

    host24.com/lab_

    ip.h

    tm

  • 8/8/2019 Ingineria programarii: Stilul de scriere a codului. Tratarea exceptiilor

    2/20

    2

    2.1. Acoladele

    Exist dou tipuri principale de plasare a acoladelor. Stilul Kernighan i Ritchie este bazat pedorina de a afia ct mai mult informaie ntr-un mod compact:

    int KernighanRitchie() {

    int a = 0, b = 0;while (a != 10) {a++;b--;

    }return b;

    }Acest stil poate fi folosit la prezentri de cod sau n situaii n care spaiul disponibil pentru afiareacodului este redus, de exemplu ntr-un material tiprit.

    Stilul extins saustilul Allman este recomandat de Microsoft pentru limbajul C#:

    int Extended(){int a = 0, b = 0;while (a != 10){

    a++;b--;

    }return b;

    }

    Avantajul principal al acestuia este claritatea, deoarece blocurile de cod sunt evideniate prinalinierea acoladelor. Este stilul pe care l vom utiliza la laboratorul de IP.

    2.2. Standarde de programare

    Muli programatori fr experien industrial, dei foarte buni, refuz la nceput aplicarea unorstandarde impuse. Dac programul este corect, de ce trebuie s l aliniez altfel sau s schimb numelevariabilelor sau metodelor?

    Trebuie avut n vedere faptul c nu exist un stil perfect, deci rzboaiele privind cea mai bunformatare nu pot fi ctigate. Toate stilurile au argumente pro i contra. Majoritatea firmelor

    serioase de software au standarde interne de scriere a programelor, care definesc regulile pentruprezentarea codului. Aceste standarde cresc calitatea programelor i sunt importante deoarece toateproiectele livrate n afara organizaiei vor avea un aspect ngrijit i coerent, de parc ar fi fost scrisede aceeai persoan. Existena mai multor stiluri distincte ntr-un proiect indic lipsa de

    profesionalism.

    Faptul c un programator crede c stilul su propriu este cel mai frumos i cel mai uor de neles nuare nicio importan. Un stil care unui programator i pare n mod evident cel mai bun poatereprezenta o problem pentru altul. De exemplu:

    Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/lab_ip.htm

    FlorinLeon,

    Ingineriaprogramarii-Laborator,http://florinleon.byet

    host24.com/lab_

    ip.h

    tm

  • 8/8/2019 Ingineria programarii: Stilul de scriere a codului. Tratarea exceptiilor

    3/20

    3

    using System . Windows . Forms;namespace LabIP {

    publicclassHelloWorld:System . Windows . Forms . Form {public HelloWorld ( ) {InitializeComponent ( );

    }

    protectedoverridevoid Dispose ( bool disposing ) {if( disposing ) {if( components != null ) {components . Dispose ( );

    }}

    base . Dispose ( disposing );}

    staticvoid Main ( ) {Application . Run ( newHelloWorld ( ) );

    }privatevoid button1_Click ( object sender , System . EventArgs e ) {string STRING = "Hello World!";display ( STRING );

    }privatevoid display ( string STR ) {MessageBox . Show ( STR , ":-)" );

    }}

    }

    Acest program a fost aliniat folosind opiunile din mediul Visual Studio: Tools Options TextEditor C# Formatting, nu a fost aliniat aleatoriu. n acelai mod, stilul personal al unui

    programator poate prea la fel de ciudat altuia.

    Beneficiile adoptrii unui stil unitar de ctre toi membrii unei organizaii depete dificultileiniiale ale adaptrii la un stil nou. Chiar dac nu suntei de acord cu standardul, trebuie totui s vconfomai. Dup ce vei folosi un timp stilul firmei, v vei obinui cu el i v va prea perfectnatural.

    La laboratorul de IP vom utiliza un standard bazat pe recomandrile Microsoft pentru scriereaprogramelor C#.

    Se recomand delimitarea regiunilor de program cu ajutorul cuvntului cheie region, de exemplu:

    #region Fields

    privateView _view;privateDataModel _dataModel;#endregion

    Dac toate seciunile unei clase sunt delimitate pe regiuni, pagina ar trebui s arate n felul urmtoratunci cnd toate definiiile sunt colapsate:

    Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/lab_ip.htm

    FlorinLeon,

    Ingineriaprogramarii-Laborator,http://florinleon.byet

    host24.com/lab_

    ip.h

    tm

  • 8/8/2019 Ingineria programarii: Stilul de scriere a codului. Tratarea exceptiilor

    4/20

    4

    2.3. Convenii pentru nume

    Cheia alegerii unor nume potrivite este nelegerea rolului construciei respective. De exemplu, dacnu putei gsi un nume bun pentru o clas sau o metod, tii la ce folosete sau chiar trebuie sexiste n program? Dificultile la alegerea unui nume potrivit pot indica probleme de proiectare.

    Un nume trebuie s fie:

    Descriptiv: Oamenii i pstreaz deseori percepiile iniiale asupra unui concept. Esteimportant deci crearea unei impresii iniiale corecte despre datele sau funcionalitile unui

    program prin alegerea unor termeni care s descrie exact semnificaia i rolul acestor.Numele trebuie alese din perspectiva unui cititor fr experien, nu din perspectiva proprie;

    Adecvat: Pentru a da nume clare, trebuie s folosim cuvinte din limbajul natural.Programatorii au tendina de a utiliza abrevieri i prescurtri, ns acest lucru conduce ladenumiri confuze. Nu are importan faptul c un identificator este lung dac este lipsit deambiguitate. st nu este o alegere potrivit pentru conceptul NumarStudenti. Regula deurmat este: preferai claritatea fa de laconism. Excepiile sunt contoarele de bucle, de

    exemplu clasicul for (int i = 0; i < length; i++). Acestea de multe ori nu au osemnificaie de sine stttoare, sunt construcii specifice (idiomuri) ale limbajelor evoluatedin C i de obicei se noteaz cu o singur liter: i, j, k etc.;

    Consecvent: Regulile de numire trebuie respectate n tot proiectul i trebuie s seconformeze standardelor firmei. O clas precum cea de mai jos nu prezint nicio garanie decalitate:

    classbadly_named : MyBaseClass{

    publicvoid doTheFirstThing();publicvoid DoThe2ndThing();

    publicvoid do_the_third_thing();}

    Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/lab_ip.htm

    FlorinLeon,

    Ingineriaprogramarii-Laborator,http://florinleon.byet

    host24.com/lab_

    ip.h

    tm

  • 8/8/2019 Ingineria programarii: Stilul de scriere a codului. Tratarea exceptiilor

    5/20

  • 8/8/2019 Ingineria programarii: Stilul de scriere a codului. Tratarea exceptiilor

    6/20

    6

    3. Tratarea excepiilor

    Tratarea erorilor se fcea n C prin returnarea unei valori, de obicei int, care semnfica un cod deeroare. De exemplu, dac o funcie trebuia s deschid un fiier, ea putea ntoarce 0 dac totul afuncionat normal, respectiv codul de eroare 1 dac fiierul nu exista. n funcia apelant,

    programatorul trebuia s trateze codul returnat:

    int err = OpenFile(s);

    Cu toate acestea, programatorul era liber s apeleze funcia direct, OpenFile(s), fr a mai testavaloarea returnat. Programul putea fi testat cu succes, deoarece fiierul exista, ns putea s nu maifuncioneze dup livrare.

    Majoritatea funciilor Windows API returneaz un cod dintr-o list cu sute valori posibile, nspuini programatori testeaz aceste valori individual.

    Tratarea excepiilora aprut pentru a da posibilitatea programelor s surprind i s trateze erorile

    ntr-o manier elegant i centralizat, permind separarea codului de tratare a erorilor de codulprincipal al programului, ceea ce face codul mai lizibil. Astfel, este posibil tratarea:

    tuturor tipurilor de excepii; tuturor excepiilor de un anume tip; tuturor excepiilor de tipuri nrudite.

    Odat ce o excepie este generat, ea nu poate fi ignorat de sistem. Funcia care detecteaz eroareapoate s nu fie capabil s o trateze i atunci se spune c arunc (throw) o excepie. Totui, nu putem fi siguri c exist un caz de tratare pentru orice excepie. Dac exist o rutin potrivit,

    excepia este tratat, dac nu, programul se termin. Rutinele de tratare a excepiilor pot fi scrise ndiverse feluri de exemplu, ele examineaz excepia i apoi nchid programul sau re-aruncexcepia. Structura blocurilortry-catch pentru tratarea excepiilor este urmtoarea:

    FunctieApelata{

    ...

    if (condiii)throw ...

    ...}

    FunctieApelanta{

    ...

    try{

    FunctieApelata();}

    catch (Exception e) // catch fr parametru dac nu intereseaz detaliile excepiei{

    // prelucrri determinate de excepie (se testeaz valoarea lui e)}

    ...}

    Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/lab_ip.htm

    FlorinLeon,

    Ingineriaprogramarii-Laborator,http://florinleon.byet

    host24.com/lab_

    ip.h

    tm

  • 8/8/2019 Ingineria programarii: Stilul de scriere a codului. Tratarea exceptiilor

    7/20

    7

    Codul care ar putea genera o excepie se pune n blocul try. Excepia este aruncat (thrown) nblocul try din funcia care a fost apelat (direct sau indirect). Erorile sunt verificate ntotdeauna nmod explicit. Un bloc try poate prea c nu conine rutine de tratarea erorilor, dar codul din interior

    poate determina execuia verificrilor.

    Excepiile care se petrec n blocul try sunt captate n mod normal de blocul catch care urmeaz

    imediat dup blocul try. Un bloc try poate fi urmat de 1 sau mai multe blocuri catch. Dac seexecut un try i nu se lanseaz nicio excepie, toate rutinele de tratare sunt ignorate. Execuia sereia de la prima instruciune de dup ultima rutin de tratare.

    n C#, tipul trimis ca parametru este de obiceiException:

    try{

    FunctieApelata();}catch (Exception ex){

    ...}

    De cele mai multe ori, ne intereseaz proprietatea Message (de tip string) a unui astfel de obiect,care arat cauza erorii. Textul respectiv este precizat n funcia care arunc excepia.

    privatevoid FunctieApelata(int a){

    if (a == 0)thrownew Exception("Argument zero");

    }privatevoid FunctieApelanta()

    { FunctieApelata(0);}

    Dac excepia nu este tratat, va aprea un mesaj de atenionare cu textul dorit.

    Mesajul de eroare trebuie preluat n program n blocul catch:

    privatevoid FunctieApelanta(){

    try{

    FunctieApelata(0);}catch (Exception ex){

    // ex.Message este "Argument zero"}}

    Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/lab_ip.htm

    FlorinLeon,

    Ingineriaprogramarii-Laborator,http://florinleon.byet

    host24.com/lab_

    ip.h

    tm

  • 8/8/2019 Ingineria programarii: Stilul de scriere a codului. Tratarea exceptiilor

    8/20

    8

    Programatorul i poate defini propriile tipuri de excepii, n cazul n care are nevoie s trimitinformaii suplimentare privind excepia. Acestea trebuie ns derivate din clasaException:

    publicclass MyException: Exception{

    publicint p; // informaie suplimentar

    // n constructor se apeleaz i constructorul clasei de bazpublic MyException(int val): base(){

    p = val;}

    }

    Utilizarea acestui tip se face astfel:

    thrownew MyException(3);

    Dup un try pot exista mai multe blocuri catch. Ele trebuie dispuse n ordinea invers a derivrii

    tipurilor (de la particular la general):

    try{

    FunctieApelata(x);}catch (MyException me){

    ...}catch (Exception ex){

    ...}

    Alt ordine nu este permis, eroarea fiind descoperit la compilare:A previous catch clause alreadycatches all exceptions of this or a super type ('System.Exception').

    3.1. Tratarea excepiilor pe thread-ul aplicaiei

    Uneori pentru a fi siguri c nu am lsat vreo excepie netratat, putem trata global toate excepiileaprute pe firele de execuie ale aplicaiei, n maniera descris n continuare:

    staticclassProgram{

    staticvoid Main(){

    // Adaugarea unui event handler pentru prinderea exceptiilor din firul principal al interfetei utilizatorApplication.ThreadException += newThreadExceptionEventHandler(OnThreadException);

    // Adaugarea unui event handler pentru toate firele de executie din appdomain cu exceptia firului principal UIAppDomain.CurrentDomain.UnhandledException +=

    newUnhandledExceptionEventHandler( CurrentDomain_UnhandledException);

    Application.EnableVisualStyles();

    Application.SetCompatibleTextRenderingDefault( false);Application.Run(newFormX()); // FormX este fereastra principala a programului}

    Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/lab_ip.htm

    FlorinLeon,

    Ingineriaprogramarii-Laborator,http://florinleon.byet

    host24.com/lab_

    ip.h

    tm

  • 8/8/2019 Ingineria programarii: Stilul de scriere a codului. Tratarea exceptiilor

    9/20

    9

    // Trateaza exceptiile din firul principal UIstaticvoid OnThreadException(object sender, ThreadExceptionEventArgs t){

    // Afiseaza detaliile exceptieiMessageBox.Show(t.Exception.ToString(), "OnThreadException");

    }

    // Trateaza exceptiile din toate celelate fire de executiestaticvoid CurrentDomain_UnhandledException( object sender, UnhandledExceptionEventArgs e){

    // Afiseaza detaliile exceptieiMessageBox.Show(e.ExceptionObject.ToString(), "CurrentDomain_UnhandledException" );

    }}

    4. Interfaa grafic cu utilizatorul n Microsoft Visual Studio .NET

    Cnd este creat un nou proiect C# de tip Windows Application, n mijlocul ecranului, apare un

    formular (Form) fereastra principal a programului, n care se vor aduga diverse componentede control: butoane, textbox-uri etc.:

    n partea din stnga a ecranului exist un toolbar (View Toolbox, Ctrl+Alt+X) din care se voralege cu mouse-ul componentele ce vor fi adugate n fereastr.

    Pentru adugarea unei componente, programatorul va face click cu mouse-ul pe imagineacorespunztoare din toolbox, apoi va face click n form, n locul unde dorete s apar componentarespectiv. Odat introduse n fereastr, componentele pot fi mutate, redimensionate, copiate sauterse. n dreapta este o fereastr de proprieti (View Properties Window, F4). De aici,fiecreicomponente folosite i se pot modifica proprietile, adic aspectul exterior, aa cum va aprea n

    program. De asemenea, se pot selecta evenimentele corespunztoare componentei care vor fi trataten program.

    Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/lab_ip.htm

    FlorinLeon,

    Ingineriaprogramarii-Laborator,http://florinleon.byet

    host24.com/lab_

    ip.h

    tm

  • 8/8/2019 Ingineria programarii: Stilul de scriere a codului. Tratarea exceptiilor

    10/20

    10

    n continuare, vor fi prezentate cteva componente de control folosite practic n orice programWindows. Pentru fiecare component, vor fi amintite unele proprieti i metode uzuale. Pentru odescriere mai amnunit, se recomand consultarea documentaiei MSDN.

    Application

    ClasaApplication ncapsuleaz o aplicaie Windows. Clasa nglobeaz metode i proprieti statice pentru managementul unei aplicaii, cum ar fi metode pentru pornirea i oprirea programului,prelucrarea mesajelor Windows i proprieti corespunztoare informaiilor despre aplicaie.

    Se poate observa c n scheletul de program creat implicit de mediul de dezvoltare, n Main(),estepornit programul pe baza clasei corespunztoare ferestrei principale:

    Application.Run(new Form1());

    Form

    Clasa System.Windows.Forms.Formcorespunde unei ferestre standard. O aplicaie poate aveamai multe ferestre una principal, cteva secundare i cteva ferestre de dialog.

    Cteva proprieti:

    Icon icoana care apare n bara de titlu a ferestrei FormBorderStyle nfiarea i comportamentul border-ului (de exemplu, dac

    fereastra poate fi redimensionat) Text titlul ferestrei, care apare n bara de titlu i n taskbar StartPosition locul unde apare fereastra pe ecran

    Size dimensiunea (nlimea i limea ferestrei); de obicei se stabilete prinredimensionarea ferestrei cu mouse-ul, n procesul de proiectare

    Cteva evenimente:

    Load, Closed pentru diverse iniializri n momentul crerii ferestrei sau prelucrri nmomentul nchiderii acesteia

    n general, pentru tratarea unui eveniment n C#, este selectat mai nti obiectul de tipul dorit (la noifereastra), apoi n fereastra de proprieti se alege tab-ul de evenimente i se identific evenimentulcutat.

    Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/lab_ip.htm

    FlorinLeon,

    Ingineriaprogramarii-Laborator,http://florinleon.byet

    host24.com/lab_

    ip.h

    tm

  • 8/8/2019 Ingineria programarii: Stilul de scriere a codului. Tratarea exceptiilor

    11/20

    11

    Dup un dublu-click, ca n figura de mai sus, se va crea automat o nou funcie vidcorespunztoare evenimentului, iar utilizatorul va trebui numai s scrie n corpul funciei aciuniledorite.

    Button

    Clasa System.Windows.Forms.Button corespunde unei buton. Cteva proprieti ievenimente:

    Text textul nscris pe buton Click funcia executat cnd butonul este apsat

    Label

    Clasa System.Windows.Forms.Label nscrie un text undeva n fereastr. Una din proprieti:

    Text textul nscris

    TextBox

    Clasa System.Windows.Forms.TextBox corespunde unei csue de editare de text. Ctevaproprieti i evenimente:

    Text textul din csu (de tip string) Multiline textul poate fi introdus pe o singur linie (false) sau pe mai multe (true) ScrollBars indic prezena unor bare de derulare (orizontale, verticale) dac

    proprietatea Multilineeste true Enabled componenta este activat sau nu (true / false) ReadOnly textul din editbox poate fi modificat sau nu de utilizator (true / false) CharacterCasing textul poate aprea normal (Normal), numai cu litere mici (Lower)

    sau numai cu litere mari (Upper) TextChanged funcie de tratare a textului n timp real, pe msur ce acesta este introdus

    ComboBox

    Clasa System.Windows.Forms.ComboBox

    corespunde unui combo-box, care combin untextbox cu o list. Cteva proprieti i evenimente:

    Text textul din partea de editare Items lista de obiecte din partea de selecie, care se poate introduce i prin intermediul

    ferestrei de proprieti SelectedIndex numrul articolului din list care este selectat (0 primul,

    1 al doilea, etc., 1 dac textul din partea de editare nu este ales din list) TextChanged, SelectedIndexChanged metode de tratare a schimbrii textului prin

    introducerea direct a unui nou cuvnt sau prin alegerea unui obiect din list

    Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/lab_ip.htm

    FlorinLeon,

    Ingineriaprogramarii-Laborator,http://florinleon.byet

    host24.com/lab_

    ip.h

    tm

  • 8/8/2019 Ingineria programarii: Stilul de scriere a codului. Tratarea exceptiilor

    12/20

    12

    MenuStrip

    Clasa System.Windows.Forms.MenuStripcorespunde meniului principal al unei ferestre. Modde folosire:

    se introduce o component de acest tip n fereastr se editeaz meniul, direct n fereastr sau folosind proprietile pentru separatori se introduce n cmpul Caption un minus ( ) literele care se vor subliniate vor fi precedate de & pentru implementarea metodei de tratare a unei opiuni din meniu se va face dublu-click pe

    aceasta (sau pe evenimentul Click n fereastra de proprieti).

    Timer

    Clasa System.Windows.Forms.Timer ncapsuleaz funciile de temporizare din Windows.Cteva proprieti i evenimente:

    Interval intervalul de timp (n milisecunde) la care va fi executat o funcie Enabled indic dac timer-ul e activat sau nu (true/false) Tick evenimentul care va fi tratat o dat la un interval de timp

    string

    Aceasta este o clas care permite multiple faciliti pentru lucrul cu iruri de caractere. Astfel, existoperatorul +, care permite concatenarea irurilor:

    string str1 = "Microsoft ";string str2 = "Word";str1 = str1 + str2; // sau str1 += str2; => str1 == Microsoft Word

    Clasa conine multe proprieti i metode utile, dintre care amintim:

    int Length lungimea irului int IndexOf(...) poziia n ir la care apare prima dat un caracter sau un subir string Substring(...) returneaz un subir string Remove(int startIndex, int count) returneaz irul rezultat prin

    tergerea a countcaractere din ir, ncepnd cu poziiastartIndex

    string[] Split(...) mparte irul n mai multe subiruri delimitate de anumitesecvene de caractere

    O metod static a clasei este Format(...), care returneaz un ir de caractere corespunztor unuianumit format. Sintaxa este asemntoare cu cea a funcieiprintfdin C. De exemplu:

    double d = 0.5;string str = string.Format("Patratul numarului {0} este {1}", d, d*d);

    Acelai rezultat s-ar fi putut obine astfel:

    str = "Patratul numarului " + d.ToString() + " este " + (d*d).ToString();

    Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/lab_ip.htm

    FlorinLeon,

    Ingineriaprogramarii-Laborator,http://florinleon.byet

    host24.com/lab_

    ip.h

    tm

  • 8/8/2019 Ingineria programarii: Stilul de scriere a codului. Tratarea exceptiilor

    13/20

    13

    Orice obiect are metoda ToString(), care convertete valoarea sa ntr-un ir. Pentru obiectedefinite de programator, aceast metod poate fi suprascris.

    Dac n exemplul de mai sus d= 0.72654 i dorim s afim numerele numai cu 2 zecimale, metodaFormati dovedete utilitatea:

    string str=string.Format("Patratul numarului {0:F2} este {1:F2}", d, d*d);MessageBox.Show(str);

    StringBuilder

    Majoritatea programatorilor utilizeaz ntotdeauna clasa string cnd opereaz cu iruri decaractere. n cazul concatenrii unor iruri, folosirea clasei StringBuilder aduce o importantcretere de performan. S considerm urmtorul bloc:

    string listaNumere = "";for (int i=0; i

  • 8/8/2019 Ingineria programarii: Stilul de scriere a codului. Tratarea exceptiilor

    14/20

    14

    creterea vitezei, trebuie s estimm lungimea final a irului (parametrul constructorului). Dacfolosim constructorul vid sau lungimea estimat este mai mic dect n realitate, alocarea spaiuluise face automat iar performana scade.

    5. Elemente de C#

    5.1. Clase pariale

    n clasele corespunztoare ferestrelor, exist metode predefinite generate automat de mediul VisualStudio, care conin iniializarea controalelor grafice. Aceste metode sunt de obicei de dimensiunimai mari i sunt separate de logica aplicaiei fiind plasate ntr-un alt fiier, numit *.Designer.cs.

    Definiia unei clase sau structuri sau interfee se poate mpri n dou sau mai multe fiiere surs.Fiecare fiier surs conine o parte din definiia clasei i toate prile sunt combinate cnd aplicaiaeste compilat. Exist cteva situaii cnd este dorit mprirea definiiei clasei:

    Cnd se lucreaz la proiecte mari, mprirea clasei n fiiere separate permite mai multorprogramatori s lucreze la ele simultan;

    Cnd se lucreaz cu surse generate automat, codul poate fi adugat clasei fr s mai fienevoie de recrearea fiierului surs. Visual Studio folosete aceast cale cnd creeazferestrele Windows, codul wrapper pentru servicii web s.a.m.d. Se poate crea cod carefolosete aceste clase fr s mai fie nevoie de modificarea fiierului creat de Visual Studio.

    Pentru a mpri definiia unei clase, se folosete cuvntul-cheie partial, dup cum este prezentatmai jos:

    publicpartialclass Employee{

    publicvoid DoWork(){}

    }

    publicpartialclass Employee{

    publicvoid GoToLunch(){}

    }

    Modificatorulpartialnu este valabil n declaraiile pentru funcii delegat sau enumerri.

    5.2. Proprieti. Accesori

    Proprietile sunt membri care furnizeaz un mecanism flexibil de citire, scriere, sau calculare devalori ale cmpurilor private. Proprietile pot fi folosite ca i cum ar fi membri publici, dar ele suntde fapt metode speciale numite accesori. Acestea permit ca datele s fie accesate mai uor ns nacelai timp este asigurat sigurana i flexibilitatea metodelor.

    Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/lab_ip.htm

    FlorinLeon,

    Ingineriaprogramarii-Laborator,http://florinleon.byet

    host24.com/lab_

    ip.h

    tm

  • 8/8/2019 Ingineria programarii: Stilul de scriere a codului. Tratarea exceptiilor

    15/20

    15

    n exemplul urmtor, clasa TimePeriod reine o perioad de timp. n interiorul ei, clasa stocheaztimpul n secunde, dar exist o proprietate numit Hours care permite unui client s specificetimpul n ore. Accesorii pentru proprietatea Hours realizeaz conversia ntre ore i secunde.

    class TimePeriod{

    privatedouble _seconds;

    publicdouble Hours{

    get { return _seconds / 3600; }set { _seconds = value * 3600; }

    }}

    class Program{

    staticvoid Main(){

    TimePeriod t = new TimePeriod();

    // Atribuirea proprietatii Hours determina apelul accesorului "set"t.Hours = 24;

    // Evaluarea proprietatii Hours determina apelul accesorului "get"System.Console.WriteLine("Time in hours: " + t.Hours);

    }}

    Poriunile get i set a unei proprieti sunt numite accesori. Implicit aceti accesori au acceaivizibilitate, sau nivel de acces cu al cmpului cruia i aparin. Totui, este folositor uneori s serestricioneze accesul la unul din accesori. De obicei, aceasta implic restricionarea accesibilitii

    accesoruluiset, n timp ce accesorulgetrmne public accesibil. De exemplu:

    publicstring Name{

    get{

    return name;}protectedset{

    name = value;}

    }

    n acest exmplu, o proprietate numit Name definete un accesorgetiset. Accesorulgetprimetenivelul de accesibilitate al proprietii insi, public n acest caz, n timp ce accesorul set esterestricionat n mod explicit aplicnd modificatorul de accesprotectedaccesorului nsui.

    Proprietile permit unei clase s expun o cale public de a primi (get) i aloca (set) valori,n timp ce codul de implementare sau verificare este ascuns.

    Accesorulgeteste folosit pentru a returna valoarea proprietii iar accesorul seteste folositpentru a aloca o nou valoare. Aceti accesori pot avea nivele de acces diferite.

    Cuvntul cheie value este folosit pentru a defini valoarea alocat deset. Proprietile ce nu implementeaz o metodsetsunt doar pentru citire (read only).

    Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/lab_ip.htm

    FlorinLeon,

    Ingineriaprogramarii-Laborator,http://florinleon.byet

    host24.com/lab_

    ip.h

    tm

  • 8/8/2019 Ingineria programarii: Stilul de scriere a codului. Tratarea exceptiilor

    16/20

    16

    Proprietile combin aspecte proprii att cmpurilor ct i metodelor. Pentru utilizatorul unuiobiect, o proprietate apare ca un cmp, accesul la proprietate necesit exact aceeai sintax. Pentrurealizatorul clasei, o proprietate este format din unul sau dou blocuri de cod, reprezentnd unaccesorgeti/sau un accesorset. Blocul de cod pentru accesorulgeteste executat cnd proprietateaeste citit; blocul de cod pentru accesorul seteste executat cnd proprietii i este alocat o nouvaloare. O proprietate fr un accesor set este considerat doar pentru citire (read-only). O

    proprietate fr accesorulget este considerat doar pentru scriere (write-only). O proprietate cuambii accesori este pentru citire i scriere (read-write).

    Proprietile au mai multe utilizri: pot valida datele nainte de a permite o modificare; pot returnadatele dintr-o clas, unde datele sunt de fapt returnate din alte surse, cum ar fi o baz de date; pot

    produce o aciune cnd datele sunt modificate, cum ar fi ridicarea unui eveniment, sau schimbareavalorii altor cmpuri.

    publicclass Date{

    privateint month = 7; //"backing store"

    publicint Month{

    get{

    return month;}set{

    if ((value > 0) && (value < 13)){

    month = value;}

    }

    }}

    n acest exemplu, Month este declarat ca o proprietate. n acest fel, accesorul setpoate fi sigur cvaloarea Month este ntre 1 i 12. Proprietatea Month folosete un cmp privat pentru a urmrivaloarea actual. Locaia real a datelor proprietii este de obicei referit ca memoria auxiliar(backing store) a proprietii. Marea majoritate a proprietilor utilizeaz n mod normal cmpuri

    private ca memorie auxiliar. Cmpul este marcat privat cu scopul de a se asigura c poate fiaccesat doar apelnd proprietatea.

    5.2.1. Accesorul get

    Corpul accesorului geteste similar cu cel al unei metode. Trebuie s returneze o valoare a tipuluiproprietii. Execuia accesoruluigeteste echivalent cu citirea valorii din cmp. De exemplu, cndse ntoarce variabila privat din accesorulgeti optimizrile sunt permise, apelul ctre accesorulgeteste tratat inline de ctre compilator n aa fel nct nu s nu se piard timp prin efectuarea unui apelde metod. Oricum, un accesorgetvirtual nu poate fi tratat inline ntruct compilatorul nu tie ntimpul compilrii ce metod poate fi apelat de fapt n timpul rulrii. n urmtorul exemplu, este

    prezentat un accesorgetce ntoarce valoarea a unui cmp privat name:

    Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/lab_ip.htm

    FlorinLeon,

    Ingineriaprogramarii-Laborator,http://florinleon.byet

    host24.com/lab_

    ip.h

    tm

  • 8/8/2019 Ingineria programarii: Stilul de scriere a codului. Tratarea exceptiilor

    17/20

    17

    class Person{

    privatestring name; // the name fieldpublicstring Name // the Name property{

    get{

    return name;}

    }}

    Cnd se apeleaz proprietatea prin referin, n afar de cazul cnd este inta unei atribuiri,accesorulgeteste invocat pentru a citi valoarea proprietii. De exemplu:

    Person p1 = new Person();//...

    System.Console.Write(p1.Name); // se invoca accesorul get

    Accesorulgettrebuie s se termine cu instruciunea return sau throw, iar fluxul de control nu poatedepi corpul accesorului.

    Schimbarea strii unui obiect utiliznd accesorulgetnu este un stil bun de programare. De exemplu,urmtorul accesor produce ca efect secundar schimbarea strii obiectului de fiecare dat cndcmpul number este accesat.

    privateint number;publicint Number{

    get

    {return number++; // Nerecomandat!

    }}

    Accesorul get poate fi folosit fie ca s returneze valoarea unui cmp, fie s o calculeze i s oreturneze. De exemplu:

    class Employee{

    privatestring name;publicstring Name

    { get{

    return name != null ? name : "NA";}

    }}

    n segmentul de cod anterior, dac nu se atribuie o valoare proprietii Name, aceasta va ntoarcevaloarea "NA" (No Account).

    Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/lab_ip.htm

    FlorinLeon,

    Ingineriaprogramarii-Laborator,http://florinleon.byet

    host24.com/lab_

    ip.h

    tm

  • 8/8/2019 Ingineria programarii: Stilul de scriere a codului. Tratarea exceptiilor

    18/20

    18

    5.2.2. Accesorul set

    Accesorul set este similar cu o metod ce ntoarce void. Folosete un parametru implicit numitvalue (valoare), a crui tip este tipul proprietii. n exemplul urmtor, un accesorseteste adaugat

    proprietii Name:

    class Person{

    privatestring name; // campul namepublicstring Name // proprietatea Name{

    get{

    return name;}set{

    name = value;}

    }}

    Cnd se atribuie o valoare proprietii, accesorulseteste invocat cu un argument ce furnizeaz nouavaloare. De exemplu:

    Person p1 = new Person();p1.Name = "Joe"; // se apeleaza accesorul "set"

    Folosirea parametrului implicit, value, pentru o variabil declarat local ntr-un accesor setconstituie o eroare.

    O proprietate poate fi declarat static folosind cuvntul-cheiestatic. n acest fel proprietatea devinedisponibil apelanilor oricnd, chiar dac nu exist nicio instan a clasei.

    Spre deosebire de cmpuri, proprietile nu sunt clasificate ca variabile. De aceea, nu se poatetransmite o proprietate ca un parametru refsau out.

    Exist instrumente care genereaz automat proprieti read-write pentru toate cmpurile. Dacntr-o clas exist multe cmpuri, trebuie s ne ntrebm dac toate acestea trebuie s fie accesibiledin exterior. Nu are sens ca toate cmpurile private ale unei clase s fie expuse n afar, chiar i prinintermediul proprietilor.

    Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/lab_ip.htm

    FlorinLeon,

    Ingineriaprogramarii-Laborator,http://florinleon.byet

    host24.com/lab_

    ip.h

    tm

  • 8/8/2019 Ingineria programarii: Stilul de scriere a codului. Tratarea exceptiilor

    19/20

    19

    6. Aplicaii

    6.1.Realizai interfaa grafic a unei aplicaii Windows pentru rezolvarea de ecuaii polinomiale degradul I i II, precum i de ecuaii trigonometrice simple (Ecuatii.exe).

    6.2.Creai clasele pentru rezolvarea celor dou tipuri de ecuaii i care vor arunca dou tipuri deexcepii, conform structurii de mai jos.

    Fiind dou tipuri diferite de ecuaii, vom avea o interfa IEquation cu metoda Solve, din carevor fi derivate PolyEquation i TrigEquation.

    n clasa principal, evenimentul de tratare a apsrii butonului Calculeaza va testa tipul de ecuaie.

    Pentru o ecuaie polinomial: va citi coeficienii ecuaiei i va instania un obiect corespunztor:IEquation eq = newPolyEquation(x2, x1, x0);textBoxSolutie.Text = eq.Solve();

    Pentru o ecuaie trigonometric, depinznd de tipul de funcie trigonometric:

    eq = newTrigEquation(TrigEquation.TrigonometricFunction.Sin, arg);textBoxSolutie.Text = eq.Solve();

    Fiecare tip de ecuaie va arunca propria clas de excepie: PolyException, respectivTrigException.

    n evenimentul butonului vom avea un singur bloc try, urmat de 3 blocuri catch: pentru cele doutipuri de excepie, precum i pentru excepiile generice, rezultate de exemplu la ncercarea de a citicoeficienii, dac utilizatorul introduce caractere nenumerice.

    Excepii la rezolvarea ecuaiei polinomiale pot aprea atunci cnd toi coeficienii sunt 0 (Ecuaiaare o infinitate de soluii) i cnd 02 =x , 01 =x iar 00 x (Ecuaia nu are soluii).

    O excepie la rezolvarea ecuaiei trigonometrice apare atunci cnd argumentul funciilor arcsin iarccos nu aparine intervalului [-1, 1].

    Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/lab_ip.htm

    FlorinLeon,

    Ingineriaprogramarii-Laborator,http://florinleon.byet

    host24.com/lab_

    ip.h

    tm

  • 8/8/2019 Ingineria programarii: Stilul de scriere a codului. Tratarea exceptiilor

    20/20

    20

    Indicaie: codul pentru rezolvarea ecuaiei polinomiale este prezentat mai jos, unde

    0221 4 xxx = :

    if (_x2 == 0){

    _eqType = EquationType.FirstDegree;// Solutie: -_x0 / _x1

    }elseif (delta > 0){

    double sqrtDelta = Math.Sqrt(delta);double sol1 = (-_x1 + sqrtDelta) / (2.0 * _x2);double sol2 = (-_x1 - sqrtDelta) / (2.0 * _x2);// Solutii: sol1, sol2

    }elseif (delta == 0)

    { double sol = (-_x1) / (2.0 * _x2);// Solutie: sol

    }else{

    double rsol = -_x1 / (2.0 * _x2);double isol = Math.Sqrt(-delta) / (2.0 * _x2);// Solutii: rsol isol i

    }

    Atenie: scopul laboratorului este lucrul cu excepii, nu rezolvarea propriu-zis a ecuaiilor!

    6.3.Eliminai blocurile try-catch din clasa principal a aplicaiei i efectuai tratarea excepiilor pefirul de execuie n metoda Main (EcuatiiThreadHandler.exe).

    FlorinLeon,

    Ingineriaprogramarii-Laborator,http://florinleon.byet

    host24.com/lab_

    ip.h

    tm