• No results found

Vyklass

In document Elektroniskt Skyttesystem (Page 59-65)

4 Implementation

4.3 Visningsklient

4.4.1 Vyklass

double averageXPosition = 0; foreach(Shot shot in listShots) {

averageXPosition += shot.xPos; }

return Math.Round((averageXPosition / shotsInList), 1); }

4.4 Testapplikation

Den fristående testapplikationen som utvecklades har i uppgift att simulera träffar. Dess användargränssnittsutseende och funktionalitet liknar visningsklienten. I följande avsnitt beskrivs dess vyklass och datahanteringsklass.

4.4.1 Vyklass

Avsnitt 3.8.1 beskriver testapplikationens vyklassdesign och funktionalitet, där användarplacerade träffar simuleras, skickas till databasen och slutligen resultatberäknas. Två metoder skiljer testapplikationens vyklass åt från den som finns i visningsklienten; härnäst följer en beskrivning av dessa. De metoder som består oförändrade från visningsklientens vyklass är visualizeScoreInListBox (se avsnitt 4.3.3.3) och

4.4.1.1 createAndVisualizeShot

Denna metod ersätter visningsklientens vyklassmetod visualizeShot (se avsnitt 4.3.3.5), och har i uppgift att utifrån de koordinater som muspekaren har i träffytan vid tidpunkten för en träffsimulering skapa en träff som visualiseras, och vars värden skickas vidare till databasen. Genom att utnyttja en struct Point, som representerar ett x- och y-koordinatpar i ett tvådimensionellt plan, kan sådana koordinater utläsas utifrån muspekarens position. En ny sådan instans mousePoint skapas, och tilldelas muspekarens positionsvärde. Två lokala variabler xPosition och yPosition av typen double tilldelas sedan mousePoints x- respektive y-koordinatvärden. Således har muspekarens position hämtats och sparats för användning.

private void createAndVisualizeShot() {

Point mousePoint = new Point(); mousePoint = Mouse.GetPosition(this);

double xPosition = mousePoint.X, yPosition = mousePoint.Y;

Härnäst följer funktionalitet som liknar den som finns i visningsklientens visualizeShot-metod. Träffellipsens x- och y-koordinater tilldelas de värden som hämtades från mousePoint i samband med att dessa värden sätts med SetValue-metoden.

I slutet av metoden anropas en metod insertShotIntoDB i datahanteringsklassen, med de sparade x- och y-koordinaterna som argument, som ämnar lägga till den visualiserade träffen i databasen.

DH.insertShotIntoDB(xPosition, yPosition); }

4.4.1.2 target_MouseLeftButtonDown

Denna metod ersätter visningsklientens vyklassmetod button_Click (se avsnitt 4.3.3.7), och har i uppgift att hantera händelsen då en användare klickar med muspekaren någonstans inom träffytan. När detta sker ska således användargränssnittet uppdateras med en nyskapad och visualiserad träff, samt med beräknade resultat.

I början av metoden anropas metoden createAndVisualizeShot, som ser till att den simulerade träffen skapas, visualiseras och skickas vidare för att läggas till i databasen.

private void Target_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) {

En lokal variabel result av typen double tilldelas sedan det beräknade träffresultatet som returneras från metoden calculateScore i datahanteringsklassen genom ett anrop till denna. Som argument till denna metod skickas träffytebildens antagna bredd- och höjdvärden. Skälet till detta är detsamma som för visningsklientens vyklassmetod button_Click, som redan beskrivits i avsnitt 4.3.3.7. Detta resultat visualiseras sedan i användargränssnittets List Box genom att det skickas som ett argument i anropet till metoden visualizeScoreInListBox.

double result = DH.calculateScore(Target.Width, Target.Height); visualizeScoreInListBox(result);

Därefter beräknas och visualiseras det medelresultat som alla simulerade träffar resulterat i. En lokal variabel averageResult av typen double tilldelas det beräknade medelresultatet som returneras från metoden calculateAverageScore i datahanteringsklassen. Detta resultat skickas som ett argument när metoden visualizeAverageScoreInTextBox anropas. Till skillnad från visningsklienten, där en medelträff koordinatberäknades och visualiserades i användargränssnittets träffyta, så antogs det att den fristående testapplikationen inte krävde en sådan, eftersom syftet med applikationen är att simulera vanliga träffar och lägga till dem i databasen. Således återfinns inga sådana relaterade metoder eller metodanrop i testapplikationen.

double averageResult = DH.calculateAverageScore(); visualizeAverageScoreInTextBox(averageResult); }

4.4.2 Datahanteringsklass

Avsnitt 3.8.2 beskriver testapplikationens datahanteringsklassdesign och funktionalitet, som innefattar tömning av databasen, hantering av data däri samt resultatberäkning. Vissa egenskaper och metoder skiljer sig från visningsklientens datahanteringsklass; härnäst följer en beskrivning av dessa. De metoder som består oförändrade från visningsklientens datahanteringsklass är clearDB (se avsnitt 4.3.4.2) och calculateAverageScore (se avsnitt 4.3.4.5).

4.4.2.1 Klassegenskaper

Den information som behöver hållas reda på i testapplikationens klassegenskaper är hur många träffar som databasen innehåller, och det totala träffresultatet. Såldedes definieras

