alqabomb
Numele forumului cat si aceasta descriere pot fi modificate accesind meniul ADMIN -> OPTIUNI
Nou pe simpatie:
irina_dragalasa
Femeie
24 ani
Bucuresti
cauta Barbat
26 - 65 ani
alqabombInregistrareLoginPozeNu sunteti logat. Lista Forumurilor Pe Tematici
alqabomb / HacK School / CURS I - PROGRAMARE C++ vol III Pagini: 1  
#1
JaGuaruL
Administrator
Postari: 19
Cap. 8. Programarea in C++ pe sisteme UNIX

    Cel mai raspandit compilator in lumea UNIX este GCC, implementare free realizata de catre Free Software Foundation. Acesta este un compilator extensibil, existand extensii pentru C++, Objective-C, Pascal, Fortran, etc. Executabilele generate de catre acest compilator nu trebuie neaparat sa fie free software, chiar daca includ librariile standard C sau C++.
    Sintaxa generala de apelare a compilatorului este:

    gcc [ optiuni nume_fisier ]


    g++ [ optiuni nume_fisier ]


    Tipul fisierelor de intrare este determinat dupa sufixul acestora, si sunt prelucrate dupa cum urmeaza:

    .c - sursa C: preprocesare, compilare, asamblare
    .C - sursa C++: preprocesare, compilare, asamblare
    .cc - sursa C++: preprocesare, compilare, asamblare
    .cxx - sursa C++: preprocesare, compilare, asamblare
    .m - sursa Objective-C: preprocesare, compilare, asamblare
    .i - sursa C preprocesata: compilare, asamblare
    .ii - sursa C++ preprocesata: compilare, asamblare
    .s - sursa asamblare: asamblare
    .S - sursa asamblare: preprocesare, asamblare

    Fisierele avand alte sufixe, cum ar fi .o (fisier obiect) sau .a (fisier arhiva), sunt trimise catre link-editor.
    Pentru a se evita parte din etapele prelucrarii pot fi utilizate urmatoarele optiuni:

    -c compileaza si asambleaza fisierele sursa, dar nu le link- editeaza
    -S compileaza fisierele sursa, fara insa a le asambla
    -E nu lanseaza compilarea, ci doar preprocesarea

    Implicit, gcc genereaza un fisier executabil avand denumirea "a.aout"; fisierele obiect corespunzatoare intrarii "sursa.sufix" sunt denumite "sursa.o", iar fisierele asamblate "sursa.s". Denumirea iesirii poate fi schimbata cu ajutorul optiunii "-o file".

    Alte optiuni des utilizate:

  # optiuni de compilare:
    -Idirector - adauga director la lista directoarelor in care sunt cautate fisierele .h
    -Ldirector - adauga director la lista directoarelor in care sunt cautate bibliotecile

    -O, -O1, -O2, -O3 - activeaza diverse nivele de optimizare a codului. -O3 este nivelul cel mai avansat de optimizare
    -O0 - dezactiveaza optimizarea codului

  # optiuni de link-editare:
    -lbiblioteca - utilizeaza biblioteca specificata in cadrul etapei de link-editare

  # optiuni de preprocesare:
    -Dmacro - defineste macro-ul specificat ca fiind "1"
    -Dmacro=valoare - defineste macro cu valoarea specificata
    -Umacro - anuleaza macro-ul specificat

    Optiuni specifice C++:

    -fall-virtual - trateaza toate functiile membre ca fiind virtuale
    -fthis-is-variable - permite utilizarea pointer-ului "this" ca o variabile obisnuita
    -fexternal-templates - produce cod obiect mai mic pentru declaratiile de template-uri, generand doar o singura copie a fiecarei functii template acolo unde aceasta este definita. Pentru a putea utiliza aceasta optiune, trebuie marcate toate fisierele sursa care utilizeaza template-uri cu directiva #pragma implementation (acolo unde sunt definite efectiv template-urile) respectiv #pragma interface (acolo unde sunt declarate template-urile). Atunci cand este utilizata aceasta optiune, toate instantierile de template-uri sunt considerate external. De aceea, toate aceste instantieri trebuie sa fie realizate in cadrul fisierului marcat cu "implementation", de exemplu prin utilizarea unor declaratii "typedef" care sa faca referire la fiecare instantiere
    -falt-external-templates - are un comportament similar cu cel al optiunii precedente, cu exceptia faptului ca este generata o singura copie a fiecarei functii template acolo unde aceasta este definita pentru prima oara
    -fhandle-exceptions - activeaza mecanismul de tratare a exceptiilor. Programele care utilizeaza acest mecanism trebuie compilate cu aceasta optiune, in caz contrar fiind generata o eroare la compilare (Nota: in versiunile recente, 2.8.x, ale gcc, aceasta optiune a fost schimbata in "-fexceptions" si este activata in mod implicit)

    Exemple:

  # Pentru compilarea primului exemplu din capitolul 7:
    gcc -o cap7_1 cap7_1.cc

  # Pentru compilarea exemplului din capitolul 6:
    gcc -fhandle-exceptions -O3 -o cap6 cap6.cc


    In capitolul urmator va fi prezentat limbajul Objective-C.


 
   
