Skip to content

Mallivastaus ja arvosteluperusteet

Matti Luukkainen edited this page Mar 8, 2015 · 8 revisions

Erillistä kokeen palautustilaisuutta ei järjestetä. Oman kokeen arvostelusta voi kysyä suoraan kunkin tehtävän korjaajalta joko emailitse tai irkissä:

tehtävä 1

MVC: periaate, jonka mukaan sovellus jaetaan erillisiin komponetteihin siten että sovelluslogiika on eristetty muista riippumattomiksi Modeleiksi. Sovelluksen toimintojen koordinoinnista (käyttäjän syötteisiin reagointi) huolehtii Kontrolleri ja HTML- (ja ideaaliilanteessa myös muuntyyppiset) näkymät generoidaan erillisten Viewien avulla.

Sovelluksen toiminta osoitteeseen http://localhost:3000/countries/1 HTTP GET -pyynön yhteydessä:

  1. routes.rb:n määrittelyn get '/countries/:id', to:'countries#show' takia pyynnön hoitaa CountriesController-luokan metodi show.
  2. routes.rb:n määrittelyn ansiosta urlin resurssin yksilöivä osa asetetaan params-hashin avaimen :id arvoksi
  3. kontrolleri hakee tietokannasta tunnistetta vastaavan resurssin
  4. tietokantahaku tapahtuu resurssia vastaavan model-luokan Country luokkametodin find avulla
  5. haettua resurssia käsitellään Country-luokan instanssina
  6. kontrolleri asettaa haetun resurssin instanssimuuttujaan @country
  7. kontrollerin lopussa suoritetaan oletusarvoisen näkymätemplaten views/countries/show.html.erb renderöinti
  8. template 'näkee' kontrollerin asettaman instanssimuuttujan @country kautta sivua vastaavan maan
  9. maata vastaava model-luokka on määritelty sisältämään joukon City-luokan olioita (has many...), joihin maa pääsee käsiksi metodin cities avulla
  10. näkymätemplate renderöi maan sivulle (maan nimen lisäksi) each-iteraattorin avulla läpikäydenmaahan liittyvät kaupungit
  11. näkymätemplaten renderöinnin seurauksena syntyy HTML-sivu, joka palautetaan selaimelle yhdessä HTTP-statuskoodin (200) kanssa

Täydet pisteet jos suunilleen jokainen vaihe oli mainittu tai kävi vastauksesta ilmi. Noin -0.5p jokaisen oleellisen vaiheen maininnan puutteesta.

tehtävä 2

  1. selain tekee HTTP POST -pyynnön osoitteeseen /countries. Pyynnön mukana välittyy tieto luodun maan nimestä
  2. routes.rb:n määrittelyn post '/countries', to:'countries#create' perusteella kutsutaan CountriesController:in metodia create
  3. kontrolleri pääsee käsiksi lomakkeen lähettämiin tietoihin params-muuttujan avulla, käyttäen require- ja permit-metodeja, käytännössä tieto on hash muotoa { :name => "Finland" }
  4. kontrolleri luo uuden Country-olion lomakkeen tiedoilla ja tallettaa sen muuttujaan @country
  5. kontrolleri pyytää olioa tallentumaan kutsumalla sen metodia save
  6. tallennuksen yhteydessä suoritetaan modelin määrittelemät validoinnit, eli tarkistetaan onko maan nimi uniikki ja pituudeltaan vähintään 3 merkkiä

jos talletus onnistuu eli olio on validi:

  1. save palauttaa toden arvon
  2. uudelleenohjataan käyttäjän selain kaikkien maiden sivulle, käytännössä tämä tarkoittaa että HTTP-kutsuun vastataan statuskoodilla 302 ja tiedolla siitä, mihin urliin selaimen tulee tehdä HTTP GET
  3. selain siis tekee GET-pyynnön kaikkien maiden sivulle. Sivulla näytetään myös kontrollerin määrittelemä 'flash'-viesti

jos talletus ei onnistu eli olio on epävalidi:

  1. save palauttaa epätoden arvon
  2. maan luontiin tarkoitettu lomake 'new' renderöidään uudelleen
  3. validoinnin yhteydessä olioon on liitetty muuttuja error, jonka perusteella lomakkeelle renderöityvät validoinnin virheviestit
  4. virheviesteillä varustettu lomake palautetaan pyynnön tehneelle selaimelle

pisteytys:

  • POST ja reititys oikealle metodille 0.5p
  • formin tietojen aksessointi ja olion luominen 0.5p
  • validointi (millä perusteella ja milloin) 1p
  • redirect jos validi 1p
  • renderöinti virheilmoituksilla 1p

tehtävä 3

Kerro mitä ongelmia sivun toteutuksessa on suorituskyvyn kannalta? (1p)

  1. Sivua varten haetaan ensiksi kaikki maat omassa tietokantakyselyssä.
  2. Jokaisen maan kohdalla lasketaan maan väkiluku hakemalla kaikki maan kaupungit erillisissä kyselyissä ja laskemalla näiden väkiluvut yhteen.
  • Rails käyttää relaatioissa oletusarvoisesti lazy loading-menetelmää, jossa yhteydet selvitetään vasta niitä pyydettäessä.
  • Tehtävässä maan kaupungit selvitettiin vasta kun näkymässä pyydettiin maan väkilukua.
  • Sivun luomiseen tehdään todella paljon tietokantapyyntöjä (N+1 ongelma), jonka takia sovelluksen suorituskyky on koetuksilla suurilla tietomäärillä.

Millä Railsin tarjoamilla tekniikoilla näitä voidaan optimoida? (1p) Mitkä ovat kunkin optimointitekniikan hyvät ja huonot puolet? (1p) Mitä muutoksia näiden käyttöönotto edellyttäisi koodin tasolla? (1p)

Vastauksessa piti kuvata vähintään kahta optimointitekniikkaa. Useat tekniikat ovat kompromisseja, joilla on sekä hyviä että huonoja puolia. Vastauksesta haluttiin myös konkreettinen kuvaus kunkin tekniikan käyttöönotosta.

tehtävä 4

  1. Modelin Union luonti ja Union-migraation kuvaus. (1p)

Jokin seuraavista:

  • rails generate scaffold Union name:string year:integer
  • rails generate model Union name:string year:integer
  • Mallin luonti käsin, perintä ActiveRecord::Base. Migraation luonti: rails generate migration CreateUnions + kentät.

Joko 2.1. tai 2.2.

2.1. has_many, through:n käyttö.

  • Liitostaulumigraation luonti tai taulun kuvaus. (1p)
  • Modeleihin Country ja Union has_many:t (ja has_many, through:t). Liitostaulumodeliin belongs_to:t. (2p)

2.2. has_and_belongs_to_many:n käyttö.

  • Liitostaulumigraation luonti tai taulun kuvaus. (1p)
  • Modeleihin Country ja Union has_and_belongs_to_many:t. (2p)

Migraatioiden suoritus tietokantaan.

2.X. Liitostaulu(migraatio) muotoa:

class CreateJoinTable < ActiveRecord::Migration
  def change
    # 2.1. x on esim. :memberships
    # 2.2. x on :countries_unions
    create_table x do |t|
      t.integer :country_id
      t.integer :union_id
    end
  end
end