Professional Documents
Culture Documents
Programmeringsbegreber (Mindmap) : Tuesday, February 11, 2014 9:55 AM
Programmeringsbegreber (Mindmap) : Tuesday, February 11, 2014 9:55 AM
Programmeringsbegreber (Mindmap) : Tuesday, February 11, 2014 9:55 AM
ITS side 1
ASCII værdi
Thursday, September 19, 2013 11:50 AM
ITS side 2
C# syntaks
Thursday, November 14, 2013 6:48 PM
ITS side 3
if Et if-statement identificerer hvilket udsagn der skal kører baseret på værdien af et
boolean udtryk.
implicit
in
in
(modifier
)
int Tal (se Variable)
interface
internal
is
lock
long Tal (se Variable)
namespa
ce
new new kan bruges som en operatør, en modifier, eller begrænsning
null null repræsenterer en null reference, en der ikke refererer til ethvert objekt. null er
standardværdien for reference-type variabler. Almindelige værdi typer kan ikke være
null.
object
operator
out
out
(modifier
)
override
params
private Private beskriver adgangen. Privat adgang er det mindst eftergivende adgangsniveau.
Private medlemmer er kun tilgængelige i body'en af klassen eller struct, hvor de er
erklæret
protecte
d
public public beskriver adgangen. public adgang er det mest eftergivende adgangsniveau. Der
er ingen restriktioner på adgangen til public medlemmer.
readonly
ref
return Return statementet afslutter udførelsen af en metode, der hvor den er skrevet og
returnerer kontrollen til den kaldende metode. Den kan også returnere en valgfri værdi.
Hvis metoden er en ugyldig type, kan statementets redegørelse udelades.
sbyte Tal (se Variable)
sealed
short Tal (se Variable)
sizeof
stackalloc
static static metoden bruges til at erklære et static medlem, der hører til en type snarere end
til en bestemt genstand. static kan bruges med classes, fields, methods, properties,
operators, events, and constructors, men det kan ikke bruges med indexers, destructors
ITS side 4
operators, events, and constructors, men det kan ikke bruges med indexers, destructors
eller andre typer end klasser.
string Tekst (se Variable)
struct
switch switch er en kontrol erklæring som vælger en swicht sektion til at udføre kommandoer
fra en liste over kandidater.
Hver switch sektion indeholder et eller flere case labels og en liste over én eller flere
statements.
this
throw
true Boolean værdi
try
typeof
uint Tal (se Variable)
ulong Tal (se Variable)
unchecke
d
unsafe
ushort Tal (se Variable)
using
virtual
void Når void bruges som returtype for en metode, angiver void at metoden ikke returnerer
en værdi. void er ikke tilladt i parameterlisten for en metode.
volatile
while while statementet udfører en erklæring eller en blok af erklæringer, indtil et givet udtryk
evalueres til Falsk.
ITS side 5
Specialtegn
Thursday, December 12, 2013 2:21 PM
ITS side 6
Operatorer
Monday, November 04, 2013 5:56 PM
- Integer-typer
+ Addition f.eks. x = y+z
- Substraktion f.eks. x = y-z
* Multiplikation f.eks. x = y*z
/ Division f.eks. x = y/z (UNDTAGEN VED TO HELTAL: To heltal som divideres vil altid
resulterer i et nyt heltal, altså kan to heltal ikke resulterer i det korrekte svar hvis svaret er
et decimaltal)
% Modulus f.eks. x = y%z
- Real-typer
+ Addition f.eks. x = y+z
- Subtraktion f.eks. x = y-z
* Multiplikation f.eks. x = y*z
/ Division f.eks. x = y/z
% Modulus f.eks. x = y%z
- Korte udregninger
++ Forøger en variabel med en f.eks. ++x eller x++
-- Formindskelse en variabel med en. f.eks. --x eller x--
+= Adderer værdien af en variabel med en værdi f.eks. x += y, hvor x = x+y
-= Subtraherer værdien af en variabel med en værdi f.eks. x -= y, hvor x = x-y
*= Multiplicerer værdien af en variabel med en værdi f.eks. x *= y, hvor x = x*y
/= Dividerer værdien af en variabel med en værdi f.eks. x /= y, hvor x = x/y
%= Modulus f.eks. x %= y, hvor x = resten af x/y
- Såfremt variabelnavnet står før operatoren (a++), bliver værdien 1 tillagt variablen efter
instruktionen er udført, og hvis variabelnavnet står efter operatoren (++a), bliver værdien 1 lagt til
før instruktionen udføres.
- Hvis der er tale om strenge, kan + og += benyttes til at sammenlægge to string-variabler.
- Sammenligning:
x == y Returnerer true når x er lig med y, ellers returneres false
x != y Returnerer true når x ikke er lig med y, ellers returneres false
x<y Returnerer true når x er mindre end y, ellers returneres false
x <= y Returnerer true når x er mindre end eller lig med y, ellers returneres false
x>y Returnerer true når x er større end y, ellers returneres false
x >= y Returnerer true når x er større end eller lig med y, ellers returneres false
- Tegn (char) og strenge (string) kan også sammenlignes med == operatoren.
- Logiske operatorer:
!x Ikke x, returnerer true hvis x == false, ellers returneres false
x || y x eller y, returnerer true hvis x eller y er true, ellers returneres false
x && y x og y, returnerer false hvis x og y er false, ellers returneres true
ITS side 7
1. semester
8. oktober 2014 13:52
ITS side 8
Namespaces, klasser og metoder
Thursday, November 14, 2013 8:04 PM
- Eksempel:
ITS side 9
- Klasser er typisk ”genstande” – dvs. navneord i ental:
• Driver
• Patient
• Motor
• Hospitalsstue
• Diagnose
• Navn
• Osv.
- Man kan lave et program med et namespace, en klasse og en metode
- Større programmer består typisk af flere af hver
- Der skal være mindst en klasse og mindst en metode
- En metode skal hedde Main() – alle andre metoder kan navngives (næsten) frit
- Main() er den metoder der starter programmet
ITS side 10
Klasser
Thursday, November 14, 2013 9:25 PM
UML diagram
ITS side 11
Metoder
Thursday, November 14, 2013 8:58 PM
ITS side 12
Objekter
Thursday, December 12, 2013 2:28 PM
- Eksempel: En klasse repræsenterer en person, og denne klasse har et enkelt felt kaldet navn
erklæret som en streng:
- Fordi der er tale om en klasse, skal du bruge new ved oprettelse af et objekt:
- I koden erklæres en referencevariabel p1, som kan pege på et objekt af typen Person, og
samtidig
oprettes et objekt og p1 tildeles referencen. Derfor kan personens navn tildeles gennem
p1.Navn.
ITS side 13
Read-metoder
Thursday, November 14, 2013 9:00 PM
Read()
- Blokerer indtil Enter er trykket (tilføjer CR-LF på Windows makiner)
- Efterfølgende kald af Read() returnerer de indtastede taster en ad gangen til alle er læst, hvorefter
Read() igen blokerer (venter)
- Returnerer et heltal repræsenterende en ASCII værdi
ReadKey()
- Blokerer indtil en tast (også funktionstaster) er trykket og udskriver det tastede på skærmen.
Returnerer
- ConsoleKeyInfo, der indeholder info om evt. kombinationer af taster (CTRL c)
ReadKey(Boolean)
- Som foregående hvor parameteren angiver om karakteren skal vises på skærmen (true - ikke vises)
ReadLine()
- Kan læse en string på op til 254 karakterer
Eksempler:
ITS side 14
ITS side 15
Char-struktur
Thursday, November 14, 2013 9:07 PM
- IsLetter(char)
- IsDigit(char)
- IsNumber(char)
- IsControl(char)
- IsLetterOrDigit(char)
- IsSymbol(char)
- IsPunctuation(char)
- IsLower(char)
- IsUpper(char)
- ToLower(char)
- ToUpper(char)
ITS side 16
Variable/konstant
Monday, November 04, 2013 5:26 PM
- En variabel giver mulighed for at både gemme og aflæse en konkret værdi gennem et variabelnavn
- Det eneste man behøver at fortælle C# er hvilken type variablen er (tal, tekst…) og hvad navn den
har.
- Derefter kan variablen tildeles værdier
- En konstants tildelte værdi kan ikke ændres gennem hele koden levetid
- Real-typer:
- Decimal tal:
float – 32 bit Negative tal: –3.4028234663852886 ∙ 1038 til –1.40129846432481707 ∙ 10-45
Positive tal: 1.40129846432481707 ∙ 10-45 til 3.4028234663852886 ∙ 1038
Positiv 0 og ∞
Negativ 0 og ∞
double – 64 bit Negative tal: –1.7976931348623157 ∙ 10308 til –4.94065645841246544 ∙ 10-324
Positive tal: 4.94065645841246544 ∙ 10324 til 1.7976931348623157 ∙ 10308
Positiv 0 og ∞
Negativ 0 og ∞
decimal – 128 bit Negative tal: –79.228.162.514.264.337.593.543.950.335(–7.9 ∙ 1028) til –1.0 ∙ 10-28
Positive tal: 1.0 ∙ 10-28 til 79.228.162.514.264.337.593.543.950.335(7.9 ∙ 1028)
- Bool-typer:
- Kan kun være to forskellige ting
bool – 8 bit true eller false
- Dato og tid:
DateTime Kan gå fra 1. januar år 1, og repræsenterer tid i ticks (100 ns)
- Char-types:
- Enkelt tegn
char – 16 bit Karakterer, '\u0000' to '\uFFFF' (0 til 65535)
ITS side 17
- Strenge:
- Samling af tegn (f.eks. sammenhængende tekst)
String Samling af karakterer
- Object:
- Disse er tilgængelige på alle typer variabler, fordi alle strukturer og klasser oprindelig er
baseret på klassen.
Equals Foretager en sammenligning
GetType Returnerer typen af objektet
ToString Returnerer en streng som beskriver objektet
ITS side 18
Erklæring og definition
Monday, November 04, 2013 6:20 PM
Variabel
- For at erklære en variabel skal du
- Angive den type variablen skal have
- Give variablen et godt (selvforklarende) navn
- Typen skal angives før navnet:
- Eksempler:
- Enkelte tegn (char) skal tildeles med enkelt anførselstegn, som omkranser tegnet, f.eks.:
- Strenge (altså samlinger af tegn) skal tildeles med almindelige anførselstegn, f.eks.:
- Variablernes levetid:
- Klasse variabler lever fra den første reference til klasse til applikationens ende
ITS side 19
- Klasse variabler lever fra den første reference til klasse til applikationens ende
- Objekt variabler lever fra objektet laves (med new) og indtil der ikke er en reference til objektet
- Parameter variabler lever fra begyndelsen af metoden indtil den returnerer
- Lokale variabler lever fra den er defineret og til enden af tuborgklammerne { }
Konstant
- En konstant erklæres og defineres ligesom en variabel.
- Man kan have brug for at definere en konstant, f.eks.:
- Antal måneder om året
- Antal sider på en terning
- Disse værdier vil ikke ændre sig i hele kodens levetid.
- Det kaldes en konstant og erklæres ved hjælp af kodeordet const, f.eks.:
ITS side 20
Typekonvertering
Thursday, November 14, 2013 9:03 PM
- Implicit typekonvertering forudsætter, at den modtagne datatype er større end den konverterende
datatype.
- Konverteringen kan foretages i en almindelig tildeling, f.eks.:
- Hvis der er en risiko for, at en typekonvertering resulterer i tabte værdier, kræves det, at kompileren
kan se, at det er godkendt (kaldes eksplicit typekonvertering) – ellers vil der ske en kompileringsfejl.
- Konverteringen kan ske ved at angive den ønskede datatype i parentes foran den variabel, som skal
konverteres, f.eks.:
- Typer kan også konverteres til andre typer ved brug af Convert.To…:
- ToChar(…)
- ToBoolean(…)
- ToByte(…)
- ToDouble(…)
- ToInt16(…)
- ToInt32(…)
- ToInt64(…)
- ToString(…)
- Eksempel:
ITS side 21
Kontrolstrukturer
Thursday, November 14, 2013 8:38 PM
If
- if har en betingelse
- Hvis betingelsen er opfyldt vil koden læses (det der står i tuborgklammerne)
- Hvis den ikke er opfyldt vil koden blive sprunget over, f.eks.:
- Aktivitetsdiagram
- Tilhørende kode
- I parentesen kontrolleres udtrykket, og hvis det er sandt, afvikles koden mellem tuborgklammerne.
- Udtrykket kan kombineres med logiske operatorer efter behov, f.eks. hvis der skal være to betingelser der skal være opfyldt (&&) eller hvis bare én af
to betingelser skal være opfyldt (||).
- Man kan have så mange if-strukturer inden i hinanden, som man vil.
- If kan kombineres med else, se afsnitte herunder.
Else
- Ved en "if" betingelse vil "else" sørger for at der også afvikles kode, hvis udtrykket er falsk.
- If…else bruges altså hvis der skal kunne opstå to forskellige situationer hvor der skal afvikles kode, f.eks.:
- Aktivitetsdiagram
ITS side 22
- Tilhørende kode:
- I if's parentes kontrolleres udtrykket, og hvis det er sandt, afvikles koden mellem tuborgklammerne i if'en, ellers afvikles koden mellem
tuborgklammerne i else'en
- Udtrykket kan kombineres med logiske operatorer efter behov, f.eks. hvis der skal være to betingelser der skal være opfyldt (&&) eller hvis bare én af
to betingelser skal være opfyldt (||).
- Else kan kombineres med if, se afsnitte herunder.
Else If
- Else if bruges hvis der skal være flere end to muligheder for afvikling af kode
- Hvis den første if ikke er true, skal programmet tjekke næste if
- Hvis ingen af if'erne er true afvikles koden i else til slut
Switch
- Som alternativ til if-strukturen kan du bruge switch i stedet. Den giver mulighed for at udføre forskellige
instruktioner afhængig af en variabels værdi.
- Man kan gøre det samme med en if/else if, mens switch er nemmere at arbejde med
- I selve switch-definitionen angives den variabel, som der skal testes på, og de forskellige muligheder angives som en case
- Hver case-blok er afsluttet med et break, og du kan vælge (det er ikke krævet) at afslutte med en default-blok, som afvikles såfremt intet andet i
switch-strukturen afvikles.
- Den eventuelt afsluttende default-blok skal ligeledes afsluttes med et break.
- Eksempel på brug af switch:
ITS side 23
- I switch kan følgende typer bruges:
- bool
- char
- string
- byte, short, int og long
- enumerations
While
- While kører i et loop
- Så længe betingelsen er "true", vil koden læses forfra, altså køre i loop
- Det er et boolean udtryk så der kan kun returneres én af de to typer, true eller false
- Loopet kører så længe while returnerer true
- While kan være tom, således løkken ikke brydes
^Så længe number er negativt inden løkken vil løkken ikke blive kørt.
ITS side 24
Do…while
- Kører først, og spørg bagefter
- En while kører så længe et udtryk i starten af strukturen er sandt
- En do kører så længe et udtryk i slutningen af strukturen er sand.
- "Do" køres først og derefter bliver der spurgt om betingelsen er "true" og om loopet derfor skal køres igen
- Generelt eksempel:
- Aktivitetsdiagram:
- Tilhørende kode:
- Uanset om number er positivt eller negativt inden løkken, vil løkken altid køre mindst én gang.
For
- For-løkken anvendes, når man ved, præcis hvor mange gange løkken skal gentages (antal gange
kan være en bruger indtastning)
- Den bruges typisk til at tælle op fra én værdi til en anden (eksempelvis fra 0 til 4)
- Man kan have så mange for-løkker inden i hinanden, som man vil
- I parentesen efter for-kodeordet angives tre elementer afskilt af et semikolon:
- "define counter" en tæller defineres, fortæller hvad type, hvilket navn og startværdi
- "loop condition", betingelsen der skal være opfyldt for at løkken kører
- "counter new value" tælleren gives en ny værdi
- Variablen/tælleren lever kun i selve løkken, og det gælder også ved løkker inde i løkken.
- En while der gør det samme som den ovenstående for kan skrives således:
initialization;
while (loopContinuationCondition)
{
statement;
increment;
}
ITS side 25
Foreach
- Løkken kan bruges til at løbe et array eller en samling af objekter igennem
- En foreach kører så længe, der er data i arrayet eller samlingen
- Løkkestrukturen fungerer ved, at der i parentesen først angives hvilken variabel, der skal bruges som ’iterationsvariabel’, som kan tilgås i løkken,
herefter in-kodeordet og sluttelig selve arrayet eller samlingen af objekter, f.eks.:
ITS side 26
KeyAvailable
Thursday, November 14, 2013 8:24 PM
Eksempler:
ITS side 27
ITS side 28
Komposition
Thursday, November 14, 2013 9:33 PM
- Hvis metoderne i en klasse A skal bruge metoderne i en anden klasse B, skal der være en relation (forbindelse) mellem
klasserne
- Der findes forskellige typer af relationer mellem klasser
- En af disse kaldes en komposition – den kaldes også en ”har en”-relation
- Eksempler:
- En Bil har en Motor – en Bil har en Gearkasse
- En Person har en Dato (f.eks. fødselsdag)
- En Journal har en Person (f.eks. patienten)
- Osv.
Constructor
- Default constructoren sætter atributterne til en default værdi
- Explicit constructor sætter atributterne til en specifik værdi for det specifikke objekt
ITS side 29
Set og get metoder
Main
ITS side 30
Arrays
Tuesday, November 05, 2013 8:23 AM
- Et array er en samling af variabler af samme type, som kan tilgås ved hjælp af et indeks, og som dermed gør det nemmere at
håndtere relaterede data.
- Man vil typisk i erklæringen angive, hvor mange elementer man ønsker i arrayet, f.eks.:
- Hvis du kender værdierne ved erklæring, kan du eventuelt både erklære og tildele værdier med en array med array initializer, f.eks.:
- Her har elementerne fået værdier (343, 2434, 1264 og 4), og størrelsen/længden/antallet af elementer defineres ud fra hvor
mange elementer der står i tuborgklammerne (i dette tilfælde 5)
- Her står der: Startværdien er 0, for kører så længe counteren er mindre end længden på arrayen, counteren lægger én til
værdien så længde for-løkken kører. array[counter] = 2 + 2 * counter sætter værdierne (se eventuelt "Kontrolstrukturer - For")
- En arrays pladser starter altid fra 0, dvs. hvis en array har en længde på 10 har den numrene 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.
ITS side 31
- Det kan også gennemløbes af foreach:
ITS side 32
Collections
Tuesday, November 19, 2013 11:16 AM
- Man skal angive typen ved oprettelse af objektet (<T> står for type)
- Alle efterfølgende kald til metoder og egenskaber modtager og returnerer objekter eller strukturer
af den konkrete type
Eller
ITS side 33
Remove Fjerner den første forekomst af den angivne værdi
RemoveAt Fjerner elementet i det angivne indeks
RemoveRange Fjerner et angivet antal af elementer som starter i det angivne indeks
Sort Sorterer listen
TrimExcess Sætter kapaciteten af listen til det antal af elementer listen indeholder (Count'et)
- Udskrivning eksempel:
- Contains eksempel:
List<string> items = new List<string> {"yellow","red"};
ITS side 34
int theSize = myList.Length; Int theSize = myList.Count;
Person p = persons[1]; Person p = persons[1];
bool isIn = false; bool isIn = false;
for (int i = 0; i < myList.Length; i++) for (int i = 0; i < myList.Count; i++)
{ {
if (b == myList[i]) if (b == myList[i])
isIn = true; isIn = true;
} }
ITS side 35
Arrays og List sammenligning
Tuesday, November 19, 2013 1:01 PM
Array List
String[ ] myList = new String[2]; List< string > myList = new List< sting >();
String a = "YAY!"; String a = "YAY!";
Person[ ] persons = new Person[45]; List< person > persons = new List< person >();
myList[0] = a; myList.Insert(0 , a);
String b = "Bummer"; String b = "Bummer";
myList[1] = b; myList.Insert(1 , b);
int theSize = myList.Length; Int theSize = myList.Capacity;
Person p = persons[1]; Person p = persons[1];
bool isIn = false; bool isIn = false;
for (int i = 0; i < myList.Length; i++) for (int i = 0; i < myList.Count; i++)
{ {
if (b == myList[i]) if (b == myList[i])
isIn = true; isIn = true;
} }
ITS side 36
NXT
Tuesday, September 10, 2013 8:39 AM
Instantiering af objekter:
- For at kunne anvende metoderne (funktionerne) i en klasse skal man først instantiere (oprette) et objekt
- F.eks. En bil skal bygges før man kan køre i den
○ Klasse: Designet af bilen, hvordan skal den se ud, hvad skal den kunne
○ Objekt (instans): Den byggede bil
○ Anvendelse af klassen metoder: At køre i bilen, bruge den funktioner (start motor, skift gear, drej rattet)
(Fordi den hedder Motor( Brick brick, char port ) som fortæller at første parameter skal være et brick-objekt – i det her eksempel
myBrick – og at anden parameter skal være en char – den char, der svarer til den port, som motoren er tilsluttet – i det her
tilfælde ´A´)
(Fordi den hedder TouchSensor( Brick brick, byte port ) som fortæller at første parameter skal være et brick-objekt – i det her
eksempel myBrick – og at anden parameter skal være en byte – den byte, der svarer til den port, som Touchsensoren er
tilsluttet – i det her tilfælde ´1´)
- Når man har et objekt af en klasse kan man kalde metoderne i klassen således:
- Hvis knappen trykkes eller IKKE (!) trykkes skal der ske noget:
ITS side 37
- Så længe der IKKE (!) er trykket på en knap:
- Eksempel:
ITS side 38
ITS side 39
NXT klasser
Tuesday, September 10, 2013 9:37 AM
class Brick:
class Motor
class LightBulb:
class TouchSensor
class LightSensor
ITS side 40
class SoundSensor
class UltrasonicSensor
ITS side 41
Touchsensor
Thursday, November 14, 2013 8:23 PM
(Fordi den hedder TouchSensor( Brick brick, byte port ) som fortæller at første parameter skal
være et brick-objekt – i det her eksempel myBrick – og at anden parameter skal være en
byte – den byte, der svarer til den port, som Touchsensoren er tilsluttet – i det her tilfælde ´1´)
- Når man har et objekt af en klasse kan man kalde metoderne i klassen således:
- Hvis knappen trykkes eller IKKE (!) trykkes skal der ske noget:
ITS side 42
- Så længe der IKKE (!) er trykket på touchsensoren:
- Eksempler:
ITS side 43
ITS side 44
ITS side 45
GUI
4. marts 2014 09:41
Controls og components
- Basis visuelle controls:
- Label
- Button
- TextBox
- Andre:
- RadioButton/CheckBox
- Trackbar
- ComboBox
- Timer (ikke visuel)
- Placeres på Form, der er det vindue, der vises på skærmen, når programmet kører
Properties
- Text
- Name
- Colors
- Font
- Enabled
- mm.
- Indstilling af properties kan ses i InitializeComponent() metoden i xxx.Designer.cs (partial class xxx,
autogeneres)
ITS side 46
Events
- Alle controls kan generere events, som en tilknyttet Eventhandler kan reagere p
- Default
- Button – Click event
- Label – Click event
- TextBox – TextChanged event
- Timer – Tick event
- RadioButton – CheckedChanged event
- CheckBox - CheckedChanged event
- TrackBar – Scroll event
- ComboBox – SelectedIndexChanged event
ITS side 47
Eventhandler
- Eksempler:
private void label1_Click(object sender, EventArgs e)
{}
private void textBox1_TextChanged(object sender, EventArgs e)
{}
private void radioButton1_CheckedChanged(object sender, EventArgs e)
{}
private void trackBar1_Scroll(object sender, EventArgs e)
{}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{}
- Indhold af eventhandler metoderne kan findes i xxx.cs (partial class xxx, 2. del)
Delegate
- Eksempel
ITS side 48
Komponenter
10. marts 2014 16:37
ListBox
- Samling af elementer (repræsenteret som tekst) i én komponent
- Default event: SelectedIndexChanged
- Eksempel (ListBoxProject):
ComboBox
- Komponent der kombinerer en textBox med en drop-down liste
- Default event: SelectedIndexChanged
- DropDownStyle:
- Simple – valg vises hele tiden med mulighed for selv at skrive
- DropDown – drop-down med mulighed for selv at skrive
- DropDownList – drop-down uden mulighed for selv at skrive
Chart
- Grafisk visning af data
- Typer
- Kurve
- Lagkagediagram
- Søjlediagram
- Punkter
- Se mere på: http://archive.msdn.microsoft.com/mschart/Release/ProjectReleases.aspx?ReleaseId=4418
ITS side 49
2. semester
8. oktober 2014 13:54
ITS side 50
Debugging
Tuesday, February 11, 2014 8:07 AM
Debugger
- Værktøj til
- Fejlretning
- Forståelse af et programs funktion
- En software fejl kaldes en ”bug”,
- heraf navnet de-bugger
- Fjerne bugs = fjerne fejl
- Debugger er ofte indbygget i IDE
Fejltyper
- Syntaks fejl – findes af compiler
- manglende tegn ; ( ) { }
- stavefejl i metode- eller variabel- navne
- forkerte typer eller antal på parametre
- Logiske fejl – forståelses fejl
- fejlberegninger
- forkert brug af metoder
- Run-time fejl – opstår under afvikling af program
- hændelser opstår i en uventet rækkefølge
Funktioner i VS debugger
ITS side 51
3-lags model
11. marts 2014 08:17
- Opdeling i lag er en måde at designe software på, der gør det lettere at ændre i et lag uden at det får
indflydelse på de andre lag
- Lag:
1. GUI
2. Logik
3. Data
- Kalder metoder ned igennem lagene
- Får oplysninger tilbage via returns
- Man kan ikke springe lag over eller gå baglæns, GUI laget kender kun til logiklaget (og ikke
datalaget), logiklaget kender kun til datalaget (og ikke til GUI laget) og datalaget har ikke
adgang til nogle lag
- Ansvar/funktionalitet og grænseflade defineres for hvert lag.
- Anvendes i:
- Client-Server applikationer
- Web applikationer
- Kommunikationsprotokoller
Lagdeling
Fordele
- Klare grænseflader og ansvarsfordeling
- Større ydeevne
- Skalerbar
- Flexibel
- Genbrug
- Lettere vedligehold
ITS side 52
- Lettere vedligehold
- Lettere samarbejde
Ulemper
- Grænseflader skal defineres/dokumenteres og overholdes
- Ændringer i grænsefladerne kræver kommunikation/dokumnetation
Eksempler
ITS side 53
Database
17. marts 2014 19:43
Database skema
Bibliotek
- Bøger
- Lånere
- Udlån
Skema (struktur)
- Tabel med kolonner
- Data typer
- Evt. begrænsninger
- Data (facts)
Database brugertyper
- Slutbruger, der bruger query language (F.eks. SQL) eller dedikeret applikation til at hente data fra DB
- Programmør, der har adgang til DB via et højniveau sprog, som f.eks. Java eller C#
- Applikations udvikler
- Database designer
- Database administrator (DBA), der kontrollerer alle operationer på DB
ITS side 54
Fordele ved databaser
- Reducerer dublering af data
- Bedre mulighed for at dele data
- System til at sikre data mod misbrug
- System til at sikre data integritet
- Forbedre produktivitet for programmører og slutbrugere i udvikling og vedligehold af applikationer
- Evne til at bruge data som en organisationsressource
Begrænsninger
- Udgifter til erhvervelse af databaseprogram
- Udgifter til træning af brugere
- Noget overhead på rutine opgaver
- Risiko for større datatab ved systemfejl
- Bruger modstand mod tab af kontrol af data
CREATE TABLE
CREATE TABLE tabelnavn (
kollonnenavn type optionalinfo,
kollonnenavn type optionalinfo,
kollonnenavn type optionalinfo,
optionalinfo
);
Eksempel
Create table Udlån(
Dato DateTime Primary Key,
ISBN nVarChar Foreign Key References Bøger(ISBN),
LånerNr int Foreign Key References Låner(LånerNr)
);
Colum types
- INT - heltal
- REAL - decimaltal
- DECIMAL(n,m) – decimaltal med op til n cifre og op til m cifre efter komma
- nVARCHAR – text (Unicode) med variabel længde
- nCHAR(n) – text (Unicode) med længden n, hvis kortere tilføjes spaces efter
- DATETIME – dato på formatet år/måned/dag (2011 apr 5)
http://www.w3schools.com/sql/sql_datatypes.asp
Optional info
- PRIMARY KEY – definerer denne kolonne som nøgle
- FOREIGN KEY REFERENCES tabel(kolonne) – fremmed nøgle, der refererer til specificeret tabel og
nøgle
- NOT NULL – Kolonnen SKAL have en værdi
- Efter definition af kolonner:
- PRIMARY KEY(kolonne1, kolonne2) – bruges ved sammensatte nøgler
- FOREIGN KEY(kolonne1, kolonne2) REFERENCES andentabel – bruges ved fremmednøgle der
ITS side 55
- FOREIGN KEY(kolonne1, kolonne2) REFERENCES andentabel – bruges ved fremmednøgle der
refererer til tabel med sammensat nøgle
Eksempel
Det er i de tabeller hvor der er begrænsninger på antallet der skal være referencer til FOREIGN KEYS
og referencen refererer altid til den PRIMARY KEY i den tabel der refereres til
DROP/ALTER TABLE
DROP TABLE tabelnavn
- En tabel kan ikke slettes, hvis den refererer til en eksisterende tabel.
ALTER TABLE
- Tillades i flere DBMS efter konstruktion af tabel
- Eks.
○ ALTER TABLE tabelnavn ADD kolonnenavn type;
○ Der tilføjer en ekstra kolonne til tabellen
INSERT
INSERT INTO tabelnavn [kolonneliste] VALUES (værdiliste);
- Kolonnelisten er optional, hvis alle kolonner gives en værdi, men det er altid en god idé at angive
kolonnerne, de man derved undgår problemer med at data placeres i forkerte kolonner eller at der
opstår en fejl i statementet, hvis tabellen ændres senere i DB’s levetid.
ITS side 56
INSERT INTO Vægt(Serienummer, Fabrikant) VALUES ('8-4378', '');
INSERT INTO Måling(Tidsstempel, Værdi, Patient_ID, Vægt) VALUES ('7 Apr 2010', 103, 100,
'8-4378');
INSERT INTO Måling(Tidsstempel, Værdi, Patient_ID, Vægt) VALUES ('6 Jan 2011', 47, 101, '123-45');
INSERT INTO Måling(Tidsstempel, Værdi, Patient_ID, Vægt) VALUES ('7 Apr 2011', 125, 100,
'123-45');
DELETE
DELETE FROM tabelnavn [WHERE betingelse];
- Hvis der ikke angives en WHERE betingelse, slettes alle rækker i tabellen
- WHERE kan vælge specielle rækker ud, så det f.eks. kun er personer med et bestemt navn, der
slettes
- DELETE FROM ansatte WHERE navn = ‘Ole Olsen’
UPDATE
UPDATE tabelnavn SET kolonnenavn = værdi, {kolonnenavn = værdi}
[WHERE betingelse]
- F.eks i en løntabel hvor alle, evt. med en bestemt løn, skal have lønforhøjelse
UPDATE løntabel SET løn = løn * 1.1;
SELECT
SELECT kolonne[liste]
FROM tabelnavn
[ betingelser] -- Filter
[GROUP BY kolonneliste -- Gruppering
[HAVING betingelser]] -- minus uønskede grupper
[ORDER BY kolonneliste [DESC]] – sortering af rækker
SELECT * FROM tabelnavn, giver alle kolonner i tabellen
Wildcard (KUN for strings, hvis det var tal skal der bruges ><):
- - én karakter, f.eks. Postnummer '86--'
- % flere karaterer, f.eks. Postnummer '86%', navn '%Olsen%'
SELECT navn
FROM Person
[WHERE navn LIKE '%Olsen%']
Eksempel på Database
ITS side 57
http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=23654
SELECT eksempel
SELECT CompanyName, ProductName, OrderDate
FROM [Order Details] INNER JOIN Orders
ON [Order Details].OrderID =Orders.OrderID
INNER JOIN Products
ON [Order Details].ProductID = Products.ProductID
INNER JOIN Customers
ON Orders.CustomerID = Customers.CustomerID
WHERE (Orders.OrderDate >= '1 Jan 1997') AND (Orders.OrderDate <= '31 Mar 1997')
Aggregate funktioner
- AVERAGE – avg(kolonnenavn)
- Gennemsnit af værdier i en kolonne
- SUM – sum(kolonnenavn)
- Sum af værdier i en kolonne
- MAX – max(kolonnenavn)
- Højeste værdi i kolonne med kolonnenavn
- MIN – min(kolonnenavn)
- Laveste værdi i kolonne med kolonnenavn
- COUNT – count(kolonnenavn)
- Tæller antal rækker, der er forskellig fra null i kolonnen
- COUNT DISTINCT – count(DISTINCT kolonnenavn)
- Antal forskellige rækker
ITS side 58
Opgaver
25. marts 2014 09:31
Opgave 1
Antag tabellerne Patient, Maaling og Vaegt er oprettet
Indsæt værdier i tabellerne.
- Opretter tabellerne:
CREATE TABLE Patient(
Patient_ID INT PRIMARY KEY,
Navn nVARCHAR NOT NULL
);
INSERT INTO Måling(Tidsstempel, Værdi, Patient_ID, Vægt) VALUES ('7 Apr 2010', 103, 100,
'8-4378');
INSERT INTO Måling(Tidsstempel, Værdi, Patient_ID, Vægt) VALUES ('6 Jan 2011', 47, 101, '123-45');
INSERT INTO Måling(Tidsstempel, Værdi, Patient_ID, Vægt) VALUES ('7 Apr 2011', 125, 100,
ITS side 59
INSERT INTO Måling(Tidsstempel, Værdi, Patient_ID, Vægt) VALUES ('7 Apr 2011', 125, 100,
'123-45');
Opgave 2
a) Find personer, der vejer mere end 100 kg:
SELECT Patient.navn, Måling.værdi, Patient.Patient_ID, Måling.Patient_ID
FROM Patient, Måling
WHERE (Værdi > 100 and Patient.Patient_ID=Måling.Patient_ID);
Opgave 3
a) Find den højeste vægt i Maalinger
SELECT max(Værdi)
FROM Måling
5) SELECT count(employee.empno)
FROM employee, jobhistory
WHERE jobhistory.position = 'Analyst Programmer' and jobhistory.ENDDATE is NULL and
employee.empno = jobhistory.empno
ITS side 60
Man/Machine Interface (MMI)
24. februar 2014 15:23
Feedback to user
- Feedback telling the user that the command has been understood
- The ideal form of feedback is allowing the user to see things happen
- If a device gives no feedback then the user will assume that the command has not been received and
accepted.
- Response times should be predictable and preferably small.
- If a system cannot respond immediately to a command, then there should be an indication that the
system has received the command and is working on it.
- The strength of a feedback should reflect the importance of the situation.
Predictability
- When modes are unavoidable then the mode should be displayed in a very conspicuous way on both
keyboard and screen, for example by giving the cursor a different shape or color.
Transparency
- Transparency means that the user can easily find out what is going on behind the surface.
- A mechanical device may simply be designed so that the movements of important parts are visible or
it may have a control panel showing the state of its internal parts in an intuitively understandable
way.
- In electronic devices there may not be any mechanical parts to show, so the state of internal actions
must be visualized with text or drawings.
- It should be clear where a program stores its files so that the user can make backup copies or delete
old files for security reasons.
Error tolerance
- Ideally, computers should be error tolerant
- There is a problem when you make the computer guess what the user wants, and the computer's
guess is wrong.
- The system should never correct what it thinks is an error without confirmation from the user.
WYSIWYG
ITS side 61
WYSIWYG
- What You See Is What You Get
- It means that when you write or draw something in a computer program, then the screen should
look exactly as the final document will look when you print it out.
- Ideal: A WYSIWYG view and a view of the underlying codes or formulas in any software program that
can make a visual end product.
- The two views should be shown side by side so that you can focus on a detail in the WYSIWYG
windows that looks wrong and then see in the code window why it is wrong and modify the codes to
make it right.
- Whenever you make a change in one of these windows, this change should be reflected immediately
in the other window.
Design should reflect the user's logic, not the constructor's logic
- The design should reflect the user's logic, not the constructor's logic
- Generally speaking, operations that represent different working situations to the user should be
kept in different parts of the user interface.
- Example: From the programmer's point of view, deleting a row and deleting a column are equivalent
operations. But from the user's point of view they are fundamentally different.
ITS side 62
- The best guidance may be a self-explaining design that shows what the apparatus can do
- In the case of software, the most popular form of self-explaining design is a menu.
- A hierarchical menu should preferably not have more than 4 - 5 levels.
- Help facilities
- A button or menu that gives access to help instructions should be visible everywhere in the
program. There should be search facilities so that the user can search for help on a particular
topic.
- Context help
- A facility that gives instructions about the specific part of the program that the user is in or a
specific object that the user is pointing at.
- Fool-proof
- Useless or dangerous combinations of commands should be prevented or organized so that
they cannot be done by mistake.
- Ask for confirmation
- The program should ask the user for confirmation before carrying out a command that has far-
reaching consequences or cannot be undone.
- Regret
- There should be Cancel and Undo facilities to allow the user to regret his actions.
- Therefore, there should be shortcut keys for all common commands.
- Some systems allow the user to modify the system to suit his needs. This is called customization.
Standardization
- If you design a control panel or other hardware user interface, be sure to check if there is a standard
or common practice for the colors, shapes, and placements of buttons etc.
- The same applies to software user interfaces. Consistency is important within a system as well as
between systems.
Open standards
- Secret factory standard
- The product is intended to be compatible only with other products from the same company.
Competing companies need to hack or reverse-engineer these products in order to make
something compatible. An example is the format for Microsoft Word documents.
- Proprietary standard
- The standard is owned by a company and protected by patents or copyright restrictions. Other
companies must pay a license fee for making compatible products. Example: the Postscript
printer file format.
- De facto standard
- A de facto standard develops when various companies tend to make their products compatible
with existing products from other companies. There is no official agreement, but neither is
there any attempt to protect the schemes by secrets, patents or copyrights. Example: Hewlett-
Packard Printer Control Language for laser printers.
- Official standard
- The standard is endorsed and maintained by an official organization. All technical details are
specified exactly and published. Example: the HTTP protocol and the HTML language for the
World Wide Web.
- Open source
- A software product is developed by volunteers and the software as well as the complete
source code is made public without severe copyright restrictions. Anybody can improve or
modify the product and anybody can make compatible products. Example: The Linux operating
system.
ITS side 63
Filer
29. april 2014 08:18
- Filer:
- En mængde 0 og 1 taller, der opbevares i en computers hukommelse.
- Hvad indholdet af filen repræsenterer afhænger af hvad den bruges til.
File/Directory class
- Undersøg hvilke informationer klasserne File og Directory kan give om en fil eller en mappe.
- Eksempler:
- Hvornår er filen/directory oprettet?
○ GetCreationTime()
- Hvornår er sidst sket ændringer i filen/directory?
○ GetLastWriteTime()
- Eksisterer filen/directory?
○ Exists()
- Opret en textfil
○ CreateText()
- Opret en mappe
○ CreateDirectory()
- Hvilke filer indeholder mappen?
○ GetFiles()
- Hvilke undermapper indeholder mappen?
○ GetDirectories()
Test mappe
Resultat - LINQToFileDirectory
C:\Mine Dokumenter\Undervisning\F14\ST2ITS2\Eksempler\Test
ITS side 64
Write to a file
- Open file with write access
FileStream output = new FileStream( fileName, FileMode.OpenOrCreate,FileAccess.Write );
- Sets file to where data is written
StreamWriter fileWriter = new StreamWriter( output );
- Write Record to file, fields separated by commas (evt. med en while hvis der er mange data)
fileWriter.WriteLine(record.Account + "," + record.FirstName + "," + record.LastName + "," +
record.Balance );
- Close StreamWriter and underlying file
fileWriter.Close();
- Pak ind i try-catch da der kan opstå IOException (Fordi der kan opstå noget uforudset)
_______________________________________________
ITS side 65
Read from a file
- Open file with read access
FileStream input = new FileStream( fileName, FileMode.Open, FileAccess.Read );
- Sets file from where data is read
StreamReader fileReader = new StreamReader( input );
- Read record
string inputRecord = fileReader.ReadLine();
string[] inputFields;
inputFields = inputRecord.Split( ',' );
- Close StreamReader and underlying file
fileReader.Close();
- Pak ind i try-catch da der kan opstå IOException
_______________________________________________
ITS side 66
Serialization
- Konvertere et objekt til en sekvens af bytes
- Gemmes med serialization
- Hentes med deserialization
- De benyttede objekter (klasser) skal have attributten [serializable] eller implementere interface
Iserializable.
- Simple typer, strings og arrays er serializable
- Ved referencetyper skal disse også være serializable for at blive gemt.
FileMode
ITS side 67
FileAccess
Opgave
- Implementer en applikation, der kan oprette og tilføje Patienter til en fil (Patienter.dat). Patienterne
skal kunne referere til nogle målinger.
- Indholdet af filen skal til enhver tid kunne indlæses og vises i applikationen.
ITS side 68
Arv
6. maj 2014 08:18
- ^Her ville man skulle skrive det samme stykke kode flere gange
ITS side 69
- ^Her er lavet en generel klasse med de fælles attributter og metoder
- Her har Truck og Car klassen både egenskaberne der er defineret i Vehicle OG egenskaberne der er defineret i deres "egen" klasse
- Klassen vi arver fra skal stå efter klassen som :Arvklasse, eksempel:
public class Car : Vehicle
{
…
}
Arv
- En klasse beskriver struktur og egenskaber for en samling af objekter.
- Ved arv tilpasses eksisterende klasser til nye anvendelser ved at udvide
- Struktur (flere medlemsdata)
- Egenskaber (flere metoder)
- Is-a relation (komposition er as-a)
- B is an A, men A is NOT a B
- Bil er et køretøj, men et køretøj er ikke (nødvendigvis) en bil
Opgave
- Tegn er arve hierarki for følgende elementer: æble, is, brød, frugt, korn, appelsin, dessert, chokolade mousse, baguette:
ITS side 70
- Tegn et arve hierarki for personer på skolen (1.– 7. semester studerende, hjælpelærer, adjunkter, lektorer, docenter, kontorpersonale mv.)
ITS side 71
Objekdiagram ved arv
ITS side 72
Polymorfi
15. maj 2014 08:20
- Eksempler:
Car c = new Car();
Truck t = new Truck();
Vehicle v = c; // OK, Vehicle er basis klasse for Car
v = t; // OK, Vehicle er basis klasse for Truck
c = t; // Ikke OK, Car og Truck deler nogle egenskaber, men ikke alle
s1 = p1; //Ikke OK
s1 = p2; // Ikke OK
p1 = s1; //OK
t1 = s1; //Ikke OK
s1 = phd1; //OK
phd1 = s1; //Ikke OK
Metode polymorfi
ITS side 73
- Drawmetoden i shape kan ikke implementeres da den ikke kender shapen
- Hvis én metode i en klasse er abstract er hele klassen abstract
abstract void draw(); // metode i Shape
=>
static abstract class Shape {
- Når en klasse er abstract kan man ikke inistiantere et objekt af den klasse
- Man har denne klasse for at kunne kalde metoderne fra shape på de tre andre klasser, men man kan ikke
oprette et objekt som kun er af klassen shape
- Ved at der er metoden "draw" i alle klasser tvinger man de afledte klasser til at have metoden og til at kunne
kalde "draw" metoden på alle objekter på samme tid, hvis draw ikke fandtes i shape, ville man skulle kalde de
specifikke draw metoder på hvert objekt:
- Collection of Shapes, hvorfra alle figurer ønskes tegnet
List<Shape> shapes = new List<Shape>();
// tilføje figurer til samlingen
shapes.Add(new Circle(10,10,20));
shapes.Add(new Rectangle(0,20,20,5));
shapes.Add(new Triangle(0,0,20));
foreach (Shape s in shapes)
{
s.draw();
}
- For at kunne trække objekter ud af listen skal man trækker objekter af basisklassen ud
Abstract
- Hvis vi har en metode i basisklassen, men ikke kender alle informationer til at kunne skrive denne metode,
laver vi den abstract så vi tvinger de afledte klasser til at have denne metode.
- Hvis mindst én metode i en klasse er abstract (dvs. ikke implementeret), skal klassen erklæres abstract
- Der kan ikke instansieres objecter af abstracte klasser
- Anvendelse:
- Når bestemt funktionalitet ønskes af afledte klasser, men denne ikke kan implementeres i basis klassen,
pga. manglende oplysninger
ITS side 74
pga. manglende oplysninger
- Template mønsteret er et eksempel
- Man kan godt oprette collections eller arrays med en abstract klasse, men man kan ikke oprette objekter heraf
Mønstre
- Et mønster er et dokumenteret løsningsforslag til software design problemstillinger, som ofte forekommer.
- Løsningsforslaget er gennemprøvet.
- Disse findes der mange af indenfor SW udvikling
- Eks.
- Singleton er et designmønster som har til formål at sikre, at der højst kan laves én instans af en bestemt
klasse
- Observer er et designmønster, der mindsker koblingen mellem en afsender klasse og en modtager
klasse, ved at give modtageren besked, når der sker noget interessant for modtagerklassen i
afsenderklassen.
- Template method mønstret beskriver hvordan gentagne opgaver kan opdeles i en applikations afhængig
og en applikations uafhængig del.
Template
- Et eksempel på hvordan man bruger polymorfi
- Adskille applikationsspecifikt kode fra ikke applikationsspecifikt kode.
- To klasser en applikationsspecifik og en ikke applikationsspecifik
- I den ikke applikationsspecifikt vil der være en template metode som specificerer rækkenfølgen for hvordan de
applikationsspecifikke metode skal kaldes.
- Der vil ligeledes være abstract metoder som templaten kalder
- I den applikationsspecifikke klasse skal de abstracte metode implementeres
- Det er playOneGame() der er template (i øvelsen KrydsOgBolle)
- Et mønster er et dokumenteret løsningsforslag til software design problemstillinger, som ofte forekommer.
- Løsningsforslaget er gennemprøvet.
- Disse findes der mange af indenfor SW udvikling
- Eks.
- Singleton er et designmønster som har til formål at sikre, at der højst kan laves én instans af en bestemt
klasse
- Observer er et designmønster, der mindsker koblingen mellem en afsender klasse og en modtager
klasse, ved at give modtageren besked, når der sker noget interessant for modtagerklassen i
afsenderklassen.
- Template method mønstret beskriver hvordan gentagne opgaver kan opdeles i en applikations afhængig
og en applikations uafhængig del.
ITS side 75
Eksempel
Medicinregulering
Interface
- Et interface er en ren abstract klasse
- Defineres med nøgleordet interface, navngives med Ixxxx
- Alle metoder erklæres med signatur, men uden implementering (access specifier og abstract udelades,
da alle metoder er public abstract implicit)
- Der er aldrig konstruktører i et interface, da et interface ikke kan instancieres.
- Et interface definerer en type, som kan bruges ved kald af de metoder interfacet definerer.
- At en klasse implementerer et interface angives på samme måde som arv, dog efter explicit arv fra basis
klasse.
- En klasse kan implementere flere interfaces.
ITS side 76
- En klasse kan implementere flere interfaces.
- Eksempel:
ITS side 77
3. semester
8. oktober 2014 13:54
ITS side 78
Tråde
2. september 2014 08:13
- Når de deles om en CPU bruges der algoritmer der bestemmer i hvilken rigtig rækkefølge de forskellige tasks
skal udføres i.
- OBS! Forkerte firkanter på figuren, de overlapper i virkeligheden IKKE hinanden
Multiple Threads
- Formål/fordele:
- MultiThreading gør programmer mere responsive og interaktiv
- Forøger udnyttelsesgraden/performance af systemet (eks. i et tekstbehandlingsprogram er det muligt,
at skrive, samtidig med at der udskrives til en printer)
- Mange programmeringssprog indeholder faciliteter til at oprette tråde, og låsemekanismer til at undgå
konflikter i forbindelse med anvendelse af fælles ressourcer
- Operativsystemet er ansvarlig for scheduling og allokering af ressourcer til trådene
- Hvis man vil vente på at nogle tråde bliver færdige, hvis man f.eks. Skal bruge resultaterne fra disse, kan man
bruge join:
ITS side 79
- Når join f.eks. står i main, vil main ikke fortsætte med at udføre handlinger før den tråd der er joinet er
kørt færdig.
- Trådens kode bliver først afviklet når der kaldes en start-metode på objektet
- Der kan kun være én tråd i runable af gangen når der kun bruges én CPU
- Når der er en anden tråd der skal være runable og dermed bruge CPU'en sættes den nuværende tråd
over i blocked
- Ved brug af sleep frigives CPU'en frivilligt, altså man kan skemalægge hvordan CPU'en bruges.
- Når tråden ender kan den ikke bruges igen (dead)
Oprettelse af tråd i C#
- Trådmetode uden parametre:
Eksempel
- Der er to tråde, den ene er main:
Eksempel
static void Main(string[] args)
ITS side 80
static void Main(string[] args)
{
for (int i = 0; i < 8; i++)
{
Thread t = new Thread(ThreadMethod);
t.Start(i);
}
}
Lambda expression:
- En lambda metode er en anonym
metode.
- En anonym metode er, som navnet
antyder, en metode uden et konkret
navn, som dermed ikke kan kaldes på
traditionel vis.
- Kald til metoden kræver, at man kender
- Trådmetode med parametre (lambda expression)
metodens adresse i hukommelsen og
- Kan bruges ved instans metoder
dens signatur (Delegate).
Thread t = new Thread(() => ThreadMethod(i)); - Brugen af => operatoren ’sender’
t.Start(); argumenterne ind til brug i metoden.
- Anonyme metoder og lambda-udtryk kan
static void ThreadMethod(object threadID) være enormt effektive, fordi de giver
{
mulighed for at arbejde med
…
} dynamiske metoder.
Eksempel
Servicetråd
- Nogle tråde har til opgave at servicere andre tråde
- Disse stopper med at køre, når der ikke er flere andre aktive tråde
- Dette skal skrives efter at tråden er erklæret
- C#: Foreground/Background
Eksempel
static void Main(string[] args)
{
for (int i = 0; i < 8; i++)
{
Thread t = new Thread(ThreadMethod);
t.IsBackground = true;
t.Start(i);
}
Console.WriteLine("Leaving Main");
}
ITS side 81
static void ThreadMethod(object threadID)
{
while (true)
{
Console.WriteLine("Hello world: " + threadID);
}
}
Prioriteter
- Prioriteter er med til at bestemme, hvor meget CPU tid en tråd tildeles
- Dette skal skrives efter at tråden er erklæret
- C#:
- Lowest
- BelowNormal
- Normal
- AboveNormal
- Highest
ITS side 82
Synkronisering
23. september 2014 08:18
- Tænk på tråde som børn, så længe der kun er ét barn i en familie er der aldrig nogle der slås om legetøjet
- Synkronisering problemer opstår når flere tråde både læser og skriver til f.eks. en variable.
- Det er ikke et problem hvis der kun skal læses.
Problematikker
- Instansmetoder er ikke sikre imod tråd synkronisering! (men klassemetoder er)
Lost update
- To forskellige tråde der arbejder på det samme data.
- Den ene tråd skal lægge 100 til en variabel og den anden skal trække 50 fra den samme variable hvilket kan
gå galt når der læses og tilskrives til denne variable i de to tråde på samme tid.
- Dette kan tilsammen både resultere i 100, 150, 200 og 50 - den kan ikke forudse resultatet
- De to tråde udfører deres statements i CPU'en hvor de kan ende med at overskrive hinanden fordi de har
misset en update.
- Det tager tid (dog ikke ret lang tid) for et program at læse og skrive til instanser.
- T1 indlæser data fra en instans x, her er x=0
- Herefter afbrydes T1 af T2 som også indlæser data x, her er x ligeledes lig 0 da der ikke er skrevet
nogen ny værdi til x.
- T2 fortsætter med sin udregning hvor x i T2 nu er -50.
- T2 tilskriver den nye værdi til instansen hvorfor x i programmet nu er -50.
- Nu afbrydes T2 af T1 som fortsætter hvor den slap, i T1 er x altså lig 0, da x allerede er indlæst.
- T1 fortsætter med sin udregning hvor x i T1 nu er 100.
- T1 tilskriver den nye værdi til instansen hvorfor x i programmet nu er 100.
- x = -50 fra T2 overskives altså af x= 100 fra T1 da T1 ikke har fået den opdatering T2 har lavet af x
med, da x allerede var indlæst i T1 før udaten.
- Dette er hovedproblemet i lost update.
- Dette vil man undgå ved at sørge for at når én tråd arbejder på en variable er der ikke andre tråde der kan
tilgå den.
- Man vil gøre de kritiske regioner (der hvor den omtalte variable enten læses eller skrives til, i det kode der
kan tilgås af forskellige tråde) så små som mulige.
- En af måderne at undgå lost update er ved brug af lock.
Producer/Consumer
- Producer (tilføjer):
- Add element to buffer
- Consumer (fjerner):
- Remove element from bufffer
ITS side 83
- Producer og consumer henholdsvis tilføjer og fjerne noget på samme tid fra bufferen
Der kan ske en fejl hvis consumeren prøver at fjerne noget fra en tom buffer
Der kan ske en fejl hvis de prøver at fjerne og tilføje noget på samme plads på samme tid
Der kan ske en fejl hvis produceren prøver at tilføje noget til en fuld buffer
Der kan ske en fejl hvis flere consumere prøver at fjerne noget på samme plads på samme tid
- En lock kan hjælpe på problemet hvis flere consumere (tråde) prøver at fjerne noget på den samme plads
på samme tid.
- Locken kan sættes omkring det kode hvor der fjernes noget så det kun er én tråd der kan tilgå dette på en
gang.
- Dette problem kan også løses med semaphore
ITS side 84
while (1)
{
think(n);
grab_forks(n);
eat(n);
return_forks(n);
}
Opdatering af GUI
- Invoke(…) – synkront kald
- Returnerer først, når jobbet er udført
- BeginInvoke(…) – asynkront kald
- Returnerer straks
- Anbefales pga mindre deadlock risiko
if (label1.InvokeRequired)
{
label1.BeginInvoke(new System.EventHandler(UpdateUI), pList);
}
else
{
UpdateUI(this, System.EventArgs.Empty);
}
ITS side 85
Låse/Semaphore
8. oktober 2014 17:51
Låse
- Låse skal bruges til at sikre den kritiske region (den kritiske region er alle steder hvor der skal bruges
et objekt der kan bruges af flere tråde).
- Kan låse et objekt når en tråd bruger den så en anden tråd ikke kan bruge det.
- C# har 2 låse:
- Lock
- Mutex
Lock
- Hurtig (20 ns)
- Kræver objekt at låse på:
- Ved lock pakker man sin kritiske region ind i en lock, der tjekker om objectet (myLock) er aktiveret.
Hvis den ikke er det kan koden tilgås, hvis den er det kan koden ikke tilgås:
lock(myLock)
{
//Kritisk region
}
- I dette vil der ske et problem da TheWeirdGuy ikke overholder locken som er på RegularUsers.
- Der skal altså også være en lock på stall i TheWeirdGuy metoden.
Mutex
ITS side 86
Mutex
- Spredes over flere processer
- Langsommere end Lock (1000 ns).
- Kan bruges både med og uden parametre (false betyder at "låsen" er fri, det andet er et navn man
kan bruge som reference):
- Der kan sættes en timeout på det metodekald der starter mutex-låsen samt hvad exit konteksten
skal være:
- Eksempel:
static void Main()
{
// Naming a Mutex makes it available computer-wide. Use a name that's
// unique to your company and application (e.g., include your URL).
Semaphore
- A semaphore is like a nightclub: it has a certain capacity, enforced by a bouncer. Once it’s full, no
more people can enter, and a queue builds up outside. Then, for each person that leaves, one
person enters from the head of the queue. The constructor requires a minimum of two arguments:
the number of places currently available in the nightclub and the club’s total capacity.
- Det eneste låse gør er at sørge for at der ikke er to tråde der kan tilgå én kritisk region på samme tid.
- Semaphore kan løse flere problemer end låsene.
- F.eks. sørge for at én tråd udføres før en anden.
- Semaphore er på et højere niveau end låse
ITS side 87
○ wait(semaphore)
○ Tæller ned
○ Hvis tælleren er 0 blokeres der indtil der gives signal
- Hvis tællerværdien er 1 har semaphoren samme funktion som lock/Mutex (binær semaphor):
- Første kald til wait() går igennem
○ Semaphore værdi går fra 1 til 0
- Andet kald til wait() blokerer
○ Semaphore værdi forbliver 0, tråden venter
- Første tråd kalder signal()
○ Sempahor værdien forbliver 0
○ Vækker den anden tråd
- Den anden tråd kalder signal()
○ Semaphore værdi går fra 0 til 1
○ Den næste der kalder wait() vil IKKE vente
- Hvis tællerværdien er > 1 tillades tællerværdiens antal adgang til den kritiske region før der låses
(counting semaphor)
ITS side 88
Synkroniserings problem (detaljer)
23. september 2014 08:39
- Eksempel:
- Hvis program counteren står på 10, så viser den at det er adresse 10 i hukommelsen der skal læses.
Dette gør RAM counteren hvorefter program counteren tæller en op og står nu til 11
MEM (Hukommelse)
… IR (statement fra ADD a,100
hukommelsen læses)
10 MOV a,x
PC (program counter) 12
11 ADD a,100
12 MOV x,a
a (a-værdi som lægges i 50
13 NOP (der sker intet) ALU'en)
14 NOP (der sker intet)
15 (x-værdien)
IR er den nuværende statement, den
… er altså tidsafhængig.
25 MOV a,x
PC angiver hvilken adresse det næste
26 SUB a, 50
der skal indlæses ligger på
27 MOV x,a
PC og a i trådende angiver hvor den
forskellige tråde er nået til
Tråd 1 Tråd 2
PC 12 PC 27
a 100 a 50
- F.eks. Tråd 1 kan køre et stykke tid og nå til at denne netop skal til at udføre regnestykket, men den kører
ikke videre, derimod kører tråd 2 et stykke tid og bliver færdig med dens regnestykke og når til et resultat
der hedder at x = 200. Så kører tråd 1 videre og når til et resultat at for dennes tråd og regnestykke er x = 50.
Nu vil der opstå en konflikt hvor tråd 1 som blev færdig sidst overskriver resultatet fra tråd 2, altså ender
resultatet med at blive x = 50, hvor bidraget fra tråd 2 ikke er repræsenteret.
ITS side 89
Mønstre
30. september 2014 08:16
Hvorfor?
- Det er en løsning på et tilbagevendende problem
- Kendt, veldokumenteret og afprøvet løsning på et problem
- Vi vil gerne kunne kommunikere med andre IT fagpersoner
- Man ved hvad navnet på et mønster indebærer
- Vi vil gerne have systemer, der er lettere at vedligeholde og udvide over tid
- Vi ved hvordan koden er sat op når vi bruger mønstre
- Derfor tænke i SOLID principper:
- S, Single responsibility
○ Sørger for at klasserne kun har ét ansvar.
- O, Open-closed
○ Åbne for udvidelser, men lukket for ændringer.
○ Man skal kunne udvide, men denne udvidelse må ikke få applikationen til ikke at
fungere.
- L, Liskov substitution
○ Hænger sammen med arv, man skal kunne erstattet med et objekt med objekter af
subklasserne uden at der sker noget uforudset, uden betydning for funktionen af vore
applikation).
- I, Interface segregation
○ Afkoble systemet så meget som muligt.
○ Hellere mange små interfaces.
○ Når man har mange små interfaces kan man designe applikationen præcis som man vil.
- D, Dependency inversion
○ Høj niveau moduler på ikke være afhængige af lav niveau moduler (moduler f.eks.
klasser).
Single responsability
- Princip:
- Et objekt bør kun have ét ansvar og dette ansvar bør være indkapslet i klassen.
- Der bør aldrig være mere end en årsag til at en klasse skal ændres.
- Ved at bruge dette princip overholder man design princippet med lav kobling og høj samhørighed.
ITS side 90
- Dette kan laves om så der er to rektangel klasser, en til at tegne rektanglet og en til at regne arealet.
- Der er forbindelse mellem de to klasser for at kunne trække atributter mellem dem.
- F.eks. skal man bruge længde og bredde på rektanglet i begge klasser.
- Når man deler den ud er det lettere at genbruge og man sikre at klasserne kun har et ansvar.
- Del ud i mindre klasser så hver klasse kun har et ansvar.
Open-closed
- Software enheder (klasser , moduler , metoder osv.) , bør være åben for udvidelse , men lukket for
ændringer.
- Det skal være muligt at tilføje nye klasser og funktioner uden at man behøver at ændre i den
eksisterende kode.
Eksempel
- Den grå boks er en kravspecifikation.
- Ud fra klassediagrammet (de hvide bokse) kan vi se der er to klasser med hvert sit ansvar.
- En klasse med en metode til print knappen
- En klasse med en metode til at printe hver karakter
ITS side 91
- Man kan tage højde for at printeren kan ændres fra starten af.
- Man laver en abstract klasse (kan også være interface) hvor man derudfra specificerer printere.
- Man kan ikke oprette et objekt af den abstracte klasse, metoderne i den abstracte klasse er ikke
implementeret, den implementeres først i de afledte klasser.
- På denne måde sikres det at man ikke skal ændre i teksteditor klassen fordi den abstracte klasse ikke
ændre sig, der kan blot tilføjes afledte klasser.
- I Teksteditor klassen bruger vi polymorfi idet vores printer objekt kan være af to forskellige slags.
- Den er nu lukket for ændringer, men åben for udvidelser.
Liskov substitution
- Liskov substitution er et princip i objektorienteret programmering .
- Det anføres, at i et softwareprogram , hvis S er en undertype af T, så objekter af typen T kan
erstattes med objekter af typen S (dvs. kan objekter af typen S erstatte objekter af typen T) uden at
ændre nogen af de ønskelige egenskaber af dette program ( korrekthed, opgave, der udføres , etc.) .
ITS side 92
- Vi laver en specialisering af en elipse klasse nemlig en cirkelklasse.
- I begge tilfælde har de to parametre, en stor og en lille akse.
- Man kan sagtens lave get metoder og ellipsens set metoder, men når vi skal lave set metoder i
cirkelklassen kræver en ændring af a og så en ændring af b hvilket vi ikke må da der nu ikke er den
samme forventning da der i ellipsen ikke er nogen forventning om at ændring af den ene kræver en
ændring af den anden.
- Dette er hermed ikke et arveforhold der overholder liskov substitution.
- Vi skal kunne forvente samme opførsel af de afledte klasser som man kan af basis klassen.
- Når man laver arvehierki skal man overveje om man kommer ud i en sådan situation.
Interface segregation
- Princippet går ud på at ingen klasse skal tvinges til at være afhænge af metoder den ikke anvender
- Man har en abstactklasse der hedder transaktion, denne har tre afledte klasser.
- De tre afledte klasser er samlet i et interface hvor man kan requeste det de tre klasser kan.
- Hvis vi kommer med en ny transaktionstyper skal vi tilføje en ny metode til vores interface, hvilket
ikke er hensigtsmæssigt.
ITS side 93
- Dette løser man ved at have det samme samlede UI, men imellem denne og klasserne er der
interfaces der gør de enkelte transaktionstyper
- Det samlede UI kalder metoderne i de enkelte interfaces
- Dette medfører at de enkelte interfaces ikke bliver ændret. Den samlede gør, men man berører
mindst muligt kode.
- Hver klasse skal have hvert sit interface, så den måde undgår man at påtvinge metoder som ikke
bruges.
- Interface er en ren abstract klasser hvor der ikke er implementering eller atributter, denne definere
kun signaturen på nogle metoder.
Dependency inversion
- Dette princip henviser til en særlig form for afkobling softwaremoduler.
- Højt niveau moduler bør ikke afhænge af low-level moduler. Begge bør afhænge af
abstraktioner.
- Abstractions bør ikke afhænge af detaljerne. Detaljer bør afhænge af abstraktioner.
ITS side 94
- Dette system skal kunne kontrollere omgivelserne (f.eks. Drivhus)
- Overvågner temperatur, afhængig af hvad de er kaldes nogle forskellige metoder.
- Hvor er der afhængigheder?:
- Temperatursensorern
- Vinduet, acutator og varmeren
- Operativsystemets I/O system
- Meget afhænighed hvilket man ikke vil have i et afholdt design.
ITS side 95
- Den mellemste er der hvor reguleringerne foregår
- Den højeste er den overordnede regulering i systemet.
ITS side 96
Mønster typer
9. oktober 2014 09:45
- Analyse
- Afspejler begrebsmæssige strukturer
○ Ressourceallokering
- Design
- Beskrivelser af kommunikerende objekter og klasser, der løser generelle designproblemer
○ Observer
○ State
- Arkitektur
- Overordnede struktureringsprincipper
○ Model – View - Control
Singleton
- Problemstilling: Der må kun findes et objekt af en klasse i et program.
- Eksempler:
- Medicinkatalog (flere skal kunne opdatere DET SAMME objekt fra forskellige steder)
- Fordeling af belastning på en række servere
- Singleton er en klasse
- INDE i singleton klassen har den en attribut som er en instans af sig selv.
- Konstruktoren er private så man kan ikke oprette objekter af denne i andre klasser.
class Singleton
{
//Static instans af sig selv
private static Singleton theInstance = new Singleton();
//Private konstruktor
private Singleton()
{
}
}
//For at andre klasser har adgang til instansen
public static Singleton TheInstance
{
get
{
ITS side 97
{
return theInstance;
}
}
- Metoden returnerer en instans af klassen og den er static for at for lov til at lave et objekt i f.eks.
Main.
- Dette kan også skrives på denne måde:
class Singleton
{
//Static instans af sig selv
private static Singleton theInstance;
//Private konstruktor
private Singleton()
{
}
//For at andre klasser har adgang til instansen
public static Singleton TheInstance
{
get
{
if (theInstance == null)
theInstance = new Singleton();
return theInstance;
}
}
}
- På denne måde bliver instansen ikke oprettet før den skal bruges.
- I main kan man kun oprette objekter ved at kalde instans metoden fra singleton klassen.
class Program
{
static void Main(string[] args)
{
Singleton.TheInstance.MetodeHer();
}
}
- I stedet for singleton kan der bruge statiske klasser hvor der ikke oprettes objekter.
Observer
- Et objekt , kaldet subjekt, har et antal afhængige objekter , kaldet observer , og meddeler dem
automatisk eventuelle tilstandsændringer , som regel ved at kalde en af deres metoder.
ITS side 98
Provider informerer Consumer når data ændres:
Eksempel
ITS side 99
- Når et objekt skal kunne underrette andre objekter uden at vide, hvem disse objekter er.
- Med andre ord, du ønsker ikke disse objekter tæt koblet.
- Subjektet skubber alle informationer til observeren så observere selv skal sortere i disse oplysninger.
Pull
Strategy
- Definerer en familie af algoritmer, indkapsler hver enkelt og gør dem udskiftelige med hinanden.
- Mønstret lader algoritmen variere uafhængig af hvem der bruger det.
- En måde at bruge polymorfi på.
- Fordele:
- Flytter adfærd ud af klienten
Semester projekt
Hvad er delegates?
- Delegates er objekter, der holder reference(r) til metode(r).
- Disse kan ændres under kørslen af programmet
- Delegates nedarves implicit fra System.Delegate.
Erklæring
delegate returtype DelegateNavn(paramliste);
Eksempel
delegate string MyDelegate(int x, int y);
Delegate reference
- Klasse metode (med static):
static string Print(int tal1, int tal2)
{
…
}
Instansiering
DelegateNavn del = new DelegateNavn(refMetode);
Eksempler:
- Klassemetode:
MyDelegate delObj = new MyDelegate(Print);
- Instansmetode:
Program p = new Program();
MyDelegate delObj = new MyDelegate(p.AddPrint);
Kald af delegate
DelegateNavn(paramliste);
Eksempel
delObj(100, 25);
Multicast delegates
- En delegate kan referere til flere metoder
- Disse metoder må ikke returnere noget, de har altså typen void
- Tilføjes med +
- Fjernes med –
Eksempel
delObj = new MyDelegate(Print);
delObj += new MyDelegate(p.NewAddPrint);
delObj += new MyDelegate(p.NewSubPrint);
delObj -= new MyDelegate(p.NewAddPrint);
InvokationList
- Enhver delegate har en InvokationList med de metoder, der er knyttet til den
Hvad er konfiguration?
- Computer eller System konfiguration
- Opsætning af system (kombination af HW/SW)
- Software konfiguration
- Operativsystemet man kan konfigurere.
- Det er ikke et specifikt program der konfigureres, men strukturen på computeren.
- Styre funktionaliteten i softwaren.
Hvordan konfigureres?
- Med en fil
- XML
- Almindelig tekstfil hvori der ligges nogle properties
- Bruges når det er et enkeltstående program
- Med en database
- Bruges når der er mange brugere til det samme program.
Eksempel - Sengestue
- En hospitalsseng er monteret med 2 betjeningsenheder (patient og plejer), et patient kald, en våd sensor, en
out-of-bed sensor og en vægt.
- Hvilke funktioner, der skal aktiveres (enables) afhænger af hvilken type patient sengen tildeles.
- Sengestuerne er designet til et fast antal senge, hvor alle sengenes funktioner kan enables samtidigt.
Sengefunktioner
- Patientens fjernbetjening kan køre sengen op/ned og hæve/sænke hoved-/fod-end
- Plejerens betjening kan det samme som patientens, samt foretage en vejning af patienten. Vægten vises på
betjeningen.
- Der er en lampe per seng på afdelingen på vagtstuen, således plejeren altid ved hvor der er behov for hjælp
- Patientkaldet kan tænde lampen i vagtstuen
- Våd sensoren tænder også lampen og der afspilles en alarm melodi
- Out-of-bed sensoren tænder også lampen og der afspilles en anden alarm melodi
JSON og XML
- eXtensible Markup Language (XML)
- Java Script Object Notation (JSON)
- Er metadataformatter, “mellemformatter”…, for dataudveksling, altså et format for data som alle
systemer kan læse og skrive i.
- JSON og XML kan særligt effektivt bruges i distribuerede systemer.
- Så distribuerede systemer er rammen for JSON og XML
Distribuerede Systemer
- Vi har brug for en referenceramme/fælles forståelse til at definere distribuerede systemer
- Og den tager udgangspunkt i begrebet ”Arkitektur” måden et IT system er opbygget på.
- Softwarearkitektur
- Systemarkitektur
Arkitektur og IT
- Arkitektur måden et IT system er opbygget på.
- Ofte adskilles arkitekturen i
- Systemarkitektur: Omfatter fysiske enheder der findes i systemet herunder komponenter
udført af software (Programmer, driver, OS etc.)
- Softwarearkitektur: Omfatter beskrivelsen af hvorledes softwaren i et givet system er
opbygget.
Systemarkitektur - Computer og IT
Architectural Styles
- Important styles of architecture for distributed systems
- Layered architectures
- Object-based architectures
- Event-based architectures
- Data-centered architectures
Layered architectures
Object-based architectures
Event-based architectures
Data-centered architectures
Centralized Architectures
General interaction between a client and a server
Application Layering
- Recall previously mentioned layers of architectural style
- The user-interface level
- The processing level
- The data level
The simplified organization of an Internet search engine into three different layers.
Infrastruktur System
- Computere (SW komponenter på forskellige computere), der kommunikere/interagere kræver en
dataforbindelse
- Uanset hvad de mange kommunikerende computere gør, så kræves der en række forskellige
funktioner som gør:
- At computere kan finde hinanden
- Og kan udveksle data
○ Henover tid og sted.
- Med andre ord: Der kræves en infrastruktur.
- Mail serverne skal være tilstede altid eller kan det ikke lade sig gøre.
Distribueret System
- Der er ikke en entydig definition.
- En teknisk af slagsen kan være
- ”Et distribueret system er en samling af uafhængige computere, som optræder som et eneste
sammenhængende system over for dets brugere.”
- En svaghed ved denne definition er, at det ikke er computerne, men softwaren, der
kommunikerer.
- Computerne og deres forbindelser er infrastrukturen.
- Bruges af vore forbindelser (Eng: ”Connections”) til at overføre data mellem de forskelle
komponenter (Eng: ”Component”)
- Det er en Connections opgave at koordinere kommunikationen mellem Components herunder at
sørge for at de data der sendes mellem vores Components forstås af alle parter.
- Derfor bruger Connections en række standard Data Transfer Formats
XML og filer
- Som udgangspunkt antager man
- At man læser et XML dokument fra filsystemet
- Arbejder med dokumentet
- For derefter at gemme det ændrede dokument på filsystemet.
- Man XML dokumenter kan også optræde som midlertidige dokumenter, som ikke gemmes på
filsystemet.
Datamodeller
Model for brug af XML
Brug af datamodeller
- Det står frit for enhver at bruge sine egne datamodeller, logiske som konkrete
- Men denne fremgangsmåde er ikke særligt praktisk.
- Så skal alle andre lære og forstå disse modeller
- Og hvorfor opfinde den dybe tallerken en gang til?
- Standardmodeller kan være løsningen
XML
Hvad er XML?
- XML: Extensible Markup Language
- XML er et software- og hardware-uafhængigt værktøj til at indeholde information.
- XML blev designet til at beskrive data, IKKE til at vise data (dette gøres af HTML)
- XML GØR ingenting
- Information pakket ind i tags
- Hvert sprog er rettet mod sin egen applikations domæne med sine egne markup tags
- Ikke foruddefinerede tags, denne definerer man selv
- Selvbeskrivende sprog
- Der er et fælles sæt af generiske værktøjer til udarbejdning XML-dokumenter
- XHTML: En XML variant af HTML
Opskrifter i XML
- Definer vores egen "Markup Language Opskrift"
- Vælger markup tags der svarer til koncepter i denne applikations domæne
- Note, to, from, … (se tidligere eksempel)
Modeller
- Ved brug af XML kræves mange modeller
- Tekstfilen selv
- Træstrukturen
- Dokument Objekt Model (DOM)
- En model der er lavet til den givne applikation og det sprog denne applikation er skrevet i
- Et XML dokument udformer en træstruktur fra roden (root) til grenene til bladene.
Eksempel
- XML dokument fra tidligere
- Den første linje i dette dokument beskriver XML versionen der skrives i (når et tag starter med
et ? Er det en processing instruktion).
- Næste linje <note> beskriver root elementet:
○ Dette dokument er en "note"
- De næste 4 linjer beskriver 4 child elementer af root elementet (to, from, heading, body)
- Sidste linje beskriver enden af root elementet.
- Begreberne parent, child og sibling beskriver forholdene mellem elemeterne i et XML dokument
- Parent HAR child
- Child er på samme niveau som sibling
- Alt dette udformer en træstruktur (hierarki)
Eksempel
- Root: <bookstore>
- <bookstore> indeholder <book>'s
- <book> har 4 child elementer:
○ <title>
○ <author>
○ <year>
○ <price>
- XML DOM (Document Object Model) definerer en standard måde at få adgang til og ændre i XML-
dokumenter .
- DOM præsenterer et XML dokument som en træstruktur.
- DOM definerer objekter og egenskaber (properties) for alle XML-dokumentets elementer og
metoder (interfaces) til at tilgå dem.
Nodes
- I DOM er alt i et XML dokument en node:
- Hele dokumentet er en document node
- Hvert XML element er en element node
- Tekst i XML elementer er text nodes
- Hver attribut er en attribute node
- Kommentarer er comment nodes
Textual Representation
- Text nodes: written as the text they carry
- Element nodes: start-end tags
- <bla ...> ... </bla>
- Short-hand notation for empty elements: <bla/> (self-closing)
- Attribute nodes: name=“value” in start tags
- Comment nodes: <!– bla bla -->
- Processing instructions: <?target value?>
- Root nodes: implicit
Eksempel
Node træstruktur
- DOM ser også XML som en træstruktur
- Træet starter ved root noden og forgrener sig ud til text nodes som er det laveste level af træet.
Eksempel
- JA!
- OBS! XML erklæringen (se tidligere eksempel) har ingen lukke-tag da dette ikke er en del af selve
XML-dokumentet.
- Åbne-tags og lukke-tags er det samme som start-tags og slut-tags
- JA!
XML dokumenter skal have et root-element som er parent til alle andre elementer
- JA!
Kommentarer
Space
- Hvis der laves to space, vil disse ikke omgenereres til ét, der vil forbilde to spaces
Ny linje
- LF
Eksempel
- I stedet for:
Navngivningsregler
- Navne må indeholde bogstaver, tal og andre karakterer
- Navne må ikke starte med et tal eller et tegn
- Navne må ikke starte med bogstaverne xml (uanset store eller små bogstaver)
- Navne må ikke indeholde space
- Undgå bindestreg (-)
- Undgå punktum (.)
- Undgå kolon (:)
- Ikke-engelske bogstaver er tilladt i XML (tag hensyn til om den tilhørende software kan læse disse)
Navngivningsstile
- Vær' konsekvent med navngivningsstilen.
- Eksempler:
- Til dette udvikles en software der kan udtrække <to>, <from>, <body> elementerne fra XMl
dokumentet og producerer dette output:
- Applikationen kan stadig finde de oprindelige elementer og software applikationen vil derfor
ikke crashe.
- Her er filtypen irrelevant for dataet, men kan være vigtigt for software applikationen
- Hvis der i attributtens værdi er " " kan ' ' bruges:
- ID attributten er for at identficere XMl elementet, den er ikke en del af selve noten
Navne konflikter
- Udvikleren bestemmer selv element navnene
- Dette kan skabe navne konflikter når man prøver at mixe XML dokumenter fra forskellige XML
applikationer
Eksempel
- Dette XML dokument indeholder informationer omkring en tabel:
- Disse indeholder begge <table>, så hvis disse skulle sammenflettes ville der være en navne konflikt,
som en XML applikation ikke kan løse
Namespace
- Når der bruges et prefix som i ovenstående eksempel skal der defineres et namespace
- Namespacet defineres af xmlns attribut i start-tagget af et element:
- Meningen er at give namespaces et unikt navn, men nogle gange kan det henvise til en web side der
indeholder namespace information.
URI
- Uniform Ressource Indetifier (URI) er en string af karakterer som identificerer en internet ressource
- Den mest almindelige URI er Uniform ressource Locator (URL) som identificerer en internetadresse
Default namespaces
- Når man definerer et default namespace for et element gør at man undgår at bruge prefixes for alle
child elementer.
- Syntax:
- Det er tilladt for XML dokumenter at indeholde internationale karakterer som æøå
- For at undgå fejl bør man specificere den brugte encoding eller gemme XML filem som UTF-8
Character encoding
- Definerer en unik binær kode for hver karakter der er brugt i et dokument.
- Dette kaldes også (computer sprog):
- Character set
- Character map
- Code set
- Code page.
Unicode
- Unicode er en standart for character encoding af tekstdokumenter
- Den definerer næsten alle mulige internationale krakterer som et navn og et nummer
- Unicode har to varianter: UTF-8 og UTF-16.
- UTF = Universal character set Transformation Format.
- UTF-8 bruger 1 byte (8-bits) til at repræsenterer karakterer i ASCII og to eller tre bytes for resten.
- UTF-16 bruger 2 bytes (16 bits) for de fleste karakterer og fire bytes for resten.
XML Encoding
- Den første linje i et XML dokument kaldes prologen:
- Prologgen er valgfri
- Normalt indeholder prologgen XML versions nummer
- Den kan også indeholde information omkring den brugte encoding.
- Denne prolog specificere UTF-8 encoding:
XML fejl
- Når du skriver et XMl dokument:
- Brug en XML editor der kan bruge encoding
- Vær' sikker på du ved hvilken encoding editoren bruger
- Beskriv encoding i encoding attributten
- UTF-8 er den sikreste at bruge
- UTF-8 er net standarten
Eksempel
- Nedenstående definere et array med 3 employee objekter:
Ligesom XML
- Både JSON og XML er ren tekst
- Både JSON og XML er "selv-beskrivende" (læseligt for mennesker)
- Både JSON og XML er i hierakier (værdier inden i værdier)
- Den største forskel er at for at XML dokumentet kan bruges skal dette oversættes til XML DOM af en
parser som derefter kan læses med JavaScript.
- Her kan JSON læses direkte med JavaScript
Regler
- Data er i navn/værdi par
- Data adskilles af komma
- Tuborgklammer indeholder objecter
- Firkantede parenteser indeholder arrays
Navn/værdi par
- Et navn/værdi par består af et navn (i citationstegn) efterfulgt af kolon efterfulgt af værdien:
Værdier
- Værdier kan være:
- Et tal (integer eller floating)
- En tekststreng (string i citationstegn)
○ Kan formatteres som en dato
- En boolean (true eller false)
- Et array (i firkantede parrenteser)
- Et object (i tuborgklammer)
- Null (tom/ingenting)
Objekter
- Objekter har ikke navne som de har i C#
- Objekter skrives inde i tuborgklammer.
- Et objekt kan indeholde flere navn/værdi par (ligesom JavaScript):
- 30 er stadig en tekst, men skal opfattes som et tal, ALT inden i tuborgparrenteserne er tekst man kan
opfattes som string eller int når det skal tolkes af software.
Arrays
- Arrays skrives inde i firkantede parrenteser.
- Implicit forståelse af hvilken type arrayet indholder
- Et array kan indeholde flere objekter:
JavaScript syntaks
- Fordi JSON bruger JavaScript syntaksen skal denne ikke bruge en ekstra software for at arbejde med
JSON i JavaScript.
- En almindelig måde at bruge JSON er at læse data fra eb web server og vise dette på en web side.
- For at gøre det simpelt kan dette demonstreres ved at bruge et string input i stedet for en fil.
- JavaScript funktionnen JSON.parse(tekst) kan bruges til at konverterer en JSON tekst til et JavaScript
objekt.
- Ældre browsere uden JSON.parse() kan bruge eval() funktionen til at konverterer JSON tekst til et
JavaScript objekt:
- Af sikkerhedsmæssige grunde skal det undgås at bruge eval() da denne funktion kan udføre alt
JavaScript.
- parser() funktionen kender kun JSON og kan derfor ikke kompile JavaScript
- parser() er også hurtigere end eval().
- Fire nemme skridt til hvordan JSON data læses ved brug af XMLHttp
Example
- Dette eksempel læser en menu fra myTutorials.txt og viser denne menu på en web side:
Eksemplet i detaljer
1. Opret et array af objekter
Giv hvert objekt to properties: display og url.
Giv arrayet navnet myArray:
3. Opret en tekstfil
Læg arrayet i en fil med navnet myTutorials.txt:
- En almindelig måde at bruge JSON på er at indlæse data fra en web server og vise dette data på en
web side.
- Følgende er 4 steps til hvordan man indlæser JSON data ved brug af funktions filer:
1. Opret et array af objekter
Brug et array til at erklære et array af objekter.
Giv hver objekt to properties: display og url
XML sprog
- XML sprog:
- Et sæt af XML dokumenter med nogle skemaer
- Skema
- En formel definition af XML sprogets syntaks (bestemmer hvordan XML dokumentet må se ud)
- Skema sprog
- En notation til at skrive skemaer (sproget der beskriver skemaet)
Validation
Eksempel
- Regulær udtryk 1:
- d udtrykkes som:
- Meningen med et DTD (Document Type Definition) er at definerer en bestemt opbygning af et XML
dokument.
- DTD definerer dokumentets struktur med en liste af bestemte elementer og attributter
Opbygningen af DTD
- Fra et DTD synspunkt er alle XML dokumenter opbygget af disse blokke:
- Elementer
- Attributter
- Entites
- PCDATA
- CDATA
Elemeneter
- Elementerne af hovedblokkene for XML dokumenter
- Elementer kan indeholde tekst, andre elementer eller de kan være tomme.
Attributter
- Attributter tilføjer ekstra information til elementerne
- Attributterne er altid placeret elementets start tag
- Attributter kommer altid i navn/værdi par
- Eksempel:
Enheder
- Der er tegn der har specielle betydninger i XML
- Følgende enheder er førdefineret i XML:
PCDATA
- PCDATA står for "parsed character data"
- "Character data" skal forstås som det tekst der befinder sig mellem et XML elements start og slut tag
- PCDATA er tekst der vil blive parsed af en parser, teksten vil blive undersøgt af parseren for enheder
og markup
CDATA
- CDATA står for "character data"
- CDATA er tekst som ikke vil blive parsed af en parser
Limitations of DTD
1. Cannot constraint character data
2. Specification of attribute values is too limited
3. Element and attribute declarations are context insensitive
4. Character data cannot be combined with the regular expression content model
5. The content models lack an “interleaving” operator
6. The support for modularity, reuse, and evolution is too primitive
7. The normalization features lack content defaults and proper whitespace control
8. Structured embedded self-documentation is not possible
9. The ID/IDREF mechanism is too simple
10. It does not itself use an XML syntax
11. No support for namespaces
Erklæring af elementer
- I DTD erklæres XML elementer med en ELEMENT erklæring
- Syntaks:
Tomme elementer
- Tomme elementer skal erklæres med EMPTY:
- Når child elementer er erklæret i en sekvens adskilt af kommaer skal child elementerne være i den
samme sekvens i dokumentet.
- I en fuld erklæring skal child elementerne også erklæres
- + i eksemplet ovenover erklærer at child elementet "message" skal forekomme én eller flere gange
inde i "note" elementet
- * i eksemplet ovenover erklærer at child elementet "message" kan forekomme ingen eller flere
gange inde i "note" elementet
- ? I eksemlet ovenover erklærer at child elementet "message" kan forekomme ingen eller én gang
inde i "note" elementet
Erklæring af enten/eller
- I eksemplet ovenover erklæres det at "note" elementet skal indeholde et "to" element, et "from"
element, et "header" element og enten et "message" eller et "body" element
- I eksemplet overnover erklæres det at "note" elementet kan indeholde ingen til flere forekomster af
PCDATA, "to", "from", "header" eller "message" elementer.
Erklæring af attributter
- I DTD erklæres attributter med ATTLIST
- Syntaks:
- I ovenstående eksempel er "squre" elementet defineret til at være et tomt element med en "width"
attribut af typen CDATA.
- Hvis der ikke er specificeret en width har den default værdien 0.
#REQUIRED
- Syntaks:
- Eksempel:
- #REQUIRED bruges hvis man ikke har en mulighed for default værdien, men stadig vil have at
attributten er tilstede.
#IMPLIED
- Syntaks:
- Eksempel:
- #IMPLIED bruges hvis man ikke vil tvinge inkluderingen af en attribut og man ikke har en mulighed
for default værdien
#FIXED
- Syntaks:
- Eksempel:
- #FIXED bruges hvis man vil have en attribut der har fixed værdier uden at man kan ændre det.
- Hvis man inkluderer en anden værdi hvis XML parseren returnerer en fejl
- Eksempel:
- Enumerated attribut værdier bruged når man vil have attributværdien til at være en af et fixed sæt
af lovlige værdier.
- Entities er variabler der bruges til at definere genveje til standart tekst og specielle karakterer:
- Entiti referencer er referencer til entities
- Entities kan være erklæret internt eller eksternt
- Eksempel:
- En entiti har tre dele: et og-tegn (&), et entiti navn og et semikolon (;)
- Eksempel:
- Den førsye linje definerer note elementet til at have fire child elementer: "to, from, heading, body"
- Linje 2-5 definerer child elementerne til at være af typen "#PCDATA"
<schema> elementet
- <schema> elementet er root elementet for alle XML skemaer:
- Følgende:
- Følgende:
- indikerer at elementer defineret i dette skema (note, to, from, heading, body) kommer fra
"http://www.w3schools.com" namespaceet.
- Følgende:
- Følgende:
- indikerer at alle elementer der bliver brugt af XML instans dokumentet som erklæres i dette skema
skal være namespace qualified.
- Følgende:
Elementer
Hvad er et simpelt element?
- Et simpelt element er et XML element der kun indeholder tekst
- Et simpelt element kan ikke indeholde andre elementer eller attributter
- En fixed værdi tilskrives automatisk til elementet og det kan ikke specificeres en anden værdi.
- I følgende eksempel er den fixed værdi "red":
Attributter
Hvad er en attribut?
- Simple elementer kan ikke have attributter
- Hvis et element har sttributter er det en kompleks type, men attributten i sig selv er altid erklæret
som en simpel type.
- En fixed værdi tilskrives automatisk til attributten og den kan ikke specificeres en anden værdi.
- I følgende eksempel er den fixed værdi "EN":
Simple datatyper
- Det næste eksempel definierer også et element kaldes "initials" med en begrænsning.
- De eneste acceptable værdier er tre af de små eller store bogstaver fra a til z:
- Det næste eksempel definerer også et element kaldet "letter" med en begrænsning.
- Den acceptable værdi er én eller flere bogstavpar, hvor hvert par indeholder et lille bogstav
efterfulgt af et stort bogstav.
- F.eks. "sToP", men ikke "Stop", "STOP" eller "stop"
- Det næste eksempel definerer også et element kaldet "adress" med en begrænsning.
- whiteSpace begrænsningen "replace" (erstatter) whitespaces, således at XML processoren erstatter
whitespaces med mellemrum.
- Det næste eksempel definerer også et element kaldet "adress" med en begrænsning.
- whiteSpace begrænsningen "collapse" (fjerner) whitespaces, således at XML processoren fjerner alle
whitespaces (line feeds, tabs, spaces, carriage returns erstattes med mellemrum, leading og trailing
mellemrum fjernes og multiple spaces reduceres til ét mellemrum)
- Det næste eksempel definerer også et element kaldet "password" med en begrænsning.
- Værdien skal være på minimum fem karakterer og maximum otte karakterer.
Elementer
Hvad er et komplekst element?
- Et komplekst element er et XML element der indeholder andre elementer eller attributter.
- Der er fire forskellige former for komplekse elementer:
- Tomme elementer
- Elementer der kun indeholder andre elementer
- Elementer der kun indeholder tekst
- Elementer der indeholder både elementer og tekst
- Alle disse elementer kan også indeholde attributter.
- Eksempler:
- Er kompleks element "product" som er tomt:
- Hvis man bruger denne metode er det kun "employee" elementet der kan bruge den
specificerede komplekse type.
- Child elementerne "firstname" og "lastname" er omgivet af <sequence>.
- Dette betyder at child elementerne skal fremstå i samme rækkefølge som de er erklæret.
2. "employee" elementet kan have en type attribut som kan referere til navnet af den komplekse
type der skal bruges:
- Hvis man bruger denne metode kan flere elementer referere til den samme komplekse type,
således:
- Man kan også basere et kompleks element på et eksisterende kompleks element og tilføje
elementer, således:
- Man kan give "complexType" elementet et navn og lade "product" elementet have en type attribut
som refererer til "complexType" navnet
- Hvis man bruger denne metode kan flere elementer referererer til den samme komplekse type:
Kun elementer
- Et XML element "person" indeholder kun andre elementer:
- Brug extension/restriction elementer til at udvide eller begrænse grundlager for de simple typer for
et element.
- Følgende er et eksempel på et XMl element "shoesize" som kun indeholder tekst:
- Man kan også give complexType elementet et navn og lade "shoesize" elementet have en type
attribut der refererer til complexType navnet (ved brug af denne metode kan flere elementer
referere til den samme komplekse type):
Blandet indhold
- Et XML element "letter" indeholder både tekst og andre elementer.
- For at få tekst til at fremstå mellem "letters" child elementer skal de blandede attributter sættes til
true.
- <xs:sequence> tag betyder at de definerede elementer (name, orderid og shipdate) skal fremstå i
den samme rækkefølge inde i et "letter" element.
- Man kunne også give complexType elementet et navn og give "letter" elementet en type attribut der
refererer til complexType navnet (hvis man bruger denne metode kan flere elementer refererer til
den samme komplekse type):
- Man kan kontrollere hvordan elementer skal bruges i dokumentet med indikatorer.
- Der er syv indikatorer:
- Order indikatorer:
○ All
○ Choice
○ Sequence
- Occurence indikatorer:
○ maxOccurs
○ minOccurs
- Group indikatorer:
○ Group name
○ attributeGroup name
Order indikatorer
- Order indikatorer bliver brugt til at definererrækkefølgen af elementer.
All indikator
- <all> indikatoren specificerer at child elementer kan forekomme i hvilken som helst orden og at
hvert child element kun må forekomme én gang.
- Når man bruger <all> indikatoren kan man sætte <minOccurs> indikatoren til 0 eller 1 og
<maxOccurs> kan kun blive sat til 1
Choice indikator
- <choice> indikatoren specificerer at enten et eller et andet child element kan forekomme:
Sequence indikator
- <sequence> indikatoren specificerer at child elementet skal forekomme i en specifik rækkefølge:
maxOccurs indikator
- <maxOccurs> indikator specificerer det maksimale antal gange et element kan forekomme.
- I ovenstående eksempel indikeres det at "child_name" elementet kan forekomme minimum én gang
og maksimalt ti gange i "person" elementet.
minOccurs indikator
- <minOccurs> indikatoren specificerer det minimale antal gange et element kan forekomme.
- I ovenstående eksempel indikeres det at "child_name" elementet kan forekomme mindst nul gange
og maksimalt 10 gange i "person" elementet.
- For at tillade et element til at forekomme uendeligt mange ganeg kan der bruges
maxOccurs="unbounded":
- Eksempel:
- En XML fil kaldt "Myfamily.xml":
Group indikatorer
- Group indikatorer bruges ofte til at definere sæt af elementer, relateret til hinanden.
Element Groups
- Element groups er defineret med en group erklæring:
- Efter man har defineret en gruppe kan man refererer til det i en anden definition:
Attribute Groups
- Attribute groups er defineret med attributeGroup erklæringen:
- Efter man har defineret en attribute group kan man refererer til det i en anden definition:
<any>
- <any> elementet tillader os at udvide XML dokumentet med elementer der ikke er specificeret i
skemaet.
- Følgende eksempel er en del fra et XML skema med navnet "family.xsd".
- Det viser en erklæring for "person" elementet.
- Ved at bruge <any> elementet kan man udvide (efter <lastname>) indholdet af "person" med hvilket
som helst element:
- Følgende XML fil (med navnet "Myfamily.xml") bruger komponenter fra to forskellige skemaer,
"family.xsd" og "children.xsd":
<anyAttribute>
- <anyAttribute> elementet tillader os at udvide XML dokumentet med attributter der ikke er
specificeret i skemaet.
- Følgende eksempel er en del fra et XML skema med navnet "family.xsd".
- Det viser erklæringen af "person" elementet.
- Ved at bruge <anyAttribute> elementet kan man tilføje hvilket som helst antal af attributter til
"person" elementet:
- Ovenstående XML fil er korrekt fordi "family.xsd" skemaet tillader os at tilføje en attribut til "person"
elementet
- <any> og <anyAttribute> elementer er brugt til at lave dokumenter med mulighed for udvidelse
- De tillader dokumenter at indeholde ekstra elementer der ikke er erklæret i hoved XML skemaet.
- Eller således:
Brug af substitutionGroup
- Typen af de elementer der kan erstatte skal være den samme som typen de skal erstatte (hoved
elementet).
- Hvis typen af det element der skal erstatte er den samme type som det element det skal erstatte
behøver man ikke at specificere typen af det element der skal erstatte det andet.
- Alle element i substitutionGroup (hoved elementet og de elementer der kan erstatte dette) skal
være erklæret som globale elementer, ellers vil det ikke virke.
- Globale elementer er elementer der child elementer af "skema" elementet
- Lokale elementer er elementer i andre elementer
Hvad er serialisation?
- Med “Serialization” menes den process hvor man skriver et objekt til eller læser et objekt fra et
persistent lager medie, som f.eks. en fil på harddisken.
- I C# gøres en klasse serialiserbar ved at tilføje attributten [Serializable] Dette er dog ikke nødvendigt
ved brug af XML-serializer.
- Den grundlæggende ide er at et objekt selv skal være i stand til at skrive dets interne tilstand
(værdien af alle datamedlemmer) til en stream (et persistent lagermedie eller
datakommunikationskanal).
- Senere er det så muligt at genskabe objektet ved at læse objektets tilstandsdata fra en stream (et
persistente lagermedie).
- Denne proces kaldes for deserializing.
- Hvis objektet har referencer til andre objekter, så serialiseres disse objekter også (kræver at de også
er erklæret Serializable).
Serialization proces
Deserialization proces
Serialization formatters
XmlSerializer ”Det her er vores metode”
•Namespace: System.Xml.Serialization
•Serializes and deserializes objects (just the public properties and fields) into and from XML
documents.
•The XmlSerializer enables you to control how objects are encoded into XML.
•Requeriments:
–Type must be public (public class person).
–Must implement a parameterless constructor (in order to deserialize the object).
–If you are serializing a non generic collection of items, you must pass the types that are stored in
the collection as a parameter in the constructor of the XmlSerializer (see example code).
XmlSerializer
•PROS:
–It can serialize generic and non generic collections (being the items within the collection
serializable)
–Class doesn't need to be decorated with [Serializable] attribute.
–Developer has a deep control about how each field is going to be serialized by using the attributes:
•[XmlAttribute] : over a field, marks that the field will be serialized as attribute, instead of a node
•[XmlIgnore] : won't serialize that field. The same as NonSerializable, but just for the XmlSerializer.
•[XmlElement (ElementName="NewName"]: Allows you to rename the field when being serialized.
•CONS
–It is more verbose (less efficient) than BinaryFormatter.
–Only public members will be serialized! (shallow serialization)
ST3ITS3 Her kan vi kontrollerer hvad der skal i XML og kommer fra XML
XmlDocument Example
Web API
- Er en specialisering af ”Web Service” som er avanceret distribueret servicearkitektur.
- Ideen i et webservice er at man kan kalde metoder hen over nettet
- F.eks. at clienten kan kalde en metode der bliver udført i serveren
- Dette er besværligt og meget CPU krævende
HTTP Headers
- En HTTP besked består af en header og en body
- MIME (multi-purpose internet mail exsention)
- Request/response: Et request medfører altid et response
Eksempel
- Spørgsmål:
- Jeg sidder og arbejder på prøveeksamen. Jeg har lavet mit XML fil og lavet det om til XSD samt
lavet XSD'en om til C# klasse.
Nu vil jeg lave mit GUI design, og her bliver jeg itvivl om hvordan man får informationerne fra
XML filen over i GUI.
Er der noget fra undervisningen om netop det her?
- Hvordan kan semaphore udnyttes i sammenhæng med tråde og synkronisering?
- Scaling og scaling techniques i distribuerede systemer.
- Hvilken umiddelbar grad af videreudvikling af opgaven forventer I at se til den mundtlige
eksamen?
- Hvilket fil-format skal vi aflevere i?
- Hvad må vi bruge til eksamen? (Power Point, Projektor m.m.)
- Vil du genopfriske Client-Server og hvordan du forventer, at vi har opbygget det.
- Skal vi rette i xlm-filen manuelt, eller skal vi lave en metode, som kan slette det navn og
overskrive filen?
- Jeg har lavet eksamensopgaven om den sorte list, men når jeg forsøger at oprette forbindelse
mellem client og server, kan jeg ikke få det til at virke. Den kommer med følgende fejl: (Hvad
er problemet med C/S opkobling)
- Jeg har ikke nogle deciderede spørgsmål til spørgetimen i morgen endnu, men jeg har forsøgt at lave
den eksamensopgave, du har lagt op, med hjælp fra Lenes løsningsforslag. Jeg har to problemer:
I client/server delen kan jeg ikke få vist nogen chatbesked. Applikationen melder ingen fejl, og jeg
ved ikke, hvad jeg skulle mangle.
Når jeg klikker på et navn i listBoxen crasher hele applikationen.
- Ville du lave en video med løsningsforslaget til opgaven?
- Vi er nemlig lidt i tvivl om, hvordan man skal påbegynde sin opgave med Client/Server - og hvor
mange mønstre man skal benytte.
Det ville hjælpe alle en hel del! :)
- - hvor er det præcist man skal bruge locks, når man programmerer med tråde? (variabler, om
metoder, om selve trådene?)
- hvordan er det bedst at gribe en opgave som fx "den sorte liste" an, skal man starte med at
oprette GUI og udfylde med controls eller skal man først generere klasser ud fra xds-filer?
- hvor vil I foreslå at vi skal lægge fokus, er det mest på dette års pensum, så man fx fokuserer sin tid
på at få trådene til at fungere frem for at bruge nedarvning eller 3-lagsmodel?