ПСИ/Јун 2020

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу

Јунски испит 2020. године одржан је 19. јуна. Трајао је 120 минута, укупно је носио 40 бодова (теоријски део 12, практични 28), практични део се радио већином на рачунару а теоријски у потпуности на папиру. Штампана литература није била дозвољена, а радни оквири који су се користили на практичном делу били су CodeIgniter и Laravel. Текст испита, као и фајлови за имплементацију и скрипт базе доступни су са странице предмета. Иако радни оквир Django није био понуђен на предмету све до 2022. године, испод се могу наћи и решења у њему.

Професор Драган Бојић одговорио је на питање шта су били очекивани одговори на теоријском делу испита.

1. задатак

Поставка

  1. Дат је следећи фрагмент PHP програмског кода, који се исправно преводи и извршава. Навести, ако постоји, један од SOLID принципа пројектовања, који овај код нарушава (укратко дефинисати принцип и објаснити зашто је нарушен).
    <?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. Исто као под тачком а), али за следећи програмски код (претпоставка је да постоје све класе које се помињу у коду; такође да се све евентуалне грешке правилно обрађују):
    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);
        }
    }
    

Решење

  1. Овде је нарушен принцип замене Лискове (LSP). Принцип замене Лискове нам каже да објекти неке надкласе треба да буду замењиви објектима подкласа без промене функционалности.
  2. Овде је нарушен принципи једне одговорности (SRP). Принцип једне одговорности нам каже да једна класа треба да има само један разлог из ког би се мењала. Овде видимо да Извођач има много више одговорности: налази подизвођача, каже подизвођачу да нађе столара, каже столару да набави оквир...

2. задатак

Овај задатак није решен. Помозите SI Wiki тако што ћете га решити.

Поставка

Претпоставимо да треба тестирати метод montirajVrata() из примера 1б). Навести јединични тест са свим потребним mock објектима.

Решење

3. задатак

Поставка

Дата је спецификација веб портала за евиденцију догађаја у Србији, који се организују после епидемије короне. Корисници система су администратор и организатор. Администратор, након успешног логовања на систем, може да уређује веб портал, тако што додаје нове категорије догађаја, и додаје и брише локације и места. Такође, он може да ажурира информације о организаторима, додаје нове корисничке налоге за организаторе или их брише. Организатор је корисник који након успешног логовања на систем може да дода нови догађај, или ажурира свој догађај, али тако што само може да га откаже, или промени датум и време одржавања, на касније. Сви типови корисника овог система имају могућност промене лозинке и промене својих личних података, који се чувају у оквиру корисничких налога. Нерегистровани корисници (гости) могу се регистровати, попуњавањем регистрационе форме. Они могу и претраживати догађаје, као и сви регистровани корисници.

На почетној веб страни, налази се форма за претраживање догађаја, чији прототип изгледа као на слици.

Када се притисне дугме ТРАЖИ, гост добија на истој веб страни резултате претраге, у табели са следећим колонама: назив догађаја, град, место (локација) одржавања догађаја и максимални капацитет локације. У сваком реду, поред сваког резултата претраге, треба да постоји дугме ДЕТАЉИ, којим се прелази на нову веб страну, прослеђивањем GET параметра.

На страни са детаљима треба приказати: назив догађаја, град, место одржавања, датум и време догађаја, број тренутно заинтересованих гостију и оцену догађаја. Оцена догађаја треба да буде случајно генерисан реалан број између 1.0 и 5.0, на две децимале (можете користити уграђену rand() функцију). На веб страни са детаљима, треба да постоји и линк НАЗАД, којим корисник може да се врати на почетну веб страну са описаном формом.

Обавезан је унос бар једног критеријума претраге. Уколико се у форми за претраживање не унесе ништа, осим иницијално означеног на слици, приказују се порука: „Морате унети бар један критеријум претраживања“. Уколико се унешеним критеријумима претраге не добија ниједан догађај као резултат, исписује се порука: „Ниједан резултат не задовољава тражене критеријуме“. Критеријум назив догађаја треба да буде реализован не по тачном називу догађаја из базе, већ само по једном делу назива догађаја. Поље за потврду ОТКАЗАН излистава само догађаје који су отказани, уколико није то поље означено, излиставају се сви догађаји, али се отказани догађаји приказују црвеном бојом фонта у табели резултата претраживања. Дугметом ПОНИШТИ, форма за претраживање се враћа у првобитно стање. Током излиставања резултата, критеријуми претраживања треба да остану унутар форме.

  1. Реализовати дијаграм случајева коришћења за све категорије корисника и дијаграм секвенце за функционалност претраживања догађаја, према описаној спецификацији система.
    Очекивани резултат зад. 3а): нацртати дијаграме на приложеном папиру.
  2. У алату Visual Studio Code, реализовати MVC (Model-View-Controller) апликацију коришћењем програмског језика PHP. Имплементацију је могуће радити коришћењем објектно-оријентисаног PHP кода или коришћењем CodeIgniter или Laravel оквира. Потребно је имплементирати искључиво део система који се односи на претраживање догађаја од стране нерегистрованог корисника, а према описаној спецификацији. Обухватити све сценарије претраживања, и успешно и неуспешна претраживања. Користити релациону базу података, која је дата уз поставку, у MySQL скрипти dogadjaji2020.sql.
    Очекивани резултат зад. 3б): пројекат PHP имплементације описаног дела апликације (уколико се ради у радном оквиру, прекопирати такође читав пројекат на диск Рад L:)
  3. Коришћењем алата Selenium IDE, написати тест примере којим ћете тестирати форму за претраживање догађаја, која је описана у тексту задатка и имплементирана у тачки б). Користити исту базу података, као у тачки б).
    Очекивани резултат зад. 3в): пројекат окружења Selenium IDE, са свим тестовима, снимити као фајл са ектензијом .side и прекопирати на диск Рад L:. Довољно је тестове покренути само у окружењу Google Chrome или Mozilla Firefox.

Решење

  • Django и Selenium IDE пројекат као и StarUML дијаграм
    • За покретање потребно је следеће:
      1. Преузети са странице предмета скрипт базе и покренути
      2. Имати Django инсталиран на рачунару
      3. У jun2020/settings.py изменити креденцијале за базу са is1 / tubic на корисника који постоји и његову лозинку
      4. Закоментарисати поља grad и kategorija у rafting/forms.py
      5. Покренути python manage.py migrate
      6. Откоментарисати горенаведене линије
      7. Покренути python manage.py runserver
      8. Посетити http://127.0.0.1:8000
  • CodeIgniter пројекат и SQL скрипта
    • За покретање потребно је следеће:
      1. Покренути SQL скрипту која ће напрарвити базу и попунити је подацима
      2. У app/Config/Database.php изменити креденцијале за базу са is1 / tubic на користника који постоји и његову лозинку
      3. Имати Composer инсталиран
      4. Покренути composer install како би се инсталирали потребни пакети за пројекат
      5. Покренути php spark serve
      6. Посетити http://127.0.0.1:8080