Author
gjermund-bjaanes
View
165
Download
5
Embed Size (px)
i
Roommates
En applikasjon for gjre bofellesskap enklere.
Gruppedeltakere / Real Kode:
Gjermund Bjaanes,
Johann Eckhoff og
Katrine Myklevold
ii
Hovedoppgave
Gruppen har utviklet en mobil applikasjon. Applikasjonen brukes for kommunikasjon i
samboersituasjoner. Man kan sende notater til hverandre, fre utlegg og lage huskelister.
Dette er organisert slik at brukerne kan logge seg inn. Disse brukerne kan knyttes opp mot en
husholdning, hvor all informasjon som blir postet, blir delt med de andre medlemmene.
SAMMENDRAG
DA-2014-02 OPPGAVE NR
TILGJENGELIGHET
PEN
ETTER AVTALE
KONFIDENSIELL
Besksadr.: Raveien 215 3184 Borre Tlf: 33031000, Fax: 33031100
Institutt for ingenirutdanning i Vestfold
Roommates - En applikasjon for gjre bofelleskap enklere.
NORSK OPPGAVETITTEL
Roommates - An application to make shared housing easier.
ENGELSK OPPGAVETITTEL
75
DATO LEVERT
ANTALL SIDER
Gjermund Bjaanes
Johann Eckhoff
Katrine Myklevold
FORFATTER(E)
Egen
OPPDRAGSGIVER
Veileder: Thomas Nordli
REF. /VEILEDER(E)
Applikasjon, Multiplattform, Skylsning
3 STIKKORD
iii
SAMMENDRAG (forts.)
Applikasjonen synkroniserer data over skyen ved hjelp av et back-end-system som heter
Parse. Dette er et system med en NoSQL-database, sttte for push-meldinger og tjenerside-
kode. Her ligger databasen hvor alle brukerdata er lagret, samt tjenerside-kode for utfre
visse oppgaver. Applikasjonen er laget og testet for brukes p alle enheter som kjrer iOS,
samt mobiltelefoner som kjrer Android 4.0 og oppover.
Gjennom prosjektet er det blitt brukt en systemutviklingsmetode som heter inkrementell
utvikling. Denne metoden gr ut p at systemet leveres i inkrementer, hvor ny funksjonalitet
blir lagt til for hvert inkrement. Applikasjonen er utviklet i tre inkrementer.
Gruppen har gjennom prosjektet ftt kunnskap innen programmering mot Android og iOS,
samt bruk av 3. parts biblioteker og dets dokumentasjoner. Gruppen har ogs tilegnet seg
erfaring med strre prosjektarbeid og metoder rundt dette.
For videre utvikling er det planlagt gi applikasjonen ut p Apple App Store og Google Play.
Dette krever at det blir satt hyere krav til applikasjonens kvalitet. Da er det behov for nye
runder med beta-testing, samt utarbeidelse av en konomisk plan for hvordan fremtidige
utgifter til drift av back-end skal finansieres.
iv
Skjemaet skal leveres sammen med besvarelsen.
Obligatorisk erklring Jeg erklrer herved at min:
Eksamensbesvarelse i emnekode: FE-BAC3000 Fakultet: TekMar
1. er utfrt av undertegnede. Dersom det er et gruppearbeide, blir alle involverte holdt ansvarlig og alle skal undertegne blanketten.
2. ikke har vrt brukt til samme/en annen eksamen ved HVE eller et annet institutt/ universitet/hgskole innenlands eller utenlands.
3. ikke er kopi eller avskrift av andres arbeid, uten at dette er korrekt oppgitt.
4. ikke refererer til eget tidligere arbeid uten at dette er oppgitt.
5. har oppgitt alle referanser/kilder som er brukt i litteraturlisten.
Jeg/vi er kjent med at brudd p disse bestemmelsene er betrakte som fusk og
behandles i hht. 18 i Forskrift om eksamen og studierett ved HBV og U-loven Kap. 4
4-7.
Dato: Sted:
Underskrift1: Kand.nr.:
Ved gruppebesvarelse m alle gruppas deltagere undertegne:
Underskrift: Kand.nr.: Underskrift: Kand.nr.:
Underskrift: Kand.nr.:
1 Hvis erklringen leveres inn elektronisk via Fronter er underskrift ikke ndvendig, skriv da inn navn.
v
Hovedprosjektets tittel:
Roommates - En applikasjon for gjre bofellesskap enklere.
Forfatternes navn:
Gjermund Bjaanes, Johann Eckhoff og Katrine Myklevold
Kurs/avdeling:
Ingenirfag, Datateknikk. Avdeling TekMar
Dato: _______________________
Rett til innsyn, kopiering og publisering av hovedprosjekt
Biblioteket og avdelingene fr ofte foresprsler om kopi eller innsyn i hovedprosjekt. Biblioteket nsker gjre gode hovedprosjekt tilgjengelig ved publisere dem i papirutgave og legge dem p internett. Hgskolen trenger studentenes tillatelse til dette.
Hovedprosjektet vil fortsatt vre forfatterens ndsverk med de rettigheter det gir.
Hgskolens bruk vil ikke omfatte kommersiell bruk av studenters hovedprosjekt.
Tillater du/dere at din/deres hovedprosjekt blir publisert bde i papir og nettutgave ?
___ ja ___ nei
Signatur av alle forfattere:
vi
Forord Denne rapporten er utarbeidet som en del av eksamineringen av FE-BAC3000, Bachelor oppgave.
Hensikten med denne rapporten er vise hvordan prosjektet har blitt gjennomfrt, hvordan
systemet er satt sammen, hvilke utfordringer som har oppsttt underveis, hvordan disse er hndtert
og hva resultatet av prosjektet ble.
Rapporten er utarbeidet av prosjektgruppen: Gjermund Bjaanes, Johann Eckhoff og Katrine
Myklevold. Vi er alle studenter ved Ingenirfag, Datateknikk, Hgskolen i Buskerud og Vestfold.
Takk til Vi nsker takke vr veileder gjennom prosjektet, Thomas Nordli, for hjelp med tekniske
sprsml, konstruktiv kritikk og veiledning generelt underveis.
Vre dyktige sprkvaskere: Astrid Bjaanes og Roald Bjaanes som har hjulpet oss med f
rapporten p et bedre sprklig niv.
Under betatesting har vi hatt god hjelp av Marlene Angelica Sjonsti Bjrnsen og dne Aalmo. De
har testet applikasjonen vr og gitt konstruktive tilbakemeldinger.
Til slutt vil vi takke Paul Hegarty fra Stanford University. Vi har ikke hatt direkte kontakt med han,
men han har likevel hjulpet oss veldig med opplringen i utvikling til iOS. Hans forelesninger som
ligger tilgjengelig p nettet har srget for en solid forstelse av plattformen. Den inspirasjon han
har gitt oss, kan ikke verdsettes hyt nok.
vii
Innholdsfortegnelse
Forord ............................................................................................................................... vi
Takk til .............................................................................................................................. vi
1 Innledning ................................................................................................................... 2
1.1 Bakgrunn for oppgaven ........................................................................................ 2
1.2 Problemstilling ...................................................................................................... 2
1.3 Problemformulering .............................................................................................. 2
1.4 Mlformulering ..................................................................................................... 3
1.4.1 Prosjektml ................................................................................................... 3
1.4.2 Produktml .................................................................................................... 3
1.4.3 Prosessml ................................................................................................... 3
1.5 Rapportens oppbygning ....................................................................................... 3
2 Kravspesifikasjon ........................................................................................................ 4
2.1 Funksjonelle krav ................................................................................................. 4
2.2 Ikke-funksjonelle krav ........................................................................................... 8
3 Valg av teknologi ......................................................................................................... 9
3.1 Valg av plattformer ............................................................................................... 9
3.2 Valg av back-end ................................................................................................. 9
4 Designspesifikasjon ...................................................................................................10
4.1 Systemoversikt ....................................................................................................10
4.2 Systemarkitektur .................................................................................................10
4.3 Datadesign ..........................................................................................................11
4.3.1 Role ..............................................................................................................13
4.3.2 Household ....................................................................................................13
4.3.3 User .............................................................................................................14
4.3.4 Note .............................................................................................................14
4.3.5 Event ............................................................................................................15
4.3.6 Invitation .......................................................................................................16
4.3.7 TaskList ........................................................................................................16
4.3.8 TaskListElement ...........................................................................................17
4.3.9 Installation ....................................................................................................17
4.3.10 Expense .....................................................................................................18
5 Prosess og metoder ...................................................................................................19
5.1 Utvikling ..............................................................................................................19
viii
5.1.1 Utviklingsmodell ...........................................................................................19
5.1.2 Kodestandard ...............................................................................................20
5.1.2.1 Navnsetting ............................................................................................20
5.1.2.2 Innrykk ....................................................................................................21
5.1.2.3 Krllparentes-posisjon ............................................................................21
5.1.3 Versjonskontroll ............................................................................................22
5.1.4 Utviklingsverkty ..........................................................................................22
5.1.4.1 Integrerte utviklingsmiljer (IDE) .............................................................22
5.1.4.2 Brukergrensesnittmodellering .................................................................24
5.1.4.3 Diagrammer ............................................................................................24
5.1.5 Testing .........................................................................................................25
5.1.5.1 Enhetstesting ..........................................................................................26
5.1.5.2 Systemtesting .........................................................................................28
5.1.5.3 Godkjenningstesting ...............................................................................28
5.2 Prosjekt ...............................................................................................................29
5.2.1 Gruppestruktur .............................................................................................29
5.2.2 Evernote .......................................................................................................29
5.2.3 Gantt-diagram ..............................................................................................30
5.2.4 Prosjektstyringsverkty ................................................................................31
6 Resultat......................................................................................................................31
6.1 Produkt ...............................................................................................................31
6.1.1 Produktml ...................................................................................................31
6.1.2 Kildekode .....................................................................................................31
6.1.2.1 Samtidighet (Concurrency) .....................................................................32
6.1.2.2 Facebook ................................................................................................32
6.1.2.3 iOS .........................................................................................................33
6.1.2.4 Cloud Code ............................................................................................39
6.1.2.5 Android ...................................................................................................40
6.1.3 Brukergrensesnitt .........................................................................................46
6.1.3.1 Applikasjonens Innhold ...........................................................................47
6.1.3.2 Navigasjon ..............................................................................................48
6.1.3.3 Fonts og farger .......................................................................................48
6.1.3.4 Forskjeller ...............................................................................................49
6.2 Prosjekt ...............................................................................................................51
6.2.1 Prosjektml ..................................................................................................51
6.2.2 Tidsbruk .......................................................................................................51
7 Konklusjon .................................................................................................................53
ix
7.1 Hvis gruppen startet p nytt.................................................................................53
7.2 Veien videre ........................................................................................................53
8 Litteraturliste ..............................................................................................................55
9 Begrepsliste ...............................................................................................................59
10 Vedlegg ....................................................................................................................61
11 Appendiks - Bakgrunnsteori .....................................................................................62
11.1 iOS ....................................................................................................................62
11.1.1 Brukergrensesnitt .......................................................................................62
11.1.2 Versjoner ....................................................................................................62
11.1.3 ObjectiveC ................................................................................................62
11.1.3.1 Syntaks .................................................................................................63
11.1.4 iOS Software Development Kit ...................................................................65
11.1.4.1 Rammeverk ..........................................................................................65
11.1.4.2 SDK Innhold: Abstraksjonslag ..............................................................65
11.1.5 Apples App Store .......................................................................................67
11.2 Android ..............................................................................................................67
11.2.1 Brukergrensesnitt .......................................................................................68
11.2.2 Versjoner ....................................................................................................68
11.2.3 Java ...........................................................................................................68
11.2.3.1 Dalvik Virtual Machine ..........................................................................68
11.2.3.2 Syntaks .................................................................................................68
11.2.4 XML Extensible Markup Language ..........................................................69
11.2.5 Android Software Development Kit .............................................................69
11.2.5.1 Arkitektur ..............................................................................................70
11.2.6 Google Play ................................................................................................71
11.3 Parse.................................................................................................................71
11.3.1 Teknologi ....................................................................................................71
11.3.2 Sikkerhet ....................................................................................................71
11.3.2.1 Autentisering.........................................................................................72
11.3.2.2 Konfidensialitet .....................................................................................72
11.3.2.3 Autorisasjon ..........................................................................................72
11.3.3 NoSQL .......................................................................................................72
11.4 Versjonskontroll med Git ...................................................................................73
Side 2 av 75
1 Innledning
1.1 Bakgrunn for oppgaven Prosjektet er ikke gitt av en arbeidsgiver, men er i stedet en id formet og utviklet av
prosjektgruppen.
1.2 Problemstilling Hvordan lage en helhetlig lsning/applikasjon for praktiske problemstillinger knyttet til
samboerskap, p tvers av plattformer?
1.3 Problemformulering I valget av oppgave bestemte prosjektgruppen seg for se p problemstillinger i forhold til
kryssplattformutvikling, lagring av data i skyen og mobile applikasjoner. Gruppen oppdaget et
behov alle hadde i forhold til samkjring av aktiviteter knyttet til samboerskap. Dette er noe veldig
mange studenter m forholde seg til, og gruppen bestemte seg derfor for utforske disse omrdene
og det som mtte dukke opp underveis i forhold til dette.
Samtidig s gruppen en mulighet til gjre et prosjekt der det kunne trekkes mange paralleller til
andre programfag fra studiet og dermed ta i bruk kunnskap som er opparbeidet. Gruppen nsker
blant annet bruke formelle systemutviklingsmetoder for effektivisere og kvalitetssikre arbeidet.
Gruppen nsket ogs se p muligheten for flere niver med testing. Det var nsket fokusere p
enhets-testing, automatisk testing og manuell testing (etterhvert ogs med utvidet publikum for
Alpha/Beta-testing). Dette er kunnskap og ferdigheter som mtte tilegnes bde fr og underveis i
prosjektet. Det var nskelig med et godt testet og solid sluttprodukt.
Som tidligere nevnt ville gruppen gjre et prosjekt knyttet til kryssplattformutvikling og lagring av
data i skyen. Valget falt p lage en mobilapplikasjon til de to strste mobilplattformene: Android
og iOS. Her valgte gruppen se p utfordringer knyttet til utvikle til to plattformer samtidig,
spesielt knyttet til kode og design. I forhold til skylagring ville gruppen bruke et ferdig BaaS-
system (Back-end as a Service) med ferdige rammeverk for de forskjellige utviklingsplattformene
som er valgt bruke.
Selve applikasjonen var tenkt som en roommates-app for samboere/studenter. Denne applikasjonen
skulle inneholde handleliste, utlegg, vaskelister, felles beskjeder etc. Dette er aktiviteter som de
fleste som er i samboerskap eller bofellesskap kan ha nytte av ha sentralisert og lett tilgjengelig.
Dette er ogs et behov som ikke er srlig godt dekket av andre tilbud p markedet per i dag. Det
finnes andre som har gjort forsk p dette, men de er etter gruppens mening ikke srlig gode.
Eksempler p applikasjoner gruppen har prvd som prver tilby det samme er Roommat.es til
iOS, og HomeSlice til Android og iOS. Ingen av disse applikasjonene dekker alle behovene
gruppen har, og gruppen mener problemet kan lses p en bedre mte enn det som allerede er gjort.
Side 3 av 75
1.4 Mlformulering
1.4.1 Prosjektml Gruppen nsket med dette prosjektet utvikle et produkt som fungerer og som kan brukes til
daglig. Systemet skulle synkronisere over skyen, vre tilgjengelig for s mange brukere som mulig
og vre lett bruke. Erfaringen gruppen nsket tilegne seg i dette prosjektet, ville vre veldig
relevant for arbeidslivet og gjre gruppens medlemmer mer attraktive i arbeidsmarkedet.
Gruppen mtte utforske og fordype seg i omrder som tidligere var relativt ukjente. Dette var ment
gi lring som er relevant og realistisk i forhold til en arbeidslivsituasjon. Siden prosjektet var
omfattende av natur, ville det vre naturlig lre mye om strre programvareutviklingsprosjekter.
1.4.2 Produktml Gruppen nsket lage en applikasjon som skulle fungere p tvers av kjente plattformer og
synkronisere smlst mellom disse. Gruppen ville lse et problem som alle medlemmene har hatt;
utfordringer tilknyttet til samboerskap og bofellesskap. Disse utfordringene skulle bli lettere mte
for alle ved lage en applikasjon som sentraliserer informasjon og oppgaver tilknyttet bofellesskap.
Applikasjonen skulle ogs vre lett bruke og ha et intuitivt brukergrensesnitt for at den skulle
vre enklere ta i bruk. Gruppen nsket gjre hverdagen lettere for alle som bor i et
bofellesskap, enten de har store problemer med f det til fungere fra fr, eller bare vil gjre det
lettere for seg selv og de de bor sammen med.
1.4.3 Prosessml Med dette prosjektet nsket gruppen lre mer om alt som er knyttet til programvareprosjekter;
prosjektarbeid, programmering, systemutviklingsmetoder, testing og dokumentasjon.
1.5 Rapportens oppbygning Rapporten er bygd opp av disse hovedpunktene
Kravspesifikasjon o Liste med krav, skrevet for beskrive egenskaper og tjenester som kreves av
systemet.
Valg av teknologi o Beskriver teknologiene som er valgt for lse problemet og tilfredsstille kravene i
kravspesifikasjonen.
Designspesifikasjon o Dokumentasjon av systemets arkitektur og datadesign.
Prosess og metoder o Beskriver prosesser, metoder og verkty som er benyttet for utvikle systemet.
Resultat o Beskriver resultatet av prosjektet og produktet som er laget.
Konklusjon o Slutning p prosjektet og sammenfatter resultatene fra prosjektet.
Litteraturliste o Liste over alle kilder som er brukt i rapporten.
Begrepsliste o Liste over ord og begreper som er brukt i rapporten, og en forklaring p disse.
Appendiks - Bakgrunnsteori o Utdypende forklaring av teorien bak en del av teknologien som er brukt. Den gir
en innsikt i applikasjonen som er produsert og systemet som en helhet.
Side 4 av 75
2 Kravspesifikasjon Prosessen med skrive en kravspesifikasjon definerer egenskaper og tjenester som kreves av
systemet.
Kravene er ment som en beskrivelse av systemets funksjonalitet, egenskaper og begrensninger.
2.1 Funksjonelle krav Funksjonelle krav er grunnleggende funksjoner i systemet. De beskriver bestemt funksjonalitet som
systemet skal ha.
Funksjonelt krav #1: Bruker skal kunne registrere bruker med e-post og selvvalgt passord.
Bruker skal kunne registrere seg med sin egen e-post og passord direkte fra applikasjonen. E-post
fungerer som brukernavn.
Registrering av bruker skal skje i applikasjonen, men autentiserer mot Parse sine tjenere.
Funksjonelt krav #2: Bruker skal kunne resette passordet sitt dersom bruker har glemt
passordet sitt.
Fra innloggingsskjermen skal bruker kunne fylle inn e-post og f tilsendt en e-post med veiledning
for stille tilbake passordet sitt.
Funksjonelt krav #3: Bruker skal kunne registrere ny bruker med Facebook.
Dette skal fungere p samme mte som andre applikasjoner som benytter seg av Facebook-
innlogging: Applikasjonen har en knapp med Facebook som sender bruker til Facebook hvor
bruker godkjenner at applikasjonen skal f tilgang til de ressurser som applikasjonen ber om.
Deretter blir bruker sendt tilbake til den originale applikasjonen som fr data fra Facebook som blir
brukt til registrere bruker.
Nr man registrere seg med Facebook skal det automatisk lages en ny bruker til applikasjonen som
er p lik linje med vanlige brukere i applikasjonen, bortsett fra at man ikke kan endre brukerdata.
Man skal ogs kun kunne logge inn via Facebook etter man frst har registrert med e-post-adressen
fra Facebook.
Registrering og innlogging med Facebook skal skje med samme knapp rett fra
innloggingsskjermen.
Funksjonelt krav #4: Bruker skal kunne lage felles beskjeder som alle medlemmer av
bofellesskapet kan se i applikasjonen.
Bruker skal kunne skrive beskjeder direkte i applikasjonen som blir tilgjengelig for alle brukere av
bofellesskapet.
Beskjeden skal komme opp i en meldingsstrm i applikasjonen til alle brukere som er medlem av
bofellesskapet.
Funksjonelt krav #5: Bruker skal kunne f beskjed om nye hendelser i bofelleskapet (nye
beskjeder, nye personer osv.).
Brukere av et bofellesskap skal kunne f meldinger i form av push-meldinger ved nye hendelser og
felles beskjeder.
Dersom en bruker skriver en felles beskjed, skal alle andre i bofellesskapet f en push-melding om
at det har kommet en ny felles beskjed. P samme mte, dersom en annen viktig hendelse skjer i
bofellesskapet (som for eksempel at en ny liste eller utlegg er lagt til), skal det bli sendt ut en push-
melding om dette.
Side 5 av 75
Hendelser skal ogs komme opp i en hendelses-strm direkte i applikasjonen slik at brukere av
bofellesskapet kan g igjennom alle hendelser som har vrt.
Funksjonelt krav #6: Bruker skal kunne f opp alle detaljer om en hendelse i hendelses-
strmmen.
Bruker skal kunne velge en hendelse fra hendelsesstrmmen og f opp alle detaljer som er lagret
om den hendelsen.
Funksjonelt krav #7: Bruker skal kunne opprette lister.
Bruker skal kunne opprette nye lister og sette egenvalgte navn p listene.
Nr en liste blir opprettet skal det opprettes en event i systemet som vises i hendelses-strmmen.
Hendelsen skal fortelle hvilken bruker som opprettet listen.
Funksjonelt krav #8: Bruker skal kunne g inn p alle lister for se listelementer og gjre
endringer p listen.
Bruker skal kunne velge en liste for g inn p listen. Inne p listen skal bruker kunne se alle
listeelementer for listen, samt gjre endringer p listen (som for eksempel slette listen, endre navn
osv.).
Funksjonelt krav #9: Bruker skal kunne opprette listeelementer i alle lister.
Bruker skal kunne opprette nye listelementer i alle lister som er tilknyttet bofelleskapet, uavhengig
om det er bruker som opprinnelig laget listen.
Funksjonelt krav #10: Bruker skal kunne redigere alle lister og markere dem som fullfrt.
Bruker skal kunne redigere navn, slette og markere lister som fullfrt.
Nr en liste blir markert som fullfrt skal det opprettes en event i systemet som vises i hendelses-
strmmen. Hendelsen skal fortelle hvilken bruker som markerte listen som fullfrt.
Funksjonelt krav #11: Bruker skal kunne redigere alle listelementer og markere dem som
fullfrt.
Bruker skal kunne redigere navn, slette og markere listeelementer som fullfrt.
Funksjonelt krav #12: Bruker skal kunne se hvem som har markert en liste som fullfrt.
Nr noen har markert en liste som fullfrt, skal det vre mulig se i bde hendelses-strmmen og i
liste-oversikten hvem som har markert listen som fullfrt.
Funksjonelt krav #13: Bruker skal kunne se hvem som har markert et listelement som
fullfrt.
Nr noen har markert et listelement som fullfrt, skal det vre mulig se inne p listen hvem som
har fullfrt listelementet.
Funksjonelt krav #14: Bruker skal kunne logge seg inn med en registrert bruker.
Dersom en bruker har registrert seg i systemet skal brukeren kunne logge inn p systemet og f
tilgang til sine ressurser.
Funksjonelt krav #15: Bruker skal kunne opprette nytt bofellesskap.
Dersom en bruker ikke er medlem av et eksisterende bofellesskap, skal brukeren har mulighet til
opprette et eget bofellesskap med selvvalgt navn.
Funksjonelt krav #16: Bruker skal kunne invitere andre brukere til eksisterende
bofellesskap.
Side 6 av 75
Alle brukere av et bofellesskap skal ha muligheten til invitere andre brukere i systemet til
bofellesskapet. Invitasjon skal skje ved referere til andre brukere med deres e-post-adresse.
Invitasjon skal kun fungere dersom e-post-adressen allerede er registrert i systemet.
Funksjonelt krav #17: Bruker skal kunne motta invitasjon og godta denne for bli meldt inn
i eksisterende bofellesskap.
Nr en bruker har mottatt en invitasjon skal bruker kunne godta denne for melde seg inn i
bofellesskapet.
Det skal kun vre mulig godta invitasjoner dersom bruker ikke allerede er medlem av et
bofellesskap.
Nr en bruker fr en invitasjon, skal dette varsles med en push-melding til bruker.
Nr en bruker godtar en invitasjon, skal det opprettes en event i systemet om hendelsen som vises i
bofellesskapets hendelsesstrm. Det skal ogs sendes en push-melding til alle medlemmer av
bofellesskapet om hendelsen.
Funksjonelt krav #18: Bruker skal kunne se oversikt over hvem som er med i bofellesskapet.
Bruker skal ha mulighet til se en oversikt over hvem som er medlem av bofellesskapet som
bruker er medlem av.
Oversikten skal vise e-post, navn og bilde for hvert enkelt medlem av bofellesskapet.
Funksjonelt krav #19: Bruker skal kunne melde seg ut av bofellesskapet.
Bruker skal ha mulighet til melde seg ut av bofellesskapet.
Nr en bruker melder seg ut av et bofellesskap skal det opprettes en event i systemet om hendelsen
som vises i bofellesskapets hendelsesstrm. Det skal ogs sendes en push-melding til alle
medlemmer av bofellesskapet om hendelsen.
Funksjonelt krav #20: Bruker skal kunne se oversikt over utlegg i bofellesskapet.
Bruker skal kunne g inn p en utleggsoversikt og se alle utlegg i bofellesskapet.
Funksjonelt krav #21: Bruker skal kunne hvilke utlegg som er gjort opp og hvilke som ikke
er det.
Bruker skal kunne se i oversikten over utlegg i bofellesskapet hvilke utlegg som det er gjort opp
for, og hvilke som fremdeles er uoppgjort.
Funksjonelt krav #22: Bruker skal kunne se hvor mye bruker skylder p et utlegg.
Bruker skal kunne se i oversikten over utlegg i bofellesskapet hvor mye bruker skylder p hvert
enkelt utlegg (dersom bruker er en av de skyldige i utlegget).
Funksjonelt krav #23: Bruker skal kunne se hvor mye andre brukere skylder bruker for et
utlegg.
Bruker skal kunne se i oversikten over utlegg i bofellesskapet hvor mye andre brukere skylder
bruker p hvert enkelt utlegg (dersom bruker er den som det er skyldt penger til i utlegget).
Funksjonelt krav #24: Bruker skal kunne legge til utlegg.
Bruker skal kunne legge til nye utlegg.
En dialog skal komme opp nr bruker skal legge til nytt utlegg hvor bruker fyller ut flgende
informasjon:
Navn p utlegg (pkrevd felt)
Belpet tilsammen som skyldes (pkrevd felt)
Side 7 av 75
Detaljer om utlegget (valgfritt felt)
Hvilke brukere som er skyldige i utlegget
Belpet skal deles likt p alle som er med p utlegget.
Dersom bruker som legger til utlegget er satt opp til vre med p utlegget blir automatisk bruker
satt som ferdig betalt, da den som gjr utlegget allerede har betalt sin del.
Dersom bruker ikke skal vre med p utlegget, men har betalt utlegget for noen andre, kan bruker
velge seg selv bort fra listen og da vil belpet deles p de som faktisk skal betale.
Bruker som legger til belpet er automatisk markert og blir satt som betalt.
Eksempel:
Belp: 1000. Bruker har betalt for utlegget og 3 andre i bofellesskapet var med p utlegget. Dermed
skal de 3 andre brukerne betale 250 hver (siden bruker ogs er med p utlegget). I oversikten over
utlegg str det at bruker er skyldt 750. Hos de andre brukerne som er med p utlegget vil oversikten
si at de skylder 250 for utlegget.
Funksjonelt krav #25: Bruker skal kunne se all informasjon om alle utlegg.
Alle brukere skal kunne g inn p alle utlegg for se informasjon om utlegget som er valgt:
Navn p utlegg
Belp tilsammen
Detaljert tilleggsinformasjon om utlegget
Hvilke brukere som har betalt
Hvilke brukere som ikke har betalt
Hva hver enkelt bruker skylder (skal vre samme belp, da totalbelpet blir delt p brukere som er med p utlegget)
Funksjonelt krav #26: Bruker skal kunne gjre endringer i utlegg som bruker selv har lagt
til.
Bruker skal kunne endre utlegg som bruker selv har lagt til. Det vil si at det kun er brukeren som er
skyldt penger som kan gjre endringer p et utlegg. Alle andre brukere i bofellesskapet kan kun se
p utlegget, men ikke endre det.
Endringer som bruker skal kunne gjre p sine egne utlegg:
Endre navn p utlegg
Endre belp tilsammen p utlegget
Endre detaljert tilleggsinformasjon om utlegget
Slette utlegget
Sette brukere som betalt p utlegget
Sette brukere som ikke betalt p utlegget
Legge til brukere p utlegget
Fjerne brukere fra utlegget
Side 8 av 75
2.2 Ikke-funksjonelle krav Ikke-funksjonelle krav er systemets egenskaper som sikkerhet, plitelighet og tilgjengelighet.
Ikke-funksjonelt krav #1: Systemet skal ha data lagret i skyen.
Data som tilhrer systemet, brukere, innlegg og annen informasjon, skal vre lagret og vre
tilgjengelig fra en back-end-tjeneste.
Ikke-funksjonelt krav #2: Systemet skal synkronisere data lagret lokalt til skyen.
Data som blir produsert lokalt p klienter, skal synkroniseres til skyen og vre tilgjengelig for
andre som har rettigheter til dataene.
Ikke-funksjonelt krav #3: Systemet skal ha klienter slik at de fleste brukere har mulighet til
bruke det.
Systemet skal ha klienter tilgjengelig for et s bredt spekter med brukere som mulig, slik at s
mange som mulig har mulighet til benytte seg av systemet.
Ikke-funksjonelt krav #4: Systemet skal ha klienter som har plattformspesifikke grensesnitt
En klient av systemet som er laget for en spesifikk plattform skal ha utseende og brukergrensesnitt
som passer plattformen og dens retningslinjer for dette.
Ikke-funksjonelt krav #5: Ingen skal kunne logge inn p andres brukere.
Systemet skal vre sikkert nok til at datainnbrudd p systemet ikke skal vre trivielt.
Det er ikke mulig beskytte mot at noen kan finne andres passord, men dette kan minimeres ved
krav om passord som er vanskelige gjette.
Ikke-funksjonelt krav #6: Ingen skal kunne se andres bofellesskap.
Systemet skal vre sikkert nok til at datainnbrudd p systemet ikke skal vre trivielt.
Bruker skal kun kunne f tilgang til det bofellesskapet som bruker selv er medlem av.
Ikke-funksjonelt krav #7: Ingen skal kunne gjre ting p andres vegne.
Bruker skal ikke kunne legge inn beskjeder eller andre ting p vegne av andre brukere.
Dersom bruker fullfrer en liste skal det vre tydelig hvem som har markert listen som fullfrt.
Bruker skal ikke ha tilgang til endre andre brukeres utlegg.
Ikke-funksjonelt krav #8: Innholdet skal vre tilgjengelig s ofte som mulig
Back-end m vre responsiv nok til kunne svare p foresprsler og levere data til de fleste tider.
Noe nedetid er forvente fra alle tjenester som tilbyr back-end.
Side 9 av 75
3 Valg av teknologi For lse problemet som er valgt var det viktig velge riktig teknologi. Mye tid ble brukt p
underske teknologier og plattformer, samt utforske mulige alternativer. Disse skulle tilfredsstille
kravene som var satt, og vre realistiske bruke for prosjektgruppen (bde i prosjekttiden og i
tiden etter prosjektet er ferdig).
3.1 Valg av plattformer For kunne bruke en applikasjon som gjr bofellesskap enklere var det behov for en plattform som
var tilgjengelig "p farten". De fleste er p farten nr ting skal gjres og beskjeder skal gis. De
fleste i bofelleskaps-situasjoner er unge mennesker, som ogs er kjent for ha smarttelefoner.
Valget ble fokusere p mobile plattformer.
Valget av plattformer falt naturlig p iOS og Android p bakgrunn av at det er det de aller fleste
mennesker har (Mobile/Tablet Operating System Market Share, 2014). Gruppen har forskjellige
mobile enheter og samtlige av disse bruker iOS eller Android som operativsystem. Gruppen er
kjent med plattformene og har en god forstelse av retningslinjene for brukergrensesnitt p begge.
Gruppens medlemmer mener at begge plattformene ogs har store fordeler som skiller disse fra
andre. Android er gratis utvikle til, det lett distribuere applikasjoner og er den mest utbredte i
verden. iOS har gode verkty for lage profesjonelle applikasjoner, er meget populrt, det lett
distribuere applikasjoner, og det har et meget aktivt utviklermilj p internett.
Sett i forhold til kryssplattformutvikling ble det fokusert p at resultatet skulle vre tilgjengelig p
de viktigste mobile plattformene. Klientene skulle vre native for sin plattform, og samtidig vre
realistiske utvikle innenfor de gitte tidsrammene. I stedet for velge for eksempel
utviklingsplattformene Xamarin eller Qt som fokuserer p kjre samme kode p alle klienter (p
tvers av plattformer), falt valget p utvikle to separate klienter. Dette grunnet gruppens mindre
kjennskap med C# (Xamarin) og C++/QML (Qt). Utviklingsplattformene var ogs mindre stttet
av de fleste back-end-tjenestene som fantes p markedet.
Valget av plattformer dekker ikke-funksjonelle krav #3 og #4.
3.2 Valg av back-end Da prosjektgruppen skulle velge hvilken back-end lsning som skulle brukes i prosjektet falt valget
p Parse fordi det hadde mye av funksjonaliteten som var nsket innebygd. Parse hadde ogs et
API som s meget ryddig og praktisk ut.
Det var behov for en database hvor dataene kunne lagres slik at de var tilgjengelig overalt. Videre
mtte denne kunne integreres mot prosjektets valgte plattformer: Android og iOS. Dette tilbd
Parse, sammen med en brukerhndtering som har gjort at gruppen kunne fokusere p andre deler av
oppgaven.
Parse hndterer innlogginger, lagring av passord, tilgangskontroll p objekter og vedlikehold av
tjenere.
En ting gruppen s p som et mulig problem med Parse var begrenset offline-sttte, men valgte
allikevel benytte oss av tjenesten. Som nevnt i appendikset er det kommet en ny oppdatering
nylig som legger til bredere offlinesttte til Android, og det er annonsert det samme til iOS i nr
fremtid. Dette betyr at det i fremtiden vil vre enklere implementere dette i prosjektet om det
skulle vre nskelig.
Andre alternativer som har vrt oppe til diskusjon er Apstrata og Stackmob. Apstrata tilbyr
tilsvarende funksjonalitet som Parse, og kunne nok vrt brukt for dekke prosjektets krav. Til slutt
ble Parse valgt p grunn av en tilsynelatende bedre dokumentasjon og at de tilbd mer gratis bruk
enn Apstrata. Stackmob ble vurdert som et alternativ, men dette ble ogs forkastet grunnet Parse
Side 10 av 75
sin tilsynelatende enklere dokumentasjon. Stackmob ble senere kjpt av PayPal, og lagt ned i
februar. (Larson, 12)
Valget av back-end dekker ikke-funksjonelle krav #1, #2, #3, #5, #6, #7 og #8.
4 Designspesifikasjon Hensikten med designspesifikasjonen er vre en dokumentasjon av systemets arkitektur og
datadesign. Designspesifikasjonen skal vre s detaljert at en annen gruppe med utviklere skal
kunne plukke opp denne, og lage et tilsvarende sluttprodukt.
Designspesifikasjonen gjenspeiler den siste versjonen av designdokumentet som har blitt skrevet i
lpet av prosjektets lpetid.
Designdokumentet har blitt utvidet, revidert og oppdatert i begynnelsen av hvert inkrement i
prosjektet, slik som inkrementell utvikling tilsier.
Selve designdokumentet som er skrevet under utviklingen ligger som vedlegg.
4.1 Systemoversikt Systemet skal bruke en ferdig lsning for back-end som heter Parse. Her ligger det databaselsning
i form av NoSQL, brukerhndtering (innlogging, registrering, glemt passord), tjener-side
JavaScript-kode, push-meldinger, lagring, sosiale funksjoner og administrasjon.
Systemet fungerer slik at all data ligger lagret i Parse ("skyen") og applikasjonen bestr av klienter.
Klientene har ikke alle data selv, men hndterer en del av opprettingen og lagringen av dem (sender
data til Parse). I stedet snakker klientene med Parse for f tak i dataene de har behov for.
Parse skal ogs hndtere noe automatisk kode i sin Cloud Code-modul. Cloud Code er kode som
kan kalles p fra klienten, men som ligger lagret og blir kjrt p Parse sine tjenere. Dette gjr at
man kan gjre automatisk behandling av objekter sentralt, i stedet for mtte implementere
logikken p alle klienter. Det gjr gjenbruk av kode enklere.
4.2 Systemarkitektur
Figur 1: Systemarkitektur for prosjektet
Systemet er bygget opp av to hovedmoduler: klient og back-end. Hver av disse har undermoduler
som er vesentlige for funksjonaliteten i systemet.
Parse SDK, og hele back-end er ferdig utviklet og kommer fra Parse. Det som i all hovedsak er
utviklet er klient-koden, databasen og Cloud Code-biten.
Side 11 av 75
Klienten skal bygges opp av to deler. Den frste er selve applikasjonen. Dette er klientkoden.
Denne hndterer brukere direkte. Klientkoden bruker Parse sitt SDK for prate mot back-end-API'
et. Her gis det tilgang til database, push-meldinger og de andre tjenester som Parse sin back-end
tilbyr. Back-end API'et tilbyr ogs en buffer-lsning som gjr det mulig gjre sprringer offline,
men lagring av data lar seg for yeblikket ikke gjre i SDK'et (dette er blitt forespeilet som en
kommende forbedring i SDK'et).
SDK'et gjr all kommunikasjon mot back-end over HTTPS og SSL og srger derfor for
tilstrekkelig sikkerhet under datahndtering.
4.3 Datadesign En User er medlem av et Household, men medlemslisten ligger lagret i en Role som er tilknyttet
Household-et. Det skal dermed vre n Role per Household.
Ved opprettelse av et Household lages det automatisk en Role som knyttes til Household-et
gjennom navnet sitt som er p formen "household-" (f.eks. hvis et nytt
household har id="UlKu48h8ZN" vil name-feltet til Role-objektet vre "household-
UlKu48h8ZN"). I Role-en ligger alle medlemmene av Household-et.
Role er en spesiell klasse i Parse som brukes for sette rettigheter p objekter via en RBAC
implementasjon i Parse sin ACL. Alle medlemmer av en Role fr tilgang til alle objekter som Role-
objektet har tilgang til.
Klassene er koblet tett sammen og er avhengig av en del samhandling. En User er medlem av et
Household gjennom en Role som er tilknyttet det respektive Household-et. En Note er skrevet av en
User og hrer til et Household.
Parse tilbyr et sett med ferdig definerte klasser som kan brukes og utvides med egne felter. De
klassene som er tatt i bruk, er User, Role og Installation. Resten er egendefinerte klasser. Feltene
markert med tykk skrift, er de som er lagt til, resten flger med automatisk.
Visse felter er like for alle klassene og blir automatisk oppdatert og hndtert av Parse:
objectId
o objectId er en unik ID. Alle objekter har sine egne unike ID'er.
o Denne er garantert unik for alle objekter i en gitt klasse (kan med andre ord i teorien ha duplikate objectId'er p tvers av klasser).
createdAt
o createdAt beskriver datoen objektet ble opprettet.
updatedAt
o updatedAt beskriver datoen objektet sist ble oppdatert.
ACL
o ACL (Access Control List) beskriver hvem som har rettigheter til skrive og lese objektet.
Kan enten settes til enkeltbrukere, eller til Role-objekter.
o Blir ikke oppdatert av Parse.
o Denne styres av utvikler for lse ned data.
All data som hentes blir lagret i datastrukturene som Parse sitt SDK for hver plattform tilbyr. Disse
fremstr for brukere av SDK'et som key-value store-datastruktur (dictionary/hash-map).
Side 12 av 75
Figur 2: Datadesign tegnet i UML
Side 13 av 75
Datadesignet er bygd opp av klasser i Parse sin NoSQL-lsning. Et bilde av klassene og deres
relasjoner ses i figur 2.
4.3.1 Role Role-klassen er en klasse som er bygget inn i Parse. De to viktigste feltene i bruk er name og
users.
Navnefeltet m vre unikt, da det er dette som brukes for lokalisere objektet i databasen. Role
skal kun brukes i forbindelse med Household (se beskrivelse av Household) i dette prosjektet.
En Role i Parse blir brukt til sette ACL p andre objekter. Man setter ACL p et annet objekt med
enten brukere eller roller og spesifiserer om det er tilgang til lese og/eller skriverettigheter
(eventuelt nekt p tilgang). Det er i dette prosjektet benyttet til lse ned tilganger p alt som har
med et Household gjre. Siden medlemslisten til et Household ligger lagret i Household-ets
respektive Role fr alle medlemmer tilgang til objekter hvor Role-en settes i ACL.
Spesielle felter i Role:
I Role-klassen finnes det en del felter som flger med, men som ikke er standard p vanlige Parse-
klasser.
roles (Relation): En rolle kan vre medlem av andre roller. Denne er ikke i bruk i dette prosjektet.
users (Relation): Liste over brukere som er medlem av rollen. Denne blir brukt som brukerlisten til bofellesskapet.
name (String): Navnet p rollen. Denne blir brukt til referere til objektet, i stedet for objectId. Feltet skal ha navn p formen "household-".
Relasjoner i Role:
En Role skal ha 1 Household.
4.3.2 Household Household-klassen beskriver et bofellesskap. Hvert bofellesskap knytter brukere opp mot seg selv
som medlemmer gjennom sin respektive Role. For hver eneste Household skal det vre et Role-
objekt som hrer til denne. Det er i dette Role-objektet hvor medlemslisten til bofellesskapet ligger
lagret.
Et Household skal kun lages via Cloud Code-funksjonen som heter "createNewHousehold".
Egendefinerte felter i Household:
householdName (String): Navnet p bofellesskapet.
Relasjoner i Household:
Et Household skal ha 0 eller flere User.
Et Household skal ha 1 Role.
Et Household skal ha 0 eller flere Note.
Side 14 av 75
4.3.3 User User-klassen beskriver en bruker. Den er bygget inn i Parse og er utvidet for dette bruket (se tykke
felter i ER-diagrammet). Hvert objekt er en unik bruker og kan ses p som en brukerkonto.
Egendefinerte felter i User:
displayName (String): I stedet for fornavn og etternavn er det ett felt hvor man kan velge hvilket navn som skal vises hos deg og hos andre brukere.
profilePicture (File): En bilde-fil som brukeren selv kan laste opp som sitt profilbilde.
Spesielle felter i User:
I User-klassen finnes det en del felter som flger med, men som ikke er standard p vanlige Parse-
klasser.
username(String): Brukernavnet til brukeren (skal vre samme som email)
password(String): Passordet til brukeren (kryptert og skjult for alle)
email(String): E-post-adressen til brukeren
authData (authData): Felt som blir brukt ved autentisering med sosiale medier (gjres automatisk av Parse)
Relasjoner i User:
En User skal ha 0 eller flere Household.
En User skal ha 0 eller flere Note.
4.3.4 Note Note-klassen beskriver et felles notat/beskjed i et Household. Det er en beskjed som er skrevet av
en User som er medlem av et Household og kan ses av alle andre brukere som er medlem av det
samme Household-et (dette styres av Household-ets sin Role som blir satt som ACL).
Egendefinerte felter i Note:
body (String): Selve notatet og informasjonen som skal vises til brukere
createdBy (Pointer): Peker til brukeren som har opprettet objektet
household (Pointer): Peker til bofellesskapet objektet er knyttet til.
Relasjoner i Note:
En Note skal ha 1 User
En Note skal ha 1 Household
Side 15 av 75
4.3.5 Event Event-klassen beskriver en hendelse i et bofellesskap. Den brukes for kunne vise en strm av
hendelser til brukere i et bofellesskap, slik at man kan holde seg oppdatert ved kun ta et overblikk
over hendelses-strmmen.
Event er bygget opp av et type-system. Typen hendelse er definert ved tall og hendelsene som er
implementert i klient og cloud-code er som flger:
0: Ny bruker i bofellesskapet
1: En bruker har forlatt bofellesskapet
2: Ny Liste (TaskList)
3: Liste har blitt markert som fullfrt
4: Nytt utlegg (Expense)
5: Utlegg har blitt gjort opp (Expense settled)
En Event opprettes automatisk med Cloud Code og skal aldri lages direkte av en klient. Klienten
bruker kun type-systemet for avgjre hvordan informasjonen i et Event-objekt skal vises til
bruker.
Egendefinerte felter i Event:
type (Number): Hvilken type hendelse objektet handler om (se forklaring over).
household (Pointer
Side 16 av 75
4.3.6 Invitation Denne klassen beskriver en invitasjon til et Household. Den blir sendt fra en User til en annen.
En Invitation kan aksepteres med en Cloud Code-funksjon som heter "acceptInvitation". Nr en
Invitation er akseptert er den inviterte brukeren medlem av bofellesskapet som invitasjonen gjelder
for.
Egendefinerte felter i Invitation:
household (Pointer): Peker til det bofellesskapet som invitasjonen gjelder for.
inviter (Pointer): Peker til brukeren som har invitert.
invitee (Pointer): Peker til brukeren som har blitt invitert til bofellesskapet.
Relasjoner i Invitation:
En Invitation skal ha 1 User (inviter)
En Invitation skal ha 1 User (invitee)
En Invitation skal ha 1 Household
4.3.7 TaskList TaskList representerer en liste som inneholder en mengde med TaskListElement-er. Disse er tenkt
som gjremlslister for brukere av et Household. En TaskList er tenkt som en liste med elementer
som kan krysses av. For eksempel en handleliste, hvor selve tingen som skal kjpes inn er
TaskListElement-et og selve handlelisten er en TaskList.
Disse er felles for alle brukere av et Household. Alle brukere av Household-et som TaskList-en er i
kan legge til, fjerne og redigere alt i TaskList-en.
Egendefinerte felter i TaskList:
listName (String): Navnet til listen (for eksempel handleliste, vaskeliste eller todo).
household (Pointer): Peker til bofellesskapet som listen er laget for.
createdBy (Pointer): Peker til brukeren som har opprettet listen.
done (Boolean): En boolsk verdi som beskriver om listen er fullfrt eller ikke.
Relasjoner i TaskList:
En TaskList skal ha 1 User (createdBy)
En TaskList skal ha 1 Household
En TaskList skal ha 0 eller flere TaskListElement
Side 17 av 75
4.3.8 TaskListElement TaskListElement er underelementer av en TaskList. Disse er tenkt som gjreml som kan utfres og
markeres som ferdige nr de er blitt gjort. Mer informasjon under TaskList.
Egendefinerte felter i TaskListElement:
elementName (String): Navnet p elementet (for eksempel vaske badet eller kjpe melk).
taskList (Pointer): Peker til listen som elementet hrer til i.
createdBy (Pointer): Peker til brukeren som har opprettet elementet.
finishedBy (Pointer): Peker til brukeren som har markert elementet som ferdig.
Relasjoner i TaskListElement:
En TaskListElement skal ha 1 User (createdBy)
En TaskListElement skal ha 0-1 User (finishedBy)
En TaskListElement skal ha 1 TaskList
4.3.9 Installation Installation blir brukt til hndtere push-meldinger. Hver enhet som installerer applikasjonen blir
registrert som en Installation. Med andre ord er en Installation en enhet (iOS-enhet eller Android-
enhet). Hver enhet skal ha en, og bare en, Installation.
Nr en push-melding skal lages, s gjres det en sprring etter Installation-objekter som er knyttet
til en bruker eller et household, avhengig av hvem meldingen er ment for.
Egendefinerte felter i Installation:
user (Pointer): Peker til brukeren som er logget inn p enheten
household (Pointer): Peker til bofellesskapet som innlogget bruker er medlem av.
Relasjoner i Installation:
En Installation skal ha 0-1 User (user)
En Installation skal ha 0-1 Household (household)
Side 18 av 75
4.3.10 Expense Expense-klassen beskriver utlegg. Den blir brukt for holde orden p utlegg som er gjort i et
bofellesskap. Brukeren som har gjort et utlegg blir oppfrt i owed, mens de som skal vre med p
betale, blir lagt i en liste som heter notPaidUp.
Etter hvert som pengene blir betalt tilbake vil brukerne flyttes fra notPaidUp til PaidUp av
brukeren som er skyldt penger. Klassen inneholder ogs et felt for navn p utlegget, et for hvor
mye som er lagt ut og et for en nrmere beskrivelse av utlegget.
Egendefinerte felter i Expense:
name(String): Navnet p utlegget.
owed(Pointer ): Peker til brukeren som gjorde utlegget.
notPaidUp(Array): Liste over de brukerne som ikke har betalt tilbake.
paidUp(Array): Liste over de brukerne som har betalt tilbake.
totalAmount(Number): Hvor mye som ble lagt ut.
household(Pointer): Peker til householdet utlegget hrer til.
details(String): Utfyllende detaljer om utlegget.
Relasjoner i Expense:
En Expense skal ha 1 User (Owed)
En Expense skal ha 0 eller flere User (notPaidUp)
En Expense skal ha 0 eller flere User (paidUp)
En Expense skal ha 1 Household
Side 19 av 75
5 Prosess og metoder Gruppen har benyttet flere prosesser, verkty og metoder for lse oppgaven. Disse har gjort
fremgang og utvikling raskere og mer strukturert.
5.1 Utvikling
5.1.1 Utviklingsmodell De fleste programvareprosjekter benytter seg av utviklingsmodeller for ha en klar plan flge
gjennom utviklingen av prosjektet. En slik utviklingsprosess srger for en strmlinjeformet
utvikling som er forutsigbar og tydelig. Det skal aldri vre tvil om hva neste steg i prosjektet er.
Prosjektet har blitt utviklet med en variant av inkrementell utviklingsmodell.
Inkrementell utviklingsmodell baserer seg p tanken om at man starter med en initial forstelse av
et problem og utvikler denne i inkrementer frem til man har en ferdig lsning.
Hvert inkrement bestr hovedsakelig av fire deler: Kravspesifikasjon, designspesifikasjon,
utvikling og til slutt validering og testing. Ved starten p hvert nye inkrement gr forrige inkrement
inn som utgangspunkt til endringer og forbedringer.
En inkrementell utviklingsprosess kan ses p som i figur 3:
Figur 3: Inkrementell utviklingsprosess
Inkrementell utvikling er en utviklingsmetode som lar prosjekter justere krav og utvikling
underveis. Dette skjer fordi planlegging og kravspesifikasjon skjer i begynnelsen av hvert
inkrement. Det er p dette punktet at inkrementell utvikling skiller seg spesielt ut i fra den mer
tradisjonelle waterfall-modellen hvor et prosjekt i praksis er ett stort inkrement, og all planlegging
gjres p begynnelsen av prosjektet.
Inkrementell utvikling kan ligne veldig p iterativ utvikling, men skiller seg ut ved at iterativ
utvikling ofte har kortere og mindre spesifiserte inkrementer. For eksempel har et inkrement i
inkrementell utvikling et sett med krav som skal implementeres, mens iterativ utvikling gjerne har
en satt tidsperiode hvor man skal implementere s mye som mulig i stedet. Dette frer til at iterativ
utvikling har flere og mer forutsigbare tider p slipp av programvare, mens inkrementell utvikling
har mer funksjonalitet i hver inkrement.
Gruppen valgte inkrementell utvikling fremfor sin nrt beslektede iterativ utvikling og den mer
tradisjonelle waterfall-metoden da kravene p forhnd ikke var helt fastsatt og mest sannsynlig
ville endre seg i lpet av prosjektets utviklingstid.
Side 20 av 75
5.1.2 Kodestandard Fr utvikling ble det satt opp en kodestandard for koden som skulle skrives. Dette ble gjort slik at
koden skulle bli ryddig og lik for alle som skulle jobbe med den.
Standarden er ikke veldig detaljert, s utgangspunkt ble satt til Google sin kodestandard for pene
kildekode-prosjekter.
De detaljene som har blitt spesielt definert for prosjektet, er som flger:
5.1.2.1 Navnsetting
Lange deskriptive navn fremfor forkortelser.
Eksempler:
UIButton *settingsButton;
Figur 4: Riktig
UIButton *setBut;
Figur 5: Feil. Forkortelser som er vanskelige forst
Stor forbokstav i klassenavn og camelCase overalt
Eksempler:
class MinKlasse { public void minFunksjonSomGjoerNoe() {...} }
Figur 6: Riktig
class minKlasse { public void Funksjon() {...} public int enannenfunksjon() {...} }
Figur 7: Feil
5.1.2.1.1 Android-spesifikt
Navnet p java-filene i Android, som er av en spesifikk Android-klasse, skal slutte p navnet til
klassen.
Det vil si at filer lett kan identifiseres som Activity-filer, Fragment-filer osv.
Eksempler
Riktig: LoginActivity.java
Riktig: FeedFragment.java
Feil: Login.java
Feil: Feed.java
Riktig: Event.java (denne er en subklasse av ParseObject, men er ikke relevant til Android rent
spesifikt)
Feil: EventParseObject.java (dette vil vre for vidlftig og har ingen hensikt)
Side 21 av 75
Layout-filer skal ha sm bokstaver og ordene deles med understrek. Typen layout skal vre frste
ord i filnavnet.
Eksempler:
Riktig: activity_main.xml
Riktig: dialog_new_note.xml
Riktig: fragment_me.xml
Feil: main.xml, main_acitivity.xml
Feil: new_note_dialog.xml, noteDialog.xml, note_dialog.xml
Feil: me.xml
5.1.2.2 Innrykk
Innrykk skal ikke vre tabulatortegn, men i stedet best av 4 mellomromstegn.
Med andre ord:
Tab = 4 mellomrom
5.1.2.3 Krllparentes-posisjon
Krllparenteser skal settes p samme linje som funksjons- og klassenavn, med unntak av der
funksjons- og klassenavnene er s lange at de gr over flere linjer.
Eksempler:
public void funksjon() { ... }
Figur 8: Riktig
private double annenFunksjon() { ... }
Figur 9: Feil
public void langtFunksjonsNavnSomMDelesOverFlereLinjer(int index, double value) { ... }
Figur 10: Riktig bruk av unntak
public void langtFunksjonsNavnSomMDelesOverFlereLinjer(int index, double value) { ... }
Figur 11: Feil bruk av unntak
Side 22 av 75
5.1.3 Versjonskontroll Gruppen har valgt Git som versjonskontrollsystem og med dette en sentralisert Git-tilbyder som
heter Github og befinner seg p www.github.com. Github tilbyr en enkel og rask lsning med bde
privat og offentlig oppbevaring av data. Prosjektet har under utviklingen ligget i en privat
oppbevaring som kun gruppens medlemmer har hatt tilgang til lese og skrive til.
Git ble valgt for versjonskontroll fordi dette er en de mest brukte programvarene for dette
(Freeman, 2013), samt at gruppens medlemmer hadde kunnskap og erfaring med Git fra tidligere.
Det finnes flere gode Git-tilbydere, men Github passet bedre med tanke p enkelhet og
funksjonalitet. Muligheten til utforske, ske og bla seg igjennom nvrende og tidligere
versjoner av kildekoden sentralt, har gjort mange utviklingsoppgaver enkle.
5.1.4 Utviklingsverkty Utviklingsverkty er en vesentlig del av et prosjekt og mye tid har blitt brukt p velge riktig
verkty til jobben som skal gjres. Verktyene gjr arbeid lettere, ker produktivitet og er viktige
for at gruppens medlemmer skal trives i arbeidet. Drlige verkty kan felle store deler av et
prosjekt, mens gode og riktige verkty kan fremme kvalitet.
Gruppen har i lpet av utviklingen brukt en rekke verkty for gjennomfre prosjektet - alt fra
integrerte utviklingsmiljer (IDE) til verkty for prosjektstyring og modellering av
brukergrensesnitt.
Verktyene er valgt etter gruppens preferanser og hva som har passet best for prosjektet.
5.1.4.1 Integrerte utviklingsmiljer (IDE)
Prosjektet har brukt mange programmeringssprk og plattformer under utviklingen og det har
derfor blitt brukt flere IDE'er.
Valgene er blitt gjort basert p hva som er sett p som standard og hva som er gruppens egne
preferanser.
5.1.4.1.1 Android
Til utvikling av Android-klienten valgte gruppen Android Studio.
Android Studio er et nytt IDE fra Google som skal erstatte Eclipse med ADT Plugin. Android
Studio er bygget p et Java IDE som heter IntelliJ IDEA og har lagt til Android-spesifikke verkty
som gjr utvikling av Android-applikasjoner lettere. (Getting Started with Android Studio, u..)
Android Studio har meget god sttte for syntaks-fremheving, faktorisering av kode som tar hensyn
til Android-spesifikk deler, integrasjon med Android sitt SDK, en layout-editor med trekk-og-slipp
og mange andre nyttige funksjoner.
Side 23 av 75
Figur 12: Skjermdump Android Studio
5.1.4.1.2 iOS
Da det ikke er mange gode alternativer til IDE'er for iOS-utvikling falt valget naturlig p Xcode.
Andre alternativer mangler sttte for WYSIWYG-editor (What You See Is What You Get) og
krever som regel Xcode for gjre elementre oppgaver som simulering.
Xcode er et program for Mac, laget av Apple Inc. og har sttte for alle steg i utviklingen av en iOS-
applikasjon.
Xcode er en utviklingsplattform laget spesielt for utvikling til Apple sine produkter og gjr en
meget solid jobb p akkurat dette. Xcode har god sttte for syntaks-fremheving, debugging,
brukergrensesnitt-generering (WYSIWYG) og har en simulator som lar utviklere simulerer
applikasjonene sine p iPhone og iPad. Simulatoren er rask og har mange funksjoner for simulere
enheter p en troverdig mte.
Figur 13: Skjermdump Xcode
Side 24 av 75
5.1.4.1.3 Cloud Code
Cloud Code er kun JavaScript og til dette har IDE'et Coda 2 blitt brukt.
Coda 2 er et program laget av Panic Inc til Mac OS X. Programmet kan kjpes fra Apple Mac Store
og sttter en rekke programmeringssprk til web.
Dette verktyet ble valgt, da syntaks-fremhevingen er meget godt, samt at gruppen hadde tilgang til
denne fra fr prosjektets start.
Coda 2 ble brukt til skrive selve koden, men ikke til opplastning av koden til Parse. Dermed
fungerte Coda 2 mer som en tekst-editor enn et IDE. Parse har egne kommandolinjebaserte verkty
for opplastning av Cloud Code til Parse sine egne tjenere.
5.1.4.2 Brukergrensesnittmodellering
Det har i designfasen blitt laget modeller av brukergrensesnittet som har blitt brukt for gjre
implementasjon av en sammensveiset brukeropplevelse enklere og lettere under utvikling og
implementasjon.
Brukergrensesnittmodelleringen er gjort i et verkty for iPad som heter AppCooker. Dette
verktyet har latt gruppen tegne opp brukergrensesnitt for iOS. Android sitt brukergrensesnitt er
oversatt med skjnn for srge for en tilsvarende opplevelse som iOS-brukergrensesnittet, men
som fremdeles oppleves som en Android-applikasjon.
Figur 14: Skjermdump AppCooker
5.1.4.3 Diagrammer
Til tegne og lage diagrammer er LucidChart av Lucid Software Inc. brukt.
LucidChart er en webapplikasjon for lage flytskjemaer, UML-diagrammer og figurer. Med et
enkelt grensesnitt basert p trekk-og-slipp, samt en bred implementasjon av UML var valget av
diagramverkty relativt enkelt.
UML har spesifikasjoner som i mange applikasjoner er drlig og mangelfullt implementert.
LucidChart var den eneste som hadde alle elementene som prosjektet hadde behov for innebygd.
Diagrammer har frst og fremst blitt brukt i designspesifikasjonsdokumentene for beskrive
systemarkitektur og databasedesign.
Side 25 av 75
Figur 15: Skjermdump LucidChart
5.1.5 Testing Testing er en viktig del av ethvert prosjekt, srlig programvareprosjekter, da disse har veldig
mange muligheter til feil. Det f luket ut feil er helt essensielt for kunne levere et
tilfredsstillende produkt.
Programvaretesting deles gjerne opp i niver, basert p hva de tester og omfanget av testene.
Teknikkene for de forskjellige nivene er mange og varierende. Det finnes ulike synspunkter p
hvilke niver av programvaretesting som er ndvendige og hvilke som er mest ndvendige. Det de
fleste dog er enige om er at testing er ndvendig.
Figur 16: Software Testing Niver (Software Testing Levels, u..)
Fire ofte brukte niver p testing er (i stigende omfangsgrad) enhetstesting, integrasjonstesting,
systemtesting og godkjenningstesting. (Software Testing Levels, u.) Se figur 16.
Prosjektet valgte bruke enhetstesting, systemtesting og godkjenningstesting.
Side 26 av 75
5.1.5.1 Enhetstesting
Enhetstesting er en type testing som skal teste en liten enhet av koden, isolert fra resten av
systemet. Man tester gjerne en klasse eller en funksjon direkte, og fjerner alle avhengigheter fra
andre deler av systemet, slik at kun det som skal testes faktisk blir testet.
Figur 17: Avhengigheter og Dependency Injection
Problemet er beskrevet i figur 17. En enhet skal testes, men har avhengigheter som igjen har mange
avhengigheter. Feil i avhengighetene kan lage feil i testen, selv om feilen ikke ligger i enheten som
skal testes. Derfor lager man etterligninger av avhengighetene som man injiserer inn i enheten som
skal testes. Etterligningen oppfrer seg som avhengigheten, men er fullstendig kontrollert av
utvikleren. Dette kalles for Dependency Injection (DI).
Et eksempel p bruk av Dependency Injection er hvis en enhet skal hente ned informasjon fra en
sentralisert tjener, bearbeide informasjonen og returnere resultatet. Enheten bruker en annen enhet
(avhengighet) som kobler seg til den sentraliserte tjeneren og laster ned informasjonen. Det man
nsker teste er at enheten bearbeider data p korrekt mte og returnerer (eventuelt fornuftige og
korrekte feilmeldinger) som den skal. Dersom den sentraliserte tjeneren ikke er oppe vil testen
feile, uavhengig om enheten er korrekt eller ikke. Dette lses ved lage en etterligning av enheten
som laster ned informasjonen. Etterligningen vil oppfre seg p samme mte som enheten den
etterligner, men vil levere et sett med falsk informasjon som er testbar.
5.1.5.1.1 Problemer med enhetstester i prosjektet
Enhetstesting var ment som en del av prosjektet helt fra forprosjektet. Det ble fjernet fra prosjektet
grunnet hyt tidsbruk for skrive testene. Skulle prosjektet bli dekket av enhetstester, ville ikke
resultatet blitt like godt gjennomfrt som det faktisk ble.
Denne delen beskriver forskene som ble gjort p implementasjon av enhetstesting, og hvilke
problemer som dukket opp.
Enhetstester ble forskt implementer tre ganger i lpet av prosjektet.
Side 27 av 75
5.1.5.1.1.1 Frste forsk
I frste forsk ble enhetstestene skrevet uten bruke Dependency Injection. Dette frte til tester
som hadde mange avhengigheter, som gjorde det tilnrmet umulig garantere at en test fungerte
hver gang. I tillegg ble det gjort implisitte nettverks-kall som frte til at testene ble trege veldig
fort.
For at enhetstester skal vre mest effektive br de kunne kjres ofte for finne regresjoner i koden.
Dette ble vanskeligjort fordi det tok mange minutter kjre testene, selv for sm mengder med
tester.
5.1.5.1.1.2 Andre forsk
Etter at frste forsk mtte skrotes (slette alle tester og g tilbake til ingen tester) var det fremdeles
et sterkt nske om ha enhetstesting som en del av prosjektet. Lsningen ble bruke mer korrekte
enhetstester med bruk av Dependency Injection.
Fr Dependency Injection kunne brukes mtte all logikk separeres inn i klasser og funksjoner med
Dependency Injection implementert. Dette var mye arbeid som kunne vrt unngtt om feilene i
frste forsk ikke hadde blitt gjort.
Det viste seg at selve testene ble veldig omfattende og kompliserte. Grunnen til dette var mest
sannsynlig en systemarkitektur som ikke er helt ideell. For skrive en enkel test hvor enheten
brukte Parse sine tjenere til gjre noe som helst, innebar det mange linjer kode.
Siden Parse sitt API bruker statiske objekter var det ikke mulig bruke Dependency Injection
direkte p disse. Det frte til et forsk p fange opp nettverkskallene til Parse og gi en falsk
respons for sikre at responsen var den samme hver gang. Det innebar manuell skriving av HTTP-
responser som mtte etterligne HTTP-responsene fra Parse sine tjenere.
Grunnen til at det var behov for etterligne HTTP-responsene var fordi det ikke var mulig
etterligne Parse sine klasser (for separere ut avhengigheter). Parse sine klasser er statiske, noe
som gjr at de ikke kan injiseres, og dermed heller ikke kan etterlignes. Dermed mtte i stedet
Parse sitt API injiseres p nettverksniv med egne HTTP-responser. For kunne etterligne
responsen fra Parse mtte pakker fra Parse sniffes ved bruk av nettverkssniffere. Dette lot seg gjre
ved godta alle sertifikater p iOS simulatoren. Alt dette gjorde skrivingen av en test til en meget
tidskrevende aktivitet.
En enhetstest for en enhet som skulle hente ned siste notater for et bofellesskap endte opp med bli
betydelig lengre enn selve enheten.
Dette var heller ikke et brukbart alternativ, og kunne ikke i praksis gjennomfres for et prosjekt av
denne strrelsen.
5.1.5.1.1.3 Tredje forsk
I det tredje (og siste) forsket var mye lrt. Bruk av Dependency Injection var fremdeles
lsningen, men Parse sitt statiske API gjorde dette vanskelig.
Lsningen ble lage en wrapper til Parse sitt API. Det vil si en ikke-statisk klasse som pakker inn
Parse sitt statiske API til noe som kan injiseres i en kontekst hvor Dependency Injection er brukt.
En slik antistatisk klasse kan etterlignes og dermed brukes til Dependency Injection.
Dette innebar nok en gang en omskriving av betydelige mengder kildekode for kunne
gjennomfres, samt at nye tester mtte skrives.
Den nye lsningen gjorde testene betydelig mindre, men samtidig langt mer omfattende fordi det
etterligne alle avhengighetene er en komplisert jobb.
Grunnet kompleksiteten av testene og tiden det tok skrive de, ble nok en gang enhetstestene
fjernet fra prosjektet. Denne gangen for godt.
Side 28 av 75
Problemet kunne vrt unngtt om hele prosjektet hadde hatt en annen struktur med mindre
avhengigheter i hver enhet.
Det var ikke forsvarlig skrive om hele prosjektet p det tidspunktet som dette var kommet til. Det
ville innebre alt for mye tid og arbeid som ikke ville gitt nok tilbake for tiden lagt inn i det.
Ved fjerning av testene og strukturen som var lagt opp rundt enhetstesting var dette resultatet av
opplastning til git:
94 files changed, 957 insertions(+), 4053 deletions(-)
Figur 18: Utskrift fra git etter fjerning av tester og struktur rundt
3000 linjer med kode ble slettet over 94 filer totalt (dette gjaldt kun iOS). Dette utgjorde en
betydelig del av prosjektet og styrket valget om til slutt fjerne testene.
5.1.5.2 Systemtesting
Systemtesting er den testprosessen hvor man tester et sammensatt, fungerende system. Det er i
dette tilfellet vrt gjort ved teste applikasjonen manuelt.
Testing av hele systemet har vrt gjort flere ganger i lpet av hvert inkrement. Systemtestingen har
blitt gjort ved bruke et skjema med avkryssing. Skjemaet har forskjellig funksjonalitet som skal
testes, og dersom funksjonalitet fungerer som ventet, krysses det av for den.
Figur 19: Utklipp fra testdokument
Ved legge til nye manuelle tester for hvert inkrement, har all funksjonalitet blitt testet ved hvert
inkrement. Dette gjr at samtidig som man tester ny funksjonalitet, testes det ogs for regresjoner.
5.1.5.3 Godkjenningstesting
Godkjenningstestingen er testing for akseptabilitet, om systemet blir godtatt av brukere. Testingen
avgjr om systemet flger kravene som er satt og om det er klart for levering.
Godkjenningstestingen i prosjektet har blitt gjort helt p slutten av prosjektet med en betatest for
iOS og Android. Gruppen fant noen brukere som kunne prve systemet i egen kontekst og som
kunne gi tilbakemeldinger p systemet og melde om feil.
Det er ikke blitt gjort stort med tilbakemeldingene fra betatesten, da denne ble utfrt helt p slutten
av prosjektet. Feil som ble rapportert, er det eneste som er hndtert i etterkant. Tilbakemeldingene
er dog notert og kan vurderes i videre utvikling av prosjektet.
Det ble meldt nske om mer veiledning i applikasjonen, slik at brukerne lettere kan vite hva ting
kan brukes til og hvordan de skal brukes.
Det ble ogs meldt om noe forvirrende navn p den delen som er ment for felles beskjeder. I dag
heter den "Notes", noe som kan vre litt tvetydig.
Testingen ga en god indikasjon p ting som burde endres, og staker ut veien for videre utvikling av
prosjektet.
Side 29 av 75
5.2 Prosjekt For at et prosjekt skal kunne utfres effektivt og plitelig er det ofte behov for bygge opp en
gruppestruktur, styrket av verkty for prosjektstyring og informasjonsflyt. Gruppen har hele tiden
hatt en flat struktur, hvor alles mening har veid like tungt vedrrende valg som er gjort underveis. I
dette kapittelet flger gruppens oppbygning, samt de forskjellige verktyene som er blitt benyttet
underveis.
5.2.1 Gruppestruktur Selv om gruppen har hatt en flat struktur uten en utnevnt leder har det blitt fordelt srlige
ansvarsomrder p de forskjellige medlemmene. De forskjellige ansvarsomrdene er fordelt slik:
Katrine Myklevold
Design av brukergrensesnitt
Utvikling til iOS
Testrutiner
Testing
Gjermund Bjaanes
Implementasjon av database, samt Cloud Code i Parse
Utvikling til iOS
Utvikling til Android
Johann Eckhoff
Utvikling til Android
Testing
Hndtering av Beta-testing
5.2.2 Evernote Til felles notater og smdokumenter har Evernote fra Evernote Corporation blitt brukt.
Evernote er en kryssplattform notat-applikasjon. Den lar brukere lage notatbker og skrive alle
slags mulige notater (med rikt innhold som tekst, bilder og lyd). Gruppen har hatt en delt notatbok
som har blitt brukt til alle notater og smdokumenter underveis i prosjektet.
I den delte notatboken har det ligget mye informasjon som har vrt greit kunne referere til under
utviklingen. Eksempler p dette er testskjemaer, designbestemmelser og kodestandard.
Side 30 av 75
Figur 20: Skjermdump Evernote
5.2.3 Gantt-diagram Et Gantt-diagram er et diagram for illustrere tidsplanleggingen i et prosjekt. Det viser nr ting er
planlagt starte, hvor lang tid det er planlagt bruke p det og nr det skal vre ferdig.
For produsere Gantt-diagrammer til prosjektet har et pent-kildekode-program som heter Gantt
Project blitt brukt.
Gantt Project er en kryssplattform-applikasjon som er enkel bruke og har tilstrekkelig
funksjonalitet til produsere Gantt-diagrammer.
Figur 21: Skjermdump Gantt Project
Side 31 av 75
5.2.4 Prosjektstyringsverkty Gruppen har benyttet seg av en web-applikasjon som heter Trello.
Trello lar brukere sette opp en digital arbeidstavle som representerer prosjektet man jobber med. P
tavlen kan man sette opp lister hvor hver liste kan ha kort som representerer en oppgave.
Kortene (oppgavene) har navn og kan inneholde tidsfrister, hvilke medlemmer av gruppen som har
blitt satt til gjre oppgaven og mer detaljert informasjon om oppgaven.
Figur 22: Skjermdump fra Trello (tatt fra gruppens egen tavle)
Gruppen har brukt Trello gjennom hele prosjekttiden for holde styr p oppgaver og tidsfrister.
Verktyet har srget for at gruppen har holdt en st kurs hele tiden og ftt gjort unna oppgaver
innen rimelig tid.
6 Resultat Resultatet av prosjektet er avgjort av produktet og prosjektets ml.
6.1 Produkt Produktet er to klienter og en back-end, satt sammen til et system som fungerer i henhold til de
kravene som er satt.
Klientene fungerer hver for seg og sammen. Kommunikasjon mellom klienter skjer implisitt ved at
brukere kommuniserer seg i mellom via data som er lagret i back-end.
6.1.1 Produktml Gruppen mener de har lykkes i lage en applikasjon som oppfyller mesteparten av produktmlet,
og kan gjre samboerskapssituasjoner enklere.
Gruppen har ftt tilbakemeldinger p applikasjonen som bekrefter dette, men det er ogs mottatt
noen negative tilbakemeldinger. Disse gr ut p at lringskurven for komme i gang er litt bratt.
Det er ytret nsker om en veiledning som tar brukeren gjennom hovedfunksjonaliteten til
applikasjonen frste gang man tar den i bruk. Allikevel mener gruppen at produktmlet er delvis
oppndd.
6.1.2 Kildekode Dette kapittelet forklarer litt om hvordan koden er lagt opp i klientene og demonstrer noen
teknikker og metoder som er brukt i prosjektet.
Side 32 av 75
6.1.2.1 Samtidighet (Concurrency)
Begge klientene gjr nettverkskall utenfor hovedtrdene, men det er ikke implementert manuelt
med trder eller samtidighets-API'er. Dette er i stedet brukt implisitt ved benytte metoder fra
Parse sitt API som arbeider i bakgrunnen.
Parse sitt API har sttte for samtidighet, og bruker call-back's for varsle klientene om at de er
ferdige med laste ned og bearbeide.
ParseQuery query = new ParseQuery("Expense"); query.getInBackground(expenseObjectId, new GetCallback() { @Override public void done(Expense expense, ParseException e) { ... } });
Figur 23: Sprring i Android med Parse sitt API
[PFUser logInWithUsernameInBackground:username password:password block:^(PFUser *user, NSError *error) { ... }];
Figur 24: Sprring i iOS med Parse sitt API
Android-koden i figur 23 og iOS-koden i figur 24 er bruker begge Parse sitt API for gjre
nettverkskall mot Parse sine tjenere. Begge har en call-back som blir utfrt nr API'et er ferdig med
jobben den skal gjre.
6.1.2.2 Facebook
Applikasjonen er integrert mot Facebook ved at man kan registrere seg som bruker av
applikasjonen ved hjelp av profildetaljene sine fra Facebook. For dette brukes en kombinasjon av
Parse sitt Facebook-API og Facebook sin egen SDK. Nr brukeren logger inn med Facebook, vil
han bli spurt om applikasjonen skal f tilgang til profildetaljene sine. Disse blir s lagret som en ny
bruker i databasen hos Parse. Dette gjr at det ikke tillates endre profildetaljer for en bruker som
er logget inn via Facebook.
I figur 25 (Android-kode) og figur 26 (iOS-kode) kan man se hvordan man kaller p Parse sin
Facebook-integrasjon for logge inn med Facebook.
ParseFacebookUtils.logIn(permissions, this, new LogInCallback() {
@Override
public void done(ParseUser parseUser, ParseException e) {
// When login is done, the data fields are updated with the details
// from the facebook user
...
});
Figur 25: Innlogging med Facebook p Android
[PFFacebookUtils logInWithPermissions:permissionsArray block:^(PFUser *user, NSError *error) { // When login is done, the data fields are updated with the details // from the facebook user ... }];
Figur 26: Innlogging med Facebook p iOS
Side 33 av 75
6.1.2.3 iOS
Koden til iOS er skrevet utelukkende i Objective-C og bruker Parse sitt iOS SDK.
6.1.2.3.1 Struktur
Koden til iOS har endret struktur flere ganger i lpet av prosjektet, som en flge av ny kunnskap og
et nske om eksperimentere.
Grunnet enhetstestenes bortgang var det ikke behov for separere all logikk fra View Controllers.
Derfor er koden lagt opp slik at hver View Controller inneholder all relatert logikk. Dette har gjort
noen klasser litt lengre enn de hadde behvd vre, men har gjort at utviklingen av disse har gtt
betydelig fortere. Dette er ogs mten Parse har gjort ting i sine eksempler og veiledninger.
For illustrere forskjellene har en innloggingsskjerm med separert logikk en liten View Controller-
klasse som hndterer bruker-input og viser feilmeldinger, og en lengre hjelpeklasse for hndtere
selve innlogging og feil fra Parse sine tjenere. Dette ville vrt en klart bedre struktur, men grunnet
tidsbegrensninger ble ikke dette gjort.
Slik det er gjort i prosjektet, har innloggingsskjermen kun View Controller-klassen som inneholder
hndtering av brukerinput, kommunikasjon mot Parse, hndtering av feil og visning av disse til
bruker.
lage hjelpeklasser til alle interaksjoner mot Parse viste seg vre mye repeterende kode, noe
som tyder p at deler av strukturen ikke er ideell. Det ble ogs mye repeterende kode ved kutte ut
hjelpeklassene fullstendig, s en lsning som er "perfekt" er ikke funnet for dette prosjektet.
Den beste lsningen ville vrt lage et lite sett med generiske hjelpeklasser. Dette var ikke noe
gruppen fikk tid til gjennomfre.
Side 34 av 75
6.1.2.3.2 MVC-mnsteret
MVC (Model-View-Controller) design-mnsteret dreier seg om den globale arkitekturen i et
program. Derfor er det et hyniv-mnster. MVC designmnsteret klassifiserer gjenstander etter de
generelle rollene de spiller i applikasjonen. Et MVC design-mnster kan ogs omfatte flere
MVC'er. Man drar nytte av tilpasse MVC'en for sitt eget design fordi mange gjenstander i disse
programmene har en tendens til vre mer gjenbrukbare. Dette gjr at applikasjoner enklere kan
tilpasse seg dersom krav endres eller hvis man trenger utvide applikasjonen. (Model View
Controller, 2012)
I MVC designmnsteret finnes det tre typer objekter: Model-objekter, view-objekter og controller-
objekter. Modell-objekter er hva applikasjonen er (men ikke hvordan den er vist). Controller-
objekter (eller View Controller) kontrollerer hvordan model-objekter blir presentert til brukeren
(UI-logikk). View-objekter er brukergrensesnitt-elementer som controlleren styrer og bruker for
presentere model-objekter.
View Controlleren kan alltid snakke direkte til sine Model-objekter og til sine View-objekter.
Model-objekter og View-objekter skal ikke snakke med hverandre. (Model View Controller, 2012)
Det finnes flere mter implementere MVC i en iOS-applikasjon. Den mest ryddige mten er
separere all logikk som ikke er direkte avhengig av data eller skjermelementer ut av View
Controlleren. Dette har lett for innebre svrt mange klasser, en god del mer kode og litt mer
rotete struktur i prosjektet. Samtidig har det en tendens til bli mindre klasser, er mer testbart og
lettere forst hvordan View Controlleren jobber.
Prosjektet har benyttet seg av en annen variant av MVC, der mesteparten av logikken ligger i View
Controlleren, og modellene er enkle objekter (som for eksempel tabeller). Dette er for gjre
utvikling raskere og fordi det ikke var noen klare fordeler med separere ut all logikken. Dette gjr
ogs at iOS- og Android-versjonene har likere struktur.
I en typisk skjerm kan View-delen vre skjermelementer som er laget i Xcode sin Storyboard (dra-
og-slipp). Knapper, tekstfelter, oversikter og tabeller er typiske skjermelementer som er en del av
View'et.
Figur 27: Skjermdump fra Xcode. Viser et View
Modellen kan for eksempel vre en liste med objekter som skal vises p skjermen p et eller annet
vis.
// Model @property (strong, nonatomic) NSArray *unfinishedTaskLists; // of TaskList *