#2
JaGuaruL
Administrator
Postari: 19
Cap. 9. Introducere in Objective-C

    Objective-C este tot o extensie a limbajului C pentru lucrul orientat pe obiecte, considerata uneori superioara C++. Sistemul de operare NextStep a fost scris in intregime in Objective-C.
    Spre deosebire de C++, pentru compilarea codului scris in Objective-C nu este necesar un compilator special. Objective-C consta intr-un preprocesor care transleaza codul Objective-C in cod C, urmand ca acesta sa fie transformat in cod obiect de catre un compilator standard C.
    Toate clasele sunt derivate in mod automat din clasa predefinita Object. Aceasta clasa poate fi referita prin intermediul identificatorului super.
    Fata de C++ sunt cateva deosebiri: nu se poate realiza mostenire multipla, nu exista nici un mecanism de control al accesului, etc.
    Metodele de acces la datele incapsulate in interiorul clasei pot fi apelate trimitand mesaje catre obiecte. Gestionarea mesajelor este transparenta pentru programator, implementarea fiind realizata cu ajutorul unor functii de biblioteca. Sintaza apelarii metodelor este urmatoarea:

    [Obiect Metoda]


    sau cu parametri:

    [Obiect Metoda:Parametri ...]


    Analog se pot referi datele apartinand clasei:

    [Obiect DataMembra]


    Declararea obiectelor se face astfel:

    id variabila


    cu remarca ca declararea unui identificator nu duce la crearea obiectului. Pentru a crea obiecte in Objective-C este nevoie de o fabrica de obiecte (factory object). Obiectul fabrica, unul pentru fiecare clasa, poarta acelasi nume ca si clasa, si este generat automat de catre preprocesorul Objective-C. Sarcina programatorului este de a declara metodele de constructie a obiectelor. Aceste metode sunt aplicate numai obiectului fabrica.
    Sintaxa declararii claselor este urmatoarea:

    @interface NumeClasa : Object {
    ...
    /* declaratii date membre */
    }

    + metode_de_fabricare

    - metode_normale

    @end

    Metodele de fabricare se declara astfel:

    + NumeParametruExterior: (TipData)NumeParametruInterior ...


    sau fara parametri:

    + NumeMetoda


    Metodele normale se declara ca mai jos:

    - NumeParametruExterior: (TipData)NumeParametruInterior ...


    sau fara parametri:

    - NumeMetoda


    Exista o metoda de fabricare implicita, numita new, si care apartine clasei comune, Object, si care poate fi evident supradefinita.
    Sintaxa generala a definirii unei clase este:

    @implementation NumeClasa : Object {
    ...
    /* date specifice fiecarei instante */
    }

    + metode_de_fabricare
    {
    /* cod */
    };

    {
    - metode_normale
    {
    /* cod */
    };

    @end

    In interiorul metodelor normale poate fi utilizat identificatorul self, care desemneaza obiectul apelat. Functionalitatea acestuia este similara celei a identificatorului this din C++.
    In ceea ce priveste parametrii metodelor, trebuie mentionat ca daca nu se declara nici un tip, acesta este considerat de tipul clasei in cauza. De asemenea, valoarea returnata este implicit de tipul clasei. Daca metoda nu intoarce nici o valoare, conventia este ca ea sa intoarca identificatorul obiectului care a primit mesajul, self.
    In continuare vom rescrie clasa Point realizata in cap. 3.

    #include <objc/Object.h>

    @interface Point : Object
    {
    unsigned x, y;
    }

    + X: (unsigned)__x Y: (unsigned)__y;
    + new;
    - SetX: (unsigned)__x;
    - SetY: (unsigned)__y;
    - (unsigned)GetX;
    - (unsigned)GetY;
    - (unsigned long)Arie;

    @end

    @implementation Point : Object
    {
    unsigned x, y;
    }

    + X: (unsigned)__x Y: (unsigned)__y
    {
    self = [super new];
    [self SetX:__x];
    [self SetY:__y];
    return self;
    }

    + new {
    self = [super new];
    [self SetX:0];
    [self SetY:0];
    }

    - SetX: (unsigned)__x
    {
    x = __x;
    return self;
    }

    - SetY: (unsigned)__y
    {
    y = __y;
    return self;
    }

    - (unsigned)GetX
    {
    return x;
    }

    - (unsigned)GetY
    {
    return y;
    }

    - (unsigned long)Arie
    {
    return x * y;
    }

    @end

    main()
    {
    id p;

    p = [Point X:5 Y:10];
    printf("Aria = %dn", [p Arie]);
    }


 
   
#3
JaGuaruL
Administrator
Postari: 19
Cap. 10. Proiectarea si dezvoltarea de aplicatii orientate obiect

    Dezvoltarea de sisteme orientate obiect pare a fi, la prima vedere, mai complicata si de durata mai mare decat dezvoltarea aplicatiilor traditionale. In realitate, durata si costurile dezvoltarii de aplicatii orientate obiect sunt mult mai mici.
    Etapa fundamentala in cadrul acestui proces o constituie cea de proiectare a sistemului, chiar daca este evident ca structura interna a acestuia este irelevanta pentru utilizatori. S-a constatat de asemenea ca succesul aplicatiilor orientate obiect depinde in principal de doi factori:

    1. Existenta unei viziuni arhitecturale coerente si bine definite
    Arhitectura unui sistem orientat pe obiecte cuprinde atat structura claselor si interactiunea dintre obiecte, cat si impartirea aplicatiei in module si nivele de abstractizare. Cateva conditii in vederea realizarii unei arhitecturi corecte:
    - nivele de abstractizare bine definite
    - clase avand interfete bine definite, a caror modificare provoaca schimbari minime asupra celorlalte clase
    - modificarea modului de implementare a unei clase nu are repercursiuni asupra interfetei sau implementarii celorlalte clase
    - arhitectura sistemului este simpla, realizata prin abstractii si mecanisme obisnuite

    2. Urmarea unui ciclu de dezvoltare atat iterativ cat si incremental bine administrat
    Exista in principal doua tipuri de cicluri de dezvoltare:
    - ciclu de dezvoltare nedefinit. In acest caz, este imposibil de stiut viteza dezvoltarii sistemului, momentul la care va fi finalizat, calitatea sistemului ramanand permanent sub semnul intrebarii. Este posibila ca o parte din eforturile depuse sa fie ineficiente, asadar costurile dezvoltarii sa fie foarte mari.
    - reguli clare care stabilesc fiecare aspect al ciclului. In acest de-al doilea caz, este impiedicata creativitatea si experimentul, care ar putea produce o aplicatie avand calitate sporita. Cerintele utilizatorilor ajung cu dificultate la nivelul programatorilor ce realizeaza aplicatia, ingreunand procesul de dezvoltare si marindu-i costurile.
    In realitate, nu vom intalni nicaieri vreunul dintre aceste cazuri distinct. In cadrul dezvoltarii de sisteme software, aceste doua tipuri de cicluri de dezvoltare se intrepatrund, inclinand mai mult sau mai putin spre una dintre extreme, functie de deciziile luate de conducatorii acestor proiecte. S-a tras in multe locuri concluzia ca un ciclu de dezvoltare ideal este atat de tip iterativ cat si de tip incremental.
    Ce inseamna ca un ciclu este iterativ? Un proces iterativ presupune inbunatatirea succesiva a arhitecturii orientata pe obiecte, utilizand experienta si rezultatele obtinute in fiecare etapa sau versiune in etapa urmatoare de analiza si dezvoltare. Ce reprezinta un ciclu incremental? In cadrul unui proces incremental, fiecare trecere printr-un astfel de ciclu de analiza/dezvoltare conduce la inbunatatirea deciziilor, rezultand astfel in final o solutie care intruneste adevaratele cerinte ale utilizatorilor, si are o arhitectura clara, este eficienta si usor de intretinut.

    De obicei, sistemele comerciale sunt realizate urmand un ciclu mai clar definit, deoarece sunt realizate in cadrul unor companii cu numar mare de programatori si trebuie executate intr-un interval predefinit de timp. Spre deosebire de acestea, sistemele open source (realizate in lumea free software) sunt construite dupa un ciclu mai vag definit, dar care de cele mai multe ori conduce la sisteme mai extensibile, mai flexibile, si de calitate superioara celor comerciale.

    Sintetizat, etapele dezvoltarii unui sistem orientat pe obiecte sunt:

              I. Analiza

              1. Identificarea obiectelor din cadrul sistemului;
              2. Identificarea actiunilor efectuate de fiecare obiect;
              3. Identificare interactiunilor dintre aceste obiecte (mesajele prin care comunica obiectele).

              II. Abstractizarea

              1. Stabilirea claselor ale caror instantiere sunt aceste obiecte;
              2. Elaborarea ierarhiei de clase.

              III. Implementarea

              1. Impartirea pe module (clase) a ierarhiei de clase;
              2. Elaborarea claselor de baza (fundamentale);
              3. Elaborarea celorlalte clase din ierarhie (in aceasta etapa se determina si disfunctiile in proiectare/implementare a claselor de baza si este posibila revenirea la pct. 2).
              4. Asamblarea intr-un tot unitar a modulelor (claselor)

              IV. Testarea (se realizeaza si pe parcursul etapelor III: 2-4)

              V. Scrierea de documentatie (eventual in timpul etapelor III si eventual IV).


    Perioada de viata a unui sistem nu se rezuma insa la proiectarea si dezvoltarea sa; ea continua cu lansarea de noi versiuni, corectarea erorilor ce nu au fost detectate in cadrul etapei de testare, adaptarea sa functie de cerintele utilizatorilor, etc.

    In cadrul etapei de proiectare a sistemului orientat pe obiecte, nu trebuie sa uitam ca un sistem complex bine construit este alcatuit din mai multe componente simple (atomice) care interactioneaza intre ele. Sistemele monolitice au costurile de proiectare, implementare si mai ales de intretinere mult mai mari decat sistemele modulare. Programarea orientata pe obiecte ofera toate avantajele in vederea crearii de sisteme modulare.

    In ceea ce priveste ierarhiile de clase, exista doua categorii: in prima, toate sau aproape toate clasele sunt derivate dintr-o clasa de baza, radacina; intr-a doua, pot exista mai multe ierarhii de clase distincte. Avantajul de a avea o singura clasa de baza este acela ca se poate evita cu usurinta mostenirea multipla; dezavantajul este ca de multe ori in cadrul procesului de implementare a claselor derivate poate aparea necesitatea modificarii clasei de baza.

    In cadrul etapei de implementare a aplicatiei, este important sa se stabileasca o conventie unitara privind stilul de programare utilizat. De cele mai multe ori nu are importanta stilul adoptat, insa un stil unitar poate usura foarte mult interconectarea dintre modulele componente si micsora costurile de intretinere a sistemului. In continuare voi face cateva sugestii:

  # Indentarea
    - dimensiunea tabularii sa fie de 2-4 caractere

  # Acoladele
    -acoladele corespunzatoare sa fie aliniate vertical
    -pe liniile continand o acolada sa nu apara si cod

  # Liniile lungi
    -dimensiunea unei linii de cod sa fie mai mica decat latimea ecranului
    -daca o linie este impartita pe mai multe randuri, cel de-al doilea rand cat si urmatoarele sa fie indentate

  # Codul sursa
    -sa nu existe spatii inainte si dupa operatorii unari
    -sa existe spatiu inainte si dupa operatorii binari
    -sa existe un spatiu dupa virgule si punct si virgula, dar nu intainte
    -sa nu existe spatii inainte si dupa paranteze
    -sa existe spatiu inainte si dupa cuvintele cheie
    -sa fie utilizate linii libere pentru a separa diverse module de cod sursa si a mari lizibilitatea programului

  # Comentariile
    -textul unui comentariu sa fie separat de "//" cu un spatiu
    -pe cat posibil, sa fie utilizate comentariile stil C++, "//", in loc de cele in stil C, "/* */"
    -sa fie la obiect si de nivel cat mai inalt
    -sa indice operatia realizata de catre functie, efectele secundare, tipul parametrilor, valorile pe care le poate returna

  # Denumirile identificatorilor
    -denumirile sa fie cat mai descriptive posibil
    -sa fie evitate abrevierile criptice
    -sa nu fie utilizata notatia "ungureasca" (care prevede includerea tipului unei variabile in denumirea sa)

  # Drepturile de acces la membri
    -sa se declare mai intai membrii public, apoi cei protected, iar apoi cei private
    -datele membre sa apara dupa declararea metodelor
    -prima metoda declarata sa fie constructorul, apoi destructorul

  # Definirea claselor
    -ordinea definirii metodelor sa fie aceeasi cu a declararii acestora


    Un ultim sfat: nu este de ajuns sa cititi cursuri, carti sau cod sursa! Cea mai buna metoda pentru a invata un limbaj de programare este de a scrie efectiv cod.


 
   
Pagini: 1  
Mergi la