DESIGNSPECIFIKATION MultiPC v1.0
Ansvarig: Håkan Lindegren
Granskad: ____ Datum:_________ Signatur:_________
Godkänd : ____ Datum:_________ Signatur:_________
Innehållsförteckning
1 ALLMÄNT...3
2 REFERENSER ...3
3 TERMINOLOGI ...3
4 RELATION TILL ANDRA DOKUMENT...3
5 SUBSYSTEMINDELNING...3
6 SUBSYSTEM...4
6.1 WEBBPLATS...4
6.1.1 Stödgraf ...4
6.1.2 Krävda gränssnitt ...4
6.1.3 Erbjudet gränssnitt ...4
6.1.4 Funktion...4
6.1.5 Övrigt...4
6.2 MULTIPC GUI ...4
6.2.1 Stödgraf ...4
6.2.2 Krävda gränssnitt ...5
6.2.3 Erbjudet gränssnitt ...6
6.2.4 Funktion...6
6.2.5 Övrigt...6
6.3 MULTIPC LOGIK...6
6.3.1 Stödgraf ...6
6.3.2 Krävda gränssnitt ...7
6.3.3 Erbjudet gränssnitt ...7
6.3.4 Funktion...11
6.3.5 Övrigt...11
6.4 MULTIPC HJÄLP...11
6.4.1 Stödgraf ...11
6.4.2 Krävda gränssnitt ...11
6.4.3 Erbjudet gränssnitt ...12
6.4.4 Funktion...12
6.4.5 Övrigt...12
7 PROBLEM...12
8 ÖVRIGT...13
1 ALLMÄNT
Det här dokumentet ska beskriva hur MultiPC v1.0 ska konstrueras. Dokumentet specificerar en hierarkisk indelning i subsystem. För subsystemen visas sedan beroendediagram, klassdiagram, arkitekturdiagram m.m.
2 REFERENSER
[DETDOK] Lindegren, Håkan: MultiPC v1.0: Detaljkrav.
[ANVDOK] Lindegren, Håkan: MultiPC v1.0: Användarkrav.
3 TERMINOLOGI
Fasadklass
En fasadklass läggs ovanpå en struktur av klasser för att dölja den underliggande strukturen. Det enda det externa systemet ser av stödsystemet är fasadklassen.
Singleton
Ett designmönster som kan tas till då ett system endast ska ha en instans av en klass. Ett alternativ vore att ha en enda global instans av klassen.
4 RELATION TILL ANDRA DOKUMENT
Det här dokumentet bör granskas mot detaljkravspecifikationen.
Dokumentet ska fungera som indata till implementationen.
Dokumentet ska granskas och rättas till i samband med verifiering som följer på implementationen.
5 SUBSYSTEMINDELNING
Webbplats
Installationsfil
MultiPC GUI MultiPC Logik
MultiPC Hjälp
Webbplats ska utgöra en webbplats med information om produkten MultiPC. Från webbplatsen ska det gå att ladda ner en installationsfil med ett PC-program för multiplikationsträning. PC-programmet delas in i två subsystem, ett för GUI:t och ett för logiken. Det ska utvecklas en windows hjälpfil för PC-programmet.
6 SUBSYSTEM 6.1 Webbplats 6.1.1 Stödgraf
Grafen visar beroenden mellan filer på webbplatsen. Där inget filltillägg anges gäller att det ska vara .html.
6.1.2 Krävda gränssnitt
På webbplatsen: stöd för ASP v2.0.
Hos användaren: Webbläsare med stöd för ramar.
6.1.3 Erbjudet gränssnitt
Filen index.html ger entré till webbplatsen.
6.1.4 Funktion
Subsystemet ska tillhandahålla MultiPC webbplats.
6.1.5 Övrigt
Gränssnitt mot det nerladdningsbara PC-programmet utgörs av filen mulsetup.zip.
6.2 MultiPC GUI
6.2.1 Stödgraf
Arkitektur
GUI:t ska accessa logiken via den enda klassen multipc_logic_c.
GUI-klasser och beroenden
Klasserna i GUI:t kommer att genereras av utvecklingsverktyget.
Ttraining_frm
Klass som ska hantera visning av träningsfönstret där en elev kan öva på tal. Träningsfönstret kommer att vara huvudfönster i programmet.
Tnames_frm
Klass som ska hantera visning av fönstret där en elev kan skriva in sitt namn.
Tresult_frm
Klass som ska hantera visning av facit då en elev har gjort klart ett prov.
Tstatistics_frm
Klass som ska hantera visning av statistik för en viss provtyp.
Tdetailed_frm
Klass som ska hantera visning av detaljstatistik för ett visst tal.
Tmsg_frm
Klass som ska hantera visning av felmeddelanden.
Ttestmode_frm
Klass som ska hantera visning av resultatet av en körning i testmod.
6.2.2 Krävda gränssnitt
En PC med Windows 2000.
Fönsterkomponenter i utvecklingsverktyget.
multipc_logic_c utvecklad och klar enligt nedan.
mulhelp.hlp utvecklad och klar enligt nedan.
6.2.3 Erbjudet gränssnitt
En programfil multipc.exe via vilket PC-programmet kan startas.
6.2.4 Funktion
Subsystemet ska tillhandahålla PC-programmet MultiPC.
6.2.5 Övrigt
EXE-filen ska inte splittras i två delar. Logiken ska länkas ihop med GUI:t.
multipc.exe ska tillsammans med mulhelp.hlp utgöra indata för installationen. Installationen ska tillsammans med en readme-fil packas ihop i filen mulsetup.zip.
6.3 MultiPC logik 6.3.1 Stödgraf
problem_s
En struct som ska hålla reda på två stycken heltal. Heltalen ska representera ett multiplikationsproblem, t.ex.
7•3.
answered_problem_s
En struct som ”är en” problem_s med ett heltal för avgivet svar och ett heltal för den tid det tog att avge svaret.
answers_log_c
Klass som ska hålla ordning på tio stycken answered_problem_s. Ska hantera data för facitfönstret.
details_answer_s
Struct som ska hålla reda på detaljer om ett enda problem för detaljstatistiken. I praktiken en problem_s och
en vektor med alla elevens svar, dock högst 30 stycken. Att det ska vara högst 30 stycken ges av detaljkraven för MultiPC.
detailed_answers_log_c
Klass som ska hantera detaljstatistik för samtliga 100 multiplikationstal som är möjliga.
statistics_problem_s
En struct som ”är en” problem_s förstärkt med två heltal för antalet försök och antalet rätt.
statistics_log_c
Klass som ska hantera statistik för samtliga 100 multiplikationstal som är möjliga.
problem_generator_c
Klass som ska slumpa fram nya multiplikationstal. Den får aldrig slumpa samma två tal i rad, det ges av kravställningen för MultiPC.
multidb_c
Klass som ska fungera som gränssnitt mot filhantering av elevnamn. Eftersom den troligen ska byggas ut till ett generellt databasgränssnitt i framtida utgåvor får den namnet multidb_c.
multipc_logic_c
Ska ge GUI-klasserna ett snällt gränssnitt via vilket de kan manipulera logiken.
6.3.2 Krävda gränssnitt
En C++ kompilator.
6.3.3 Erbjudet gränssnitt
En fasadklass multipc_logic_c med följande gränssnitt:
// Konstanter för felhantering vid läsning och skrivning // av elevnamn
// --- typedef enum
{
DB_OK, DB_CORRUPT, WRITE_FAILED, DB_FULL
} db_status_t;
class multipc_logic_c {
public:
// Ska returnera en unik instans av multipc_logic_c // Parametrar: INGA
//
// Retur:
// Pekare till unik instans //
// Felhantering: INGEN
// --- static multipc_logic_c *get_instance();
// Returnerar status för elev DB
// För anrop INNAN get_first_pupil/get_next_pupil // Parametrar: INGA
//
// Retur:
// Status hos elev DB: DB_OK eller DB_CORRUPT //
// Felhantering:
// Via statusvärdet
// Om status är DB_CORRUPT kommer ny och tom elevfil // att skapas. Anroparen kan sedan fortsätta.
// Jämför med detaljkraven under 120
// --- db_status_t get_db_status();
// För att loopa över och läsa in elevnamn // Parametrar:
// first_name: för lagring av elevs förnamn, minst 40 tecken // last_name: för lagring av elevs efternamnnamn, minst 40 tecken // item_found: sätts till 1 om elev fanns, 0 annars
//
// Retur:
// item_found = 1 indikerar att det fanns ytterligare en elev // item_found = 0 ==> Ingen elev, övriga param oförändrade //
// Felhantering: INGEN
// --- void get_first_pupil(
char first_name[], char last_name[], int &item_found );
void get_next_pupil(
char first_name[], char last_name[], int &item_found );
// Sätter aktuell elev // Parametrar:
// first_name: elevens förnamn, max 40 tecken // last_name: elevens efternamn, max 40 tecken //
// Retur: INGEN //
// Felhantering: INGEN
// --- void set_pupil(
char first_name[], char last_name[] );
// Ger tillbaka namn på aktuell elev // Parametrar:
// first_name: elevens förnamn, minst 40 tecken // last_name: elevens efternamn, minst 40 tecken //
// Retur:
// Namndata i first_name och last_name //
// Felhantering: INGEN
// --- void get_pupil(
char first_name[], char last_name[] );
// För lagring av nytt elevnamn
// Sätter också aktuell elev, d.v.s. anropar set_pupil // Parametrar:
// first_name: elevens förnamn, max 40 tecken
// last_name: elevens efternamn, max 40 tecken // db_status: sätts till DB_OK om det gick bra //
// Retur:
// db_status = DB_OK ==> skrivning gick bra
// db_status = WRITE_FAILED ==> skrivning misslyckades, // elev EJ lagrad
// db_status = DB_FULL ==> redan fullt i elev-DB // elev EJ lagrad
//
// Felhantering:
// Via db_status
// --- void store_name(
char first_name[], char last_name[],
db_status_t &db_status );
// För inställning av tabell // Parametrar:
// table: heltal inom [1 .. 10]
//
// Retur: INGEN //
// Felhantering: INGEN
// --- void set_table( int table );
// Returnerar inställd tabell // Parametrar: INGA
//
// Retur:
// Vald tabell, ett heltal inom [1 .. 10]
//
// Felhantering: INGEN
// --- int get_table();
// Ska ge nästa framslumpade problem // Parametrar:
// problem: operand_a/_b får värden //
// Retur:
// operand_a inom [1 .. 10], operand_b = aktuell tabell //
// Felhantering: INGEN
// --- void get_next_problem(
answered_problem_s &problem );
// Rensar den interna svarsloggen // För anrop innan ett prov startar // Parametrar: INGA
//
// Retur: INGEN //
// Felhantering: INGEN
// --- void clear_answers();
// För lagring av ett besvarat tal // Parametrar:
// answer: svarsdata som ska lagras
//
// Retur: INGEN //
// Felhantering: INGEN
// --- void store_answer(
answered_problem_s &answer );
// För att loopa över de givna svaren i ett prov // Parametrar:
// answer: får svarsdata för ett svar
// correct_answer: får korrekt svar [1 .. 100]
// item_found: sätts till 1 om svar fanns, 0 annars //
// Retur:
// item_found = 1 indikerar att det fanns ytterligare ett svar // item_found = 0 ==> Inget svar, övriga param oförändrade //
// Felhantering: INGEN
// --- void get_first_answer(
answered_problem_s &answer, int &correct_answer,
int &item_found );
void get_next_answer(
answered_problem_s &answer, int &correct_answer,
int &item_found );
// För att loopa över statistiken i vald tabell // Parametrar:
// answer_statistics: får statistik om ett tal // item_found: sätts till 1 om svar fanns, 0 annars //
// Retur:
// item_found = 1 indikerar att det fanns ytterligare statistik // item_found = 0 ==> Ingen statistik, övriga param oförändrade //
// Felhantering: INGEN
// --- void get_first_stats(
statistics_problem_s &answer_statistics, int &item_found );
void get_next_stats(
statistics_problem_s &answer_statistics, int &item_found );
// För att ställa in aktuellt tal för detaljstatistiken // Ska kombineras med set_table()
// Parametrar:
// operand_a: värdet av första operanden //
// Retur: INGEN //
// Felhantering: INGEN
// --- void set_details_number( int number );
// Returnerar inställt details_number // Parametrar: INGA
//
// Retur:
// Inställd detaljoperand, ett heltal inom [1 .. 10]
//
// Felhantering: INGEN
// --- int get_details_number();
// För att loopa över detaljstatistik för vald tabell och valt // detaljnummer
// Parametrar:
// answer_details: data får svar som avgivits // correct_answer: får korrekt svar
// item_found: sätts till 1 om svar fanns, annars 0 //
// Retur:
// item_found = 1 indikerar att det fanns ytterligare svar // item_found = 0 ==> Inget svar, övriga param oförändrade //
// Felhantering: INGEN
// --- void get_first_detail(
int &answer,
int &item_found );
void get_next_detail(
int &answer,
int &item_found );
6.3.4 Funktion
Subsystemet ska tillhandahålla ett lätthanterligt skal ovanpå MultiPC logikklasser.
6.3.5 Övrigt
Inga för utvecklingsverktyget specifika datatyper ska utnyttjas av multipc_logic_c eller dess stödklasser.
multipc_logic_c fungerar som en fasadklass och den uppfyller designmönstret Singleton.
6.4 MultiPC hjälp
6.4.1 Stödgraf
MultiPC GUI mulhelp.hlp
GUI-klasserna i PC-programmet kommer att aktivera hjälpfilen via anropet:
Application->HelpJump( ”HelpID” )
där ”HelpID” är en sträng För att det ska fungera krävs att PC-programmet utnyttjar de ID-strängar som definieras nedan.
6.4.2 Krävda gränssnitt
WinHelp i MS-Windows.
6.4.3 Erbjudet gränssnitt
En hjälpfil mulhelp.hlp med ID-strängar enligt följande:
INTRODUCTION STARTWIN TRAINING RESULTS STATISTICS DETAILS HINTS
ERROR_MESSAGES
Ovanstående ID-strängar ska utnyttjas för rubrikerna i hjälpen, se [DETDOK]. Det ska dessutom finnas ID-strängar som ger separata ingångar till hjälpen från samtliga felmeddelandefönster som dyker upp. Här gäller:
NONAME_FOUND för meddelandet att inga namn hittades.
6.4.4 Funktion
Subsystemet ska tillhandahålla en hjälpfil för MultiPC PC-program.
6.4.5 Övrigt
Nya felmeddelanden som definieras ska i hjälpen ges engelska, beskrivande namn. Den här sektionen ska fyllas på i samband med att ändringsloggen töms.
7 PROBLEM
1. Samtliga felmeddelanden är inte definierade
Det ska finnas utgångar till hjälpsystemet från samtliga felmeddelanden som dyker upp. De är ännu inte identifierade.
Lösning
Följ namnkonventionen under ”MultiPC hjälp” ovan. För in i Ändringsloggen så att det inte glöms bort.
2. Många parametrar
Vissa av funktionerna i mul_logic_c kräver flera parametrar. Vore det inte bättre att synliggöra de strukter som finns internt under mul_logic_c?
Lösning
Det kan vara en god idé. Ignorera nu.
Dokumentera som återstående problem.
3. Inklippta diagram, inklippt kodgränssnitt
UML-graferna har klippts in via ett ritverktyg. Det gör det svårt att ändra i det här dokumentet. Om kodgränssnitt ändras måste man ändra även här i dokumentet.
Lösning
Ignorera nu. Kanske bättre att lägga diagram och kodgränssnitt som bilagor?
Dokumentera som återstående problem.
4. Var finns Javaapplet?
Enligt detaljkraven 40 och 45 ska det utvecklas en Javaapplet. Den borde vara med här.
Lösning
TBD Komplettera det här dokumentet snarast.
5. Generering av namn
Enligt detaljkraven 200 ska det utvecklas testverktyg för att generera namn. Det borde vara med här.
Lösning
TBD Red ut. Är testverktyget så trivialt att det går bra ändå?
8 ÖVRIGT
Avsiktligt lämnad tom.