shotsInDB och totalResult, av typerna int respektive double. shotsInDB ersätter

klassegenskapsvariabeln shotsInList i visningsklientens datahanteringsklass, och har i uppgift att som en räknare inkrementeras varje gång en träff ska läggas till i databasen. Variabeln totalResult har samma syfte som totalResult i visningsklientens datahanteringsklass (se avsnitt 4.3.3.1).

class DataHandler

{

public int shotsInDB = 0; public double totalResult = 0;

4.4.2.2 insertShotIntoDB

Denna metod har i uppgift att, då en träff simuleras och visualiseras i användargränssnittet, även lägga till träffen i databasen. Den tar emot två parametrar x- respektive y-Position, som är den simulerade träffens koordinater från träffsimuleringen.

Till att börja med inkrementeras räknaren shotsInDB. Detta räknarvärde används senare i metoden för att ge den träffs som läggs till i databasen rätt träffnummer i den simulerade träffserien.

public void insertShotIntoDB(double xPosition, double yPosition) {

shotsInDB++;

Därefter sätts en uppkoppling mot databasen upp med hjälp av en using-sats med kontexten

context. Den simulerade träffen läggs in i som en databasentitet med en antagen

enhetsidentitet bestämd till ett (1), ett träffnummer som fås ur den relaterade räknarvariabeln, samt x- och y-koordinater ur argumentvärdena. Enhetsidentiteten som träffen tilldelas är i testapplikationen hårdkodad i nuläget; när fler träffytor möjliggjorts i användargränssnittet bör det här vara möjligt att använda den enhetsidentitet som respektive träffyta representerar, möjligtvis medskickad som ännu en inparameter till metoden. Slutligen så sparas ändringen i databasen.

using (Context context = new Context()) {

context.shots.Add(new Shot() { Id = 1, ShotNum = shotsInDB, xPos = xPosition, yPos = yPosition });

context.SaveChanges(); }

}

4.4.2.3 getLastShotXPosition & getLastShotYPosition

Dessa metoder har i uppgift att utifrån den senast tillagda träffen i databasen utläsa dess x - respektive y-koordinat och returnera detta värde. I visningsklientens fall hade detta kunnat skötas genom att skicka med träffen som en inparameter och ur den hämtat det relevanta koordinatvärdet, men eftersom testapplikationen sköter användargränssnittsuppdatering utifrån individuella träffar som i detta fall måste hämtas ut ur databasen måste enskilda metoder skapas för denna uppgift. Funktionaliteten för dessa två metoder är densamma; även om metoden getLastShotXPosition beskrivs och illustreras så behöver endast alla x bytas ut mot y i koden som implementeras.

Till att börja med så används en using-sats med kontexten context för att upprätta en uppkoppling med databasen. Väl därinne instansieras ett nytt träffobjekt lastShot av typ Shot, som representerar den senast tillagda träffentiteten i databasen. För att få fram denna senast tillagda träff så måste man, som avsnitt 3.6.1.4 beskriver, först ordna träffordningen i nedåtgående ordning utifrån träffarnas träffnummer, varefter det första elementet väljs ut med en First-metod. Slutligen returneras denna träffs x-koordinatat.

public double getLastShotXPosition() {

using (Context context = new Context()) {

Shot lastShot = context.shots.OrderByDescending(s => s.ShotNum).First(); return lastShot.xPos;

} }

4.4.2.4 calculateScore

Denna metod har i princip samma funktionalitet som samma metod calculateScore i visningsklientens datahanteringsklass (se avsnitt 4.3.4.4). Den enda skillnaden är att i

public double calculateScore(double targetWidth, double targetHeight) {

double midX = (targetWidth / 2), midY = (targetHeight / 2), deltaX, deltaY, xPosition = getLastShotXPosition(), yPosition = getLastShotYPosition();

4.5 Kapitelsammanfattning

Detta kapitel har beskrivit hur en SQL-server och databas sätts upp i Azureportalen, och de brandväggsregler som behöver ändras däri för att få åtkomst till dem. Därefter beskrevs och illustrerades utvecklingsmiljöns databasdesigner, vari man kan lägga till tabeller i databasen och bestämma deras innehåll.

Härnäst följde ett avsnitt rörande systemets visningsklient. Avsnittet beskrev visningsklientens ramverksimplementation, användargränssnitt och klasser. Ramverksimplementationen innefattade modellen som bryggar applikationen och databasen, den tillhörande uppkopplingssträngen, samt funktionalitet och kodstruktur för de resulterande kontext- och träffmetoderna.

Användargränssnittets XAML-kod beskrevs, och själva användargränssnittet i utvecklingsmiljöns WPF-designer illustrerades.

Vy- och datahanteringsklassernas klassegenskaper, metodfunktionalitet och kodstruktur beskrevs sedan.

Slutligen följde ett avsnitt rörande den testapplikation som utvecklades för att spara simulerade träffvärden i systemets databas i syfte att testa visningsklienten utifrån dessa värden. Precis som för visningsklienten beskrevs testapplikationens vy- och datahanteringsklasser; detta innefattade deras klassegenskaper, metodfunktionalitet och kodstruktur.

In document Elektroniskt Skyttesystem (Page 59-65)

Related documents