PSI/Jun 2020

Izvor: SI Wiki
Pređi na navigaciju Pređi na pretragu

Junski ispit 2020. godine održan je 19. juna. Trajao je 120 minuta, ukupno je nosio 40 bodova (teorijski deo 12, praktični 28), praktični deo se radio većinom na računaru a teorijski u potpunosti na papiru. Štampana literatura nije bila dozvoljena, a radni okviri koji su se koristili na praktičnom delu bili su CodeIgniter i Laravel. Tekst ispita, kao i fajlovi za implementaciju i skript baze dostupni su sa stranice predmeta. Iako radni okvir Django nije bio ponuđen na predmetu sve do 2022. godine, ispod se mogu naći i rešenja u njemu.

Profesor Dragan Bojić odgovorio je na pitanje šta su bili očekivani odgovori na teorijskom delu ispita.

1. zadatak

Postavka

  1. Dat je sledeći fragment PHP programskog koda, koji se ispravno prevodi i izvršava. Navesti, ako postoji, jedan od SOLID principa projektovanja, koji ovaj kod narušava (ukratko definisati princip i objasniti zašto je narušen).
    <?php
        abstract class Zivotinja {
            public function izgled() {}
        }
        abstract class Ptica extends Zivotinja {
            public function leti() { return true; }
        }
        class Papagaj extends Ptica {
            public function izgled() { return "saren"; }
        }
        class Pas extends Zivotinja {
            public function izgled() { return "braon"; }
            public function laje() { return true; }
        }
    
        class LjubiteljPtica {
            public function fotografisi($ptica) { echo $ptica->izgled(); }
        }
        $ljt = new LjubiteljPtica;
        $ljt->fotografisi(new Pas);
    
  2. Isto kao pod tačkom a), ali za sledeći programski kod (pretpostavka je da postoje sve klase koje se pominju u kodu; takođe da se sve eventualne greške pravilno obrađuju):
    class Izvodjac {
        protected $imenik;
        function __construct($imenik) { $this->imenik = $imenik;}
    
        function montirajVrata() {
            $podizvodjac = $this->imenik->nadjiPodizvodjaca();
            $stolar = $podizvodjac->nadjiStolara();
            $okvir = $stolar->nabaviOkvir();
            $panel = $stolar->nabaviPanelVrata();
            $sarke = $stolar->nabaviSarke();
            $vrata = $stolar->montiraj($okvir, $panel, $sarke);
            $bravar = $podizvodjac ->nadjiBravara();
            $bravar->monitorajBravu($vrata);
        }
    }
    

Rešenje

  1. Ovde je narušen princip zamene Liskove (LSP). Princip zamene Liskove nam kaže da objekti neke nadklase treba da budu zamenjivi objektima podklasa bez promene funkcionalnosti.
  2. Ovde je narušen principi jedne odgovornosti (SRP). Princip jedne odgovornosti nam kaže da jedna klasa treba da ima samo jedan razlog iz kog bi se menjala. Ovde vidimo da Izvođač ima mnogo više odgovornosti: nalazi podizvođača, kaže podizvođaču da nađe stolara, kaže stolaru da nabavi okvir...

2. zadatak

Ovaj zadatak nije rešen. Pomozite SI Wiki tako što ćete ga rešiti.

Postavka

Pretpostavimo da treba testirati metod montirajVrata() iz primera 1b). Navesti jedinični test sa svim potrebnim mock objektima.

Rešenje

3. zadatak

Postavka

Data je specifikacija veb portala za evidenciju događaja u Srbiji, koji se organizuju posle epidemije korone. Korisnici sistema su administrator i organizator. Administrator, nakon uspešnog logovanja na sistem, može da uređuje veb portal, tako što dodaje nove kategorije događaja, i dodaje i briše lokacije i mesta. Takođe, on može da ažurira informacije o organizatorima, dodaje nove korisničke naloge za organizatore ili ih briše. Organizator je korisnik koji nakon uspešnog logovanja na sistem može da doda novi događaj, ili ažurira svoj događaj, ali tako što samo može da ga otkaže, ili promeni datum i vreme održavanja, na kasnije. Svi tipovi korisnika ovog sistema imaju mogućnost promene lozinke i promene svojih ličnih podataka, koji se čuvaju u okviru korisničkih naloga. Neregistrovani korisnici (gosti) mogu se registrovati, popunjavanjem registracione forme. Oni mogu i pretraživati događaje, kao i svi registrovani korisnici.

Na početnoj veb strani, nalazi se forma za pretraživanje događaja, čiji prototip izgleda kao na slici.

