Programiranje 2, 1. parcijalni, metodologija kod izrade zadatka

Iako sam bio "tanako ogata" ispit sam dobro uradio :)

Teorija

Ispit je imao dva teoretska pitanja:

  1. o destruktorima - kada se pozivaju
  2. o konstruktoru kopije - da li je  potrebno da bude ulazni parametar const i po referenci

1. Destruktori

Tu je glavna kvaka bila da se oni uobičajeno ne pozivaju eksplicitno nego implicitno, i to onda kada važenje objekte varijable prestane. Pa sam dao primjer neki 'ala ovo:

https://gist.github.com/720190

2. Konstruktor kopije

tu sam objasnio da mora biti po referenci inače će se desiti rekurzivan poziv, jer svako prosljeđivanje varijable koja je objekat klase povlači poziv konstruktora kopije.

Što se tiče const tu sam odgovorio da je to dobra praksa ali nije neophodno.

Zadatak

Zadana je bila klasa Student kod koje su zadate funkcije koje su trebale raditi određene poslove, što je navedeno u zadatku.

Po sjećanju:

https://gist.github.com/720197

U zadatku su onda naveden funkcije koje je kod klase trebalo implementirati:

  • operator+=   - u niz _ocjene dodaje ocjenu studanta (int ulazni parametar), i napraviti potrebnu validaciju
  • operator()  - navesti dva int parametra koji gdje će funkcija operator vratiti broj ocjena koje student ima sa tim ocjenama
  • operator<< ako koji na izlazni stream "baca" sve podatke o atributima objekata

Možda sam nešto i ispustio ali to je to.

"Kvake" zadatka

1) Konstruktor

Kod zadatka je kvaka bila const int koji je zahtjevao da konstruktor bude ovakav:

https://gist.github.com/720205

To je klasična fora na PR2.

2) U zadatku je namjerno stavljeno da _brOcjena bude pointer

pa se on u konstruktoru napraviti sa new,  destruktoru morao "ubiti" sa delete.

Ja sam po svom standardnom običaju to previdio (jer se to jednostavno tako ne radi :)), ali mi je asistent Denis bez imalo ustezanja pomogao. Hvala asistentu !

tako je trebalo koristio _ocjene[*_brOcjena], a ne _ocjene[*_brOcjena] kako sam ja lupao(*).

Traženi komentari u zadatku

Tražilo se objašnjenje za razloge za friend funkcije (to je ona sa operator<<). Mislim da sam tu napravio grešku.

Ja sam rekao da se friend funkcije moraju koristiti onda kada nam klasa ne vraća objekt tog tipa.

Međutim to je poprilično blentav odgovor. Masa je member funkcija koje ne vraćaju objekat tipa te Klase.

Kada malo razmislim mislim da je u ovome kvaka:

     cout << student_var << "nesto .." << endl;

Ovdje imamo binarni operator kod koga je lijeva strana objekat druge klase. U svim drugim slučajevima left operand je objekat te klase (u ovom slučaju Student).

Time bi odgovor bio: kada je lijevi operand objekat druge klase, moramo ići na friend/globalnu funkciju (**).

Strategija rješavanja zadatka PR2

Neću međutim dalje govoriti o tome kako sam rješavao zadatak. Ostalo nije previše interesantno :).

Govoriću o onome što sam kod kolega uočio kao veliku grešku.

Hajmo raditi na papiru ?!?

Evo o čemu se radi: Na PR2 se traži da se zadatak može kompajlirati. Čak sam našao da su na forumima iz tog razloga neki studenti tražili da se piše na papiru.

Tim kolegama poručujem: idite bavite se nekim drugim poslom. Ovo je predmet programiranje, ovo je fakultet je fakultet informacionih tehnologija.

Rad na računaru  je jedini prirodan način da se zadaci iz ovog predmeta rješavaju. Ako je kvaka u tome da se tolerišu greške, pa onda se to i sa računarom može uvesti.

Svakako bi za mene ovaj zadatak za 60minuta na papiru bio misaona imenica. I što je najbitnije: najobičnije maltretiranje.

Psihologija čovjeka:  reakcija na "milion grešaka"

U ovako ograničenom vremenu vrlo je bitno da se čovjek ne izgubi. Bez obzira što sam programer dugo godina, i meni se u par navrata dešavala blokada.

