[x^2 for x in lst]

Istället för att gå och lägga sig

2014-06-09

I Almas matteapp finns det just nu två saker som är gjorda för att öka intresset för att fortsätta göra övningar: medaljer och utmärkelser. Medaljer får man när man gjort en viss övning ett visst antal gånger. Gör man en övning en gång får man en bronsmedalj, gör man den fem gånger får man en silvermedalj, tio gånger ger en guldmedalj och tjugo gånger en diamantmedalj.

Utmärkelser är ett sätt att belöna att man gör flera olika uppgifter. För vissa utmärkelser spelar det inte någon roll vilken kategori en uppgift tillhör, andra har krav på att uppgifterna man gör skall tillhöra vissa kategorier. För närvarande finns det fyra kategorier: addition, subtraktion, multiplikation och talkompisar. Jag har planer på att utöka listan med kategorier allteftersom jag lägger till fler övningar till appen.

Den första utmärkelsen har jag (till Almas stora förtret) kallat 'Tre ljusstakar'. För att få den behöver man ha fått tre bronsmedaljer. Vet förresten inte riktigt varför jag valde just namnet Tre ljusstakar. Tror att jag associerade brons med mästing och mässing med ljusstakar. Inte helt logiskt kanske, men vad tusan, något skall den ju heta.

Utmärkelser-konceptet är förresten hederligt snott från Project Euler. Vet att det där triggar mig att göra fler uppgifter så jag tänkte att det kanske kunde trigga appanvändarna på samma sätt.

Alma har varit bortrest i några dagar och när hon kom hem igår så berättade jag att jag implementerat en ny utmärkelse: PlusMinus. För att få den behöver man fått guldmedalj på en additionsövning och en subtraktionsövning. Hon frågade då om jag inte kunde göra en utmärkelse som hade med multiplikation att göra. Det lovade jag henne att göra.

Runt kl nio på kvällen plockar jag, mot bättre vetande eftersom jag var rätt trött och borde gå och lägga mig, fram datorn. Startar upp Android Studio som indikerar att det fanns en uppgradering (0.6.0) att installera, vilket jag då gjorde. Efter den obligatoriska omstarten försökte jag bygga projektet. Fel version av SDK-toolsetet. Skit också. Startar upp SDK-managern och uppdaterar toolsetet. Det tar en bra stund. Startar om Android Studio. Bygger om projektet. Fortfarande fel version av toolset:et. In i projektinställningarna. Hittar inställningen för toolset-version och ändrar till den nyligen uppdaterade. Bygger om projektet. Äntligen funkar det. Tidsåtgång på detta: ca 45 minuter. Min dator är snart fem år gammal så allt tar sin lilla stund...

Nu är jag rejält trött och borde verkligen gå och lägga mig. Tänker: 'om jag bara startar koda lite på den nya utmärkelsen så blir det lättare att komma igång imorgon'. Börjar med det jobbigaste: komma på vad utmärkelsen skall kräva och att lägga till namn och beskrivning på den i strings.xml. Detta är något som brukar ta en stund eftersom jag har dålig fantasi och därför svårt att komma på bra namn på saker och ting. Sitter och funderar en stund innan jag bestämmer mig för att utmärkelsen skall kräva att man fått en guldmedalj på tre multiplikationsövningar. Den blir rätt lätt att få eftersom det t.ex. finns två övningar på ettans gångertabell (med och utan ordning). Vad skall utmärkelsen heta då. Svåra frågor. Jag bestämmer mig för att bara ta något: 'Multiplikationstrippel' får det bli. Inte världens bästa namn, men om Alma protesterar alltför mycket så kan man alltid ändra i ett senare läge. Namnet visas bara för användaren. Det används inte internt och sparas inte i databasen, så man kan ändra i strings.xml utan att behöva ta några speciella hänsyn, vilket ju är skönt.

Nu var det bara resten kvar. Är nu ännu tröttare och funderar på om jag verkligen inte borde gå och lägga mig. Väljer dock att fortsätta. Bara lite till.

Alla utmärkelser har en egen klass. Klassen refereras från enumen Awards. I den enum:en specas för varje enumerarat värde följande saker: värdets ID (1, 2, ...), namn (ref till strings.xml), beskrivning namn (ref till strings.xml) och klassliteralen för den klass som implementerar utmärkelsen.

Klassen som implementerar utmärkelsen skall implementera interfacet Award. Detta interface definierar endast en metod: boolean requirementsFulfilled(MedalStatisticsDto). Denna metod skall returnera true om användaren erhållit utmärkelsen och false om så inte är fallet. Valet görs med hjälp av en böna av typen MedalStatisticsDto som innehåller data om vilka medaljer som användaren fått.

Fördelen med att spara såpass mycket data i Awards är att aktivitieten som visar upp listan med utmärkelser (erhållna samt icke än erhållna) blir extremt lätt att skriva. Det den i princip gör är att den loopar över alla värden i Awards-enumen och i en ListViewvisar upp en rad för varje värde. På en rad i ListView:n skrivs namnet och beskrivningen på utmärkelsen i fråga. Det ritas också ut en ikon om användaren har erhållit utmärkelsen. Aktiviteten bestämmer om användaren erhållit utmärkelsen genom att skapa en instans av den klass som pekas ut av Awards-enumen och anropa dess boolean requirementsFulfilled(MedalStatisticsDto) metod. Jättesmidigt, om jag får säga det själv. Och det får jag ju eftersom det är min blogg ;)

I alla fall, när jag väl hade bestämt mig för vad utmärkelsen skulle heta så skapade jag en ny klass som ärvde från Award och implementerade dess boolean requirementsFulfilled(MedalStatisticsDto)-metod. Den blev 21 rader. Inklusive @Override-annotering, tomrader och måsvingar (för left curly brace är ju den rätta placeringen är på raden under statmentet så varje par måsvingarökar ju på radantalet med två). Inte så illa.

Efter det var det bara att lägga till rad med ett nytt enum-värde i Awards-enumen, testköra och checka in. Testkörningen tog lite tid eftersom jag var tvungen att få guld på tre multiplikationsövningar. Jag hade brons på alla sedan tidigare (testkör alltid alla nya övningar en gång) så jag var tvungen att göra 3 * 4 = 12 övningar var och en innehållande 11 uppgifter. Även om varje uppgift går snabbt (let's face it: ettans och tvåanstabell är inte så svåra) så tar 132 uppgifter sin lilla tid. Funkade som det skulle gjorde det i alla fall.

Kvällens facit: en ny utmärkelse implementerad. Relativ tidsåtgång per aktivitet: strul 50%, namnsättning: 10%, kodning: 15% och test: 25%. Som vanligt med andra ord.


Leave a reply

Your name as it will be displayed when the comment is posted on the page. Your email address will not be published.