Kada se pritisne dugme TRAŽI, gost dobija na istoj veb strani rezultate pretrage, u tabeli sa sledećim kolonama: naziv događaja, grad, mesto (lokacija) održavanja događaja i maksimalni kapacitet lokacije. U svakom redu, pored svakog rezultata pretrage, treba da postoji dugme DETALjI, kojim se prelazi na novu veb stranu, prosleđivanjem GET parametra.

Na strani sa detaljima treba prikazati: naziv događaja, grad, mesto održavanja, datum i vreme događaja, broj trenutno zainteresovanih gostiju i ocenu događaja. Ocena događaja treba da bude slučajno generisan realan broj između 1.0 i 5.0, na dve decimale (možete koristiti ugrađenu rand() funkciju). Na veb strani sa detaljima, treba da postoji i link NAZAD, kojim korisnik može da se vrati na početnu veb stranu sa opisanom formom.

Obavezan je unos bar jednog kriterijuma pretrage. Ukoliko se u formi za pretraživanje ne unese ništa, osim inicijalno označenog na slici, prikazuju se poruka: „Morate uneti bar jedan kriterijum pretraživanja“. Ukoliko se unešenim kriterijumima pretrage ne dobija nijedan događaj kao rezultat, ispisuje se poruka: „Nijedan rezultat ne zadovoljava tražene kriterijume“. Kriterijum naziv događaja treba da bude realizovan ne po tačnom nazivu događaja iz baze, već samo po jednom delu naziva događaja. Polje za potvrdu OTKAZAN izlistava samo događaje koji su otkazani, ukoliko nije to polje označeno, izlistavaju se svi događaji, ali se otkazani događaji prikazuju crvenom bojom fonta u tabeli rezultata pretraživanja. Dugmetom PONIŠTI, forma za pretraživanje se vraća u prvobitno stanje. Tokom izlistavanja rezultata, kriterijumi pretraživanja treba da ostanu unutar forme.

  1. Realizovati dijagram slučajeva korišćenja za sve kategorije korisnika i dijagram sekvence za funkcionalnost pretraživanja događaja, prema opisanoj specifikaciji sistema.
    Očekivani rezultat zad. 3a): nacrtati dijagrame na priloženom papiru.
  2. U alatu Visual Studio Code, realizovati MVC (Model-View-Controller) aplikaciju korišćenjem programskog jezika PHP. Implementaciju je moguće raditi korišćenjem objektno-orijentisanog PHP koda ili korišćenjem CodeIgniter ili Laravel okvira. Potrebno je implementirati isključivo deo sistema koji se odnosi na pretraživanje događaja od strane neregistrovanog korisnika, a prema opisanoj specifikaciji. Obuhvatiti sve scenarije pretraživanja, i uspešno i neuspešna pretraživanja. Koristiti relacionu bazu podataka, koja je data uz postavku, u MySQL skripti dogadjaji2020.sql.
    Očekivani rezultat zad. 3b): projekat PHP implementacije opisanog dela aplikacije (ukoliko se radi u radnom okviru, prekopirati takođe čitav projekat na disk Rad L:)
  3. Korišćenjem alata Selenium IDE, napisati test primere kojim ćete testirati formu za pretraživanje događaja, koja je opisana u tekstu zadatka i implementirana u tački b). Koristiti istu bazu podataka, kao u tački b).
    Očekivani rezultat zad. 3v): projekat okruženja Selenium IDE, sa svim testovima, snimiti kao fajl sa ektenzijom .side i prekopirati na disk Rad L:. Dovoljno je testove pokrenuti samo u okruženju Google Chrome ili Mozilla Firefox.

Rešenje

  • Django i Selenium IDE projekat kao i StarUML dijagram
    • Za pokretanje potrebno je sledeće:
      1. Preuzeti sa stranice predmeta skript baze i pokrenuti
      2. Imati Django instaliran na računaru
      3. U jun2020/settings.py izmeniti kredencijale za bazu sa is1 / tubic na korisnika koji postoji i njegovu lozinku
      4. Zakomentarisati polja grad i kategorija u rafting/forms.py
      5. Pokrenuti python manage.py migrate
      6. Otkomentarisati gorenavedene linije
      7. Pokrenuti python manage.py runserver
      8. Posetiti http://127.0.0.1:8000
  • CodeIgniter projekat i SQL skripta
    • Za pokretanje potrebno je sledeće:
      1. Pokrenuti SQL skriptu koja će naprarviti bazu i popuniti je podacima
      2. U app/Config/Database.php izmeniti kredencijale za bazu sa is1 / tubic na koristnika koji postoji i njegovu lozinku
      3. Imati Composer instaliran
      4. Pokrenuti composer install kako bi se instalirali potrebni paketi za projekat
      5. Pokrenuti php spark serve
      6. Posetiti http://127.0.0.1:8080