Većina kolega su kucali kucali kucali ... i pred kraj ispita su imali po 100-200 grešaka. C++ zna jedan ispušteni ";" pretvoriti u 100 grešaka.

I kada to 10 minuta pred kraj vidiš ti si donji.

Moja metodlogija: skeleton

Ja sam čitavo vrijeme projekat držao čistim. Ako bi se na nekoj funkciji izgubio ja bih je sa /*  ... */ komentarisao, kako u zaglavlju, tako i u implementaciji.

Tako sam prvih 30-40 minuta imao projekat koji se kompajlira - ali ništa nije implementirano.

To je izgledalo ovako:

https://gist.github.com/720254

Znači imao sam funkcije koje još ne rade ništa.

Inkrementalni pristup

Treba uočiti kako sam odmah napravio objekat, koji nije ništa radio oprave, ali se kreirao !

Pa sam ga "ispisao" na cout sream;

Na taj način sam bez odlaganja mogao provjeriti da li stvar radi čim implementiram te funkcije.

Step by step sam dodavao novu funkciju.

Ako stvar "prolupa" - ako me kompajler obaspe greškama ja to komentarišem i idem dalje.

Tako sam postupno jednu po jednu funkciju otkačivao.

hernad genijalac ?

Volio bih da jesam ali nisam.

Ja sam ovaj pristup zauzeo zato što se 25 godina bavim programiranjem i što sam u tom vremenu dosta developerskih metodologija usvojio. Jedna od njih je Test driven development (TDD)

E ta metodologija na sličan način pristupa izradi sistema. Razlika je jedina što se u TDD-u implementiraju test case-ovi kojim se provjerava da li kod funkcioniše kako je zamišljeno, dok sam ja ovdje fokus stavio na to da jednostavno provjeravam da li se source može kompajlirati.

 

---

(*) Moram reći da sam ja u tom trenutku poruku o grešci pogrešno interpretirao, misleći da trebam praviti neke konverzije na matrici ocjene koje kompajler tretira kao pointer na integer. Mogao sam pravo odlutati da mi nije Denis pomogao.

(**) Ovo govorim iz glave

1902 views and 4 responses

  • Nov 29 2010, 10:32 AM
    Ernad Husremović responded:
    na FIT forumima sam objavio info ovome: http://cs.fit.ba/forums/thread/163612.aspx

    Slađana je rekla:

    > Evo Adisa i ja bas procitasmo analizu i sintezu koju si dao...Osim ovog subjektivnog dijela kako si radio svoj zadatak, sta si grijesio itd...u potpunosti si u pravu da nije lose organizovati se malo u ovih 60 minuta napetosti...Doista nije losa ideja poceti sa siromasnim mainom i funkcijama koje su tu, ispravne al oprave nista ne rade...pa prema ostatku vremena kako kazes inkrementirati kod...al eto sve ovo nije vrijedno bez dosta rada i vjezbe at home :) ...

    Ja odgovorio Slađani:

    > Ja mislim da je zahtjev na PR2: ako ne radi = pao si uopšte nije besmislen.

    > Ovo je uvođenje u ono što jeste cilj programiranja: napiši program koji daje rezultate.

    > S druge strane, prema onome što sam čuo od raje nakon ispita (i onog kolege iz prve grupe koji je sa nama popričao) nešto tu "smrdi".

    > Nemoguće je da su baš svi za padanje. Zato sam se i fokusirao na metodologiju izrade.

    Ona bi trebala omogućiti da i oni sporiji (ali koji stvari naravno dovoljno kontaju stvar) urade za 6-7. A ne da padnu zato što ih obaspe more grešaka.

  • Nov 29 2010, 10:52 AM
    J450 responded:
    Hernard, svaka cast na postu, samo si trebao ovo ranije napisati mnogi bi bolje uradili
  • Nov 29 2010, 10:53 AM
    J450 responded:
    ovo moram pod hitno protitati Test driven development (TDD)
  • Nov 29 2010, 11:48 AM
    Ernad Husremović responded:
    > Hernard, svaka cast na postu, samo si trebao ovo ranije napisati mnogi bi bolje uradili

    @J450 Hvala. Ali ja stvarno nisam znao da će ovako veliki broj ljudi reći: "nije kompajliralo".

    Definitivno nije ovo bio neki skrivani džoker iz rukava :)

    Čim sa skontao da se raja gubi, evo sam to što ja znam stavio na papir.