Översikt Trivicalc SMD168/SMD15 Fredrik Bengtsson bson@sm.luth.se Föreläsning 1 Introduktion till Trivicalc - problem Föreläsning Grafiska Användargränssnitt Föreläsning del 1 Versionshantering CVS (Johan Karlsson) del Design av programmet Översikt Föreläsning 1 Vad är Trivicalc? Syftet med Trivicalc Presentation av Trivicalc Funktionalitet Problem som uppstår Övergripande förslag på lösningar Administration inlämning, hjälp, osv... Vad är trivicalc? Grafiskt kalkylprogram typ Excel, Lotus 1--, Quattro Pro m.fl....fast lite enklare Syfte med Trivicalc skriva stora program dela upp problem (arbeta i projekt) grafiska gränssnitt modifiera befintlig kod följa specifikation menyrad aktuell cell statusfält (visar själva uttrycket) inmatningsfält kalkylark (visar värdet av uttrycket) Områden på skärmen En cell Informationen i en cell: Tom cell helt okomplicerat Sträng helt okomplicerat Uttryck lite mer komplicerat vanligt uttryck (från labben) referenser till andra celler (som variabler) ex. A1A1*B1 modifiera parser uppdateras automatiskt 1
Uttryck i kalkylarket Uppdatering vid inmatning Refererande celler uppdateras automatiskt helt ok att uppdatera allt Exempel A1=1 A= A=A1A A visar nu A1 ändras till A visar automatiskt 4 Parsern Utöka parsern från tidigare lab Grammatik (BNF) expr ::= expr addop term term term ::= term mulop factor factor factor ::= posfact negop posfact posfact::= address number "(" expr ") addop ::= "" "- mulop ::= "*" "/ negop ::= "-" Parsern Observera att unärt minus inte behöver följas av parentes! Exempel på korrekt uttryck: -*-4-1 Exempel på korrekt uttryck med referens: -A1*4/-B Ny nod i parsträdet Referenser representerar referens till cell Riktig referens (i java) eller bara en sträng? Riktig: svårt att underhålla Vi kan inte kasta bort en cell och ersätta med en ny, då tappar vi referensen. Abstrakt (koordinater eller motsv.) vi hämtar den refererade cellen från arket varje gång. Referenser - Exempel Mer om referenser A1: *4 * ny! A1: 5 4 Kalkylark A: *A1 * A1 referera arket istället Hur uppdatera? Uppdatera alltid allting helt ok Uppdatera bara det nödvändiga (refererande celler) svårare, men bättre varje cell måste veta vad som ska uppdateras 5 Ny A1: Vi riskerar tappa referensen referens i java? -nej
Cirkelreferenser Om en cell refererar sig själv? Inte tillåtet Även indirekta referenser till sig själv ska upptäckas Exempel (OBS! TRASIGT EXEMPEL): A1=A A=A11 A=A Cirkelreferenser lösning? Hur upptäcker vi cirkelreferenser? Vid evaluering av cell: evalueringen kommer tillbaka till samma cell Skriv felmeddelande! Tillåt inte förändringen! Cirkelreferenser Exempel Snabb evaluering Vi evaluerar A1: A1: *A * A: *A1 Här upptäcker vi cirkeln * A A1 A: *A * A Evaluering måste ske hyffsat snabbt inte ok om det tar flera år att evaluera optimera? Nej; det behövs inte! se till att aldrig evaluera en cell mer än en gång Exempel (på hur illa det kan bli!): A1=1 A1 evalueras A=1 A evalueras A=A1A A, A1, A evalueras A4=AA A4, A, A, A1, A evalueras A5=A4A A5, A4, A, A, A1, A, A, A1, A osv... såhär kan vi inte ha det! Snabb evaluering förslag på lösning Vid uppdatering Evaluera aldrig en cell mer än en gång Hur? Spara värdet från evalueringen Hur länge då? Till nästa uppdatering Snabb evaluering Lagra värdet efter evaluering Exempel: A1=1 A1 evalueras A=1 A evalueras A=A1A A evalueras (A1, A besöks ) A4=AA A4 evalueras (A, A besöks ) A5=A4A A5 evalueras (A4, A besöks )
Flera fönster Filfunktioner ett ark per fönster oberoende av andra fönster inte ett fönster med flera flikar varför? det blir andra problem med flera fönster Öppna/Spara filer filformat enl. specifikation öppnas i aktuellt fönster tidigare innehåll kastas bort Fönstermenyn Ska innehålla alla fönster Innehåller ett menyval för varje fönster Kräver utbyte av information mellan fönstren Felhantering Använd undantag i java; fungerar ofta smidigt. Ärv Exception (Exception måste fångas) Alla fel ska hanteras! inga undantag i konsollfönstret Skriv meddelande i statusfältet Kalkylarket får aldrig vara trasigt Tillåt inte sådana ändringar Trasiga filer ska hanteras med felmeddelande Tänk på att hantera referenser utanför kalkylarket cirkelreferenser trasiga uttryck referenser till celler som inte är uttryck Testning Tänk er Trivicalc som ett riktigt program helst inga fel i slutversionen... Testexempel på webben Testa noga det kommer jag att göra lätt att glömma detaljer ett exempel: referenser till A0 Design Håll isär olika delar parser cell kalkylark grafik osv... Designa noga innan ni kodar snabbare (att utveckla) och enklare helt normal att ändra i designen sträva efter hierarkisk objektstruktur objekten längre ner känner inte till de ovanför går inte alltid att uppnå på ett enkelt sätt Design Använd gärna Observer/Observable för att separera data från presentation Data (modellen) känner inte till presentationen (vyn) Vi kan byta vy utan att ändra modellen (inte ens kompilera om) Vi kan ha flera vyer sammtidigt (om vi vill) Även i andra situationer när man vill ha bort ett ömsesidigt beroende. 4
Observer/Observable Administration Observer update(object msg) TextUI GUI Observable add(observer obs) setchanged() notifyobservers(object msg) Data Data har ingen vetskap om GUI eller TextUI Designredovisning alla gruppmedlemmar Slutredovisning alla gruppmedlemmar ett tillfälle ett extra tillfälle (för returer) Grupper Grupper ska vara tre personer Registrera grupper på webben Annonsforum för att söka gruppmedlemmar Hjälp under labpass på mitt rum (A414) 5