Programmeringsbegreber (Mindmap) : Tuesday, February 11, 2014 9:55 AM

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 186

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

Reserverede kodeord i C#:


abstract
as
base
bool Bool bruges til at erklærer variabler til at gemme Boolean værdier (true eller false)
break
byte Tal (se Variable)
case
catch
char Bogstaver (se Variable)
checked
class Bruges til at erklærer klasser
const Du bruger const for at erklære et konstant felt eller en konstant lokal variabel. Dette
keyword angiver, at værdien af feltet eller lokal variablen er konstant, hvilket betyder, at
det ikke kan ændres.
continue
decimal Tal (se Variable)
default
delegate
do Do-statementet udfører en erklæring eller en blok af et udsagn, indtil et specificeret
udtryk evalueres til falsk. Body'en af sløjfen skal være anbragt i tuborgklammer, {},
medmindre det består af en enkelt sætning.
double Tal (se Variable)
else Et if-statement identificerer hvilket udsagn der skal kører baseret på værdien af et
boolean udtryk. Else-staementet bruges i tilfælde af at der skal ske noget hvis if
statementet er false.
enum
event
explicit
extern
false Boolean værdi
finally
fixed
float Tal (se Variable)
for Ved at bruge en for-løkke, kan du køre en erklæring eller en blok af et statement, indtil
et givet udtryk evalueres til false. Denne form for løkke er nyttig til iteration over arrays
og andre applikationer, hvor du på forhånd ved, hvor mange gange du vil have løkken til
at gentage.
foreach
goto
if Et if-statement identificerer hvilket udsagn der skal kører baseret på værdien af et

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

- C# er et objekt orienteret sprog


- Det betyder bl.a. at al kode er ”pakket ind” i noget der hedder namespaces, klasser og metoder
- "Pakket ind” betyder at det er placeret mellem to ”tuborg”-klammer: { …… }

- Al koden skrives i metoder


• En metode svarer til en funktion – altså noget der udfører en bestemt opgave
• En metode indeholder altid en afsluttende parentes for at angive hvor eventuelle argumenter
(data metoden skal bruge) er placeret
• Man kan godt have flere metoder af samme navn, men med forskellig argumentdefinition
• F.eks.
○ WriteLine();
○ WriteLine("Hej");
- Alle metoder er en del af en klasse
• En klasse indeholder normalt flere metoder
• En metode kaldes ved først at kalde navnet på klassen efterfulgt af et punktum (.) hvorefter
metoden kaldes (HVIS der bruges using)
• F.eks.:
○ Console.WriteLine();
- Alle klasser er en del af et namespace
• Et namespace kan indeholde mere end en klasse
• En metode kaldes ved først at kalde navnet på namespacet efterfulgt af et punktum (.),
efterfulgt af klassen efterfulgt af et punktum (.) hvorefter metoden kaldes (HVIS der ikke
bruges using)
• F.eks.:
○ System.Console.WriteLine();
• Man vil næsten altid bruge f.eks. using System og så vil dette ikke være nødvendigt.

- 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

- Alle metoder er en del af en klasse


• En klasse indeholder normalt flere metoder
• En metode kaldes ved først at kalde navnet på klassen efterfulgt af et punktum (.) hvorefter
metoden kaldes (HVIS der bruges using)
• F.eks.:
○ Console.WriteLine();
- Enhederne/klasserne afspejler virkeligheden/ systemet
- Eksempler:
- Dato, Person, Journal, Iltapparat, Bil, Seng osv.
- Stort set alle navneord kan repræsenteres af en klasse
- En klasse definerer enheden og består af:
- Attributter (karakteristika)
- Metoder (funktionalitet/behaviour)

UML diagram

ITS side 11
Metoder
Thursday, November 14, 2013 8:58 PM

- Al koden skrives i metoder


• En metode svarer til en funktion – altså noget der udfører en bestemt opgave
• En metode indeholder altid en afsluttende parentes for at angive hvor eventuelle argumenter
(data metoden skal bruge) er placeret
• Man kan godt have flere metoder af samme navn, men med forskellig argumentdefinition,
f.eks.
○ WriteLine();
○ WriteLine("Hej");

- Alle metoder er en del af en klasse


• En klasse indeholder normalt flere metoder
• En metode kaldes ved først at kalde navnet på klassen efterfulgt af et punktum (.) hvorefter
metoden kaldes (HVIS der bruges using, hvilket vi altid gør), f.eks.:
○ Console.WriteLine();

- En metode kan returnere en værdi når den afvikles, f.eks.:


• indtastet = Console.ReadLine();
• Her gemmes der en værdi i variablen "indtastet" som bestemmes ved indtastning som
metoden ReadLine() kan læse. Denne værdi kan hentes og bruges.

- Når du har et objekt af en klasse, kan du kalde metoderne i klassen således:

ITS side 12
Objekter
Thursday, December 12, 2013 2:28 PM

- Et objekt repræsenterer en konkret enhed


- Eksempel: Læreren er en konkret person
○ navn: Nils
○ højde: 190
○ øjenfarve: blågrå
○ personnummer: 1234567890

- 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

Basis typer (sammen med metoder defineret som klasser):


- Integer-typer:
- Alle tal er inklusive!
- Forskellen på de forskellige hele og decimal tal er, hvor store de kan være, altså hvor meget de
fylder (bits).
- Hele tal:
int – 32 bit Med fortegn (–2.147.483.648 til 2.147.483.647)
uint – 32 bit Unsigned, kun positive tal (0 til 4.294.967.295)
short – 16 bit Med fortegn (–32768 til 32767)
ushort – 16 bit Unsigned, kun positive tal (0 til 65535)
long – 64 bit Med fortegn (–9.223.372.036.854.775.808 til 9.223.372.036.854.775.807)
ulong – 64 bit Unsigned, kun positive tal (0 til 18.446.744.073.709.551.615)
byte – 8 bit Kun positive tal (0 til 255)
sbyte – 8 bit Signed, med fortegn (-128 til 127)

- 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

SE APPENDIX B I Visual C# 2012, side 990

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:

- Variabler af samme type kan også angives på én linje:

- Variabler virker kun i det virkefelt de er erklæret i (lokale variable)

- Du definerer en variabel, hvis du også giver den en værdi


- De kan defineres direkte i forlængelse af erklæringen, f.eks.:

- Eller de kan defineres efter erklæringen, f.eks.:

- Boolean variable tildeles værdierne sandt eller falsk, f.eks.:

- DateTime variable defineres ved brug af new, f.eks.:

- 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.:

- Variabler kan defineres som:


- Klasse variabel (en forekomst pr. klasse)
- Objekt variabel (en forekomst pr. objekt i klasse)
- Parameter variabel (en forekomst pr. metode start)
- Lokal variabel (definere inde i en metode, en forekomst pr. definition)

- Variabler kan forekomme som:


- Simple typer (se under Variable)
- Objekter (refereres til)

- 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 { }

- Variabler for et objekt eller en klasse kan være:


Public Der er direkte adgang til variablen uden for klassen/objektet
Internal Der er direkte adgang til variablen uden for klassen/objektet, men kun inde fra namespace
Protected Der er direkte adgang til variablen fra en "inherited" klasse/objekt, ellers ikke
Private Der er ikke adgang til variablen uden for klassen/objektet
Readonly Kan kun sættes når den defineres eller i konstruktorerne

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.:

- C# vil automatisk foretage den ønskede typekonvertering mellem følgende typer:


Datatype Kan implicit konverteres til
Byte short, int, long, float, double eller decimal
Short int, long, float, double eller decimal
Int long, float, double eller decimal
Long float, double eller decimal
Float double

- 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

- En while skrives generelt således:


while(condition)
{
statement;
}

^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

- En do…while skrives generelt således:


do
{
statement
} while(condition);

- 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 for skrives generelt således:


for(initialization; loopContinuationCondition; increment)
statement;

- 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

- Så længe der IKKE (!) er trykket på en knap på tastaturet:

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

Set og get metoder

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.

- Eksempler på erklæring af arrays:

- Navnet (a, b, c, d) skal starte med småt


- Der kan kun være strenge i a, heltal i b, reelle tal i c og dato og tid d.

- Man vil typisk i erklæringen angive, hvor mange elementer man ønsker i arrayet, f.eks.:

- Her er tallet i [] størrelsen (længden/antallet af elementer) af arrayen


- Her har elementerne defaultværdien (0) da elementerne ikke er givet en værdi
- Da arrays altid er nulbaserede, kan der tildeles værdierne 0, 1, 2, 3 og 4 i arrayets indeks, og ved tildelingbenyttes ligeledes
firkantede parenteser, 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)

- Pladserne (værdierne) i et tal-array kan erklæres som nævnt tidligere:

- Ellers kan de defineres med en for-løkke og en counter:

- 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.

- Man henter en bestemt plads ud således:


- Hvis arrayen er oprettet således:
- int[] c;
c = new int[15]
c[5];
Her henter man det sjette element (som i dette tilfælde er default værdien 0)
- int [] n = {10, 20, 30, 40, 50, 60}
n[2]
Her henter man det tredje element (som i dette tilfælde er 30)

- Length returnerer antallet af elementer i arrayet:

- Arrays kan gennemløbes med en for-løkke:

ITS side 31
- Det kan også gennemløbes af foreach:

- Forskel på array og collections (list):


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 32
Collections
Tuesday, November 19, 2013 11:16 AM

- En collection er en samling af objekter af samme type (ligesom et array)


- Der findes en masse klasser relateret til collections (samlinger):
Klasse Forklaring
List<T> Standartliste som kan sammenlignes med et array, men giver langt
flere muligheder
Dictionary<TKey, Tvalue> En liste som opbevarer data i en nøgle-/værdi-struktur.
Queue<T> En liste der kan benyttes som en traditionel kø.
Stack<T> En liste der kan benyttes som en traditionel stak.

- Alle de nævnte klasser er såkaldte generiske klasser


• Generiske klasser er er klasser med pladsholderen <T> som kan bruges med hvilken som helst
type

- 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

- En collection erklæres således:


• List< int > list1;
• List< string > list2;
• List1 erklærer en list collection som kun kan indeholde int-værdier og list2 erklærer en list
collection som kun kan indeholde string-værdier.

- En collection oprettes med default værdier således:


• List< int > list1 = new List< int >();
• List< string > list2 = new List< string >();

- En collection oprettes med specifikke værdier således:


• List<string> byer = new List<string>();
byer.Add("København");
byer.Add("Aalborg");
byer.Add("Odense");

Eller

• List<string> byer = new List<string> { "København", "Aalborg", "Odense" };

- Metoder eller properties:


Add Tilføjer et element til slut i listen
Capacity Får eller sætter antallet af elementer en liste kan indeholde
Clear Fjerner alle elementer fra listen
Contains Returnerer true hvis listen indeholder det angivne element ellers returneres false
Count Returnerer antallet af elementer i listen
IndexOf Returnerer indekset for den første forekomst af den angivne værdi på listen
Insert Indsætter et element i det angivne indeks
Remove Fjerner den første forekomst af den angivne værdi

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)

- Add og Insert eksempel:

List< string > items = new List< string >();

items.Add("red"); //indsætter red i bunden af listen


items.Insert(0,"yellow"); //indsætter yellow på plads/index 0

- Remove og RemoveAt eksempel:

List< string > items = new List< string >();

items.Remove("yellow"); //fjerner det første "yellow"


items.RemoveAt(1); //fjerner objektet på plads/index 1

- Udskrivning eksempel:

List<string> items = new List<string>{ "yellow", "red" };

//Udskriver farverne i listen


Console.WriteLine("Display list contents with counter-controlled loop:");
for (int counter = 0; counter < items.Count; counter++)
Console.WriteLine(" {0}", items[counter]);
//Indekset kan identificeres ligesom i arrays ved at skrive indeks nummeren i [] efter List
navnet

//Udskirver farverne i listen ved brug af foreach (\n, ny linje)


Console.WriteLine("\nDisplay list contents with foreach statement:");
foreach (var item in items)
Console.WriteLine(" {0}", item);

- Contains eksempel:
List<string> items = new List<string> {"yellow","red"};

//Tjekker om en bestemt værdi er i listen


Console.WriteLine("\"red\" is {0} in the list", items.Contains("red") ? string.Empty : "not");

//Viser antallet af elementer i listen


Console.WriteLine("Count: {0}", items.Count);

//Viser kapaciteten af listen


Console.WriteLine("Capacity: {0}", items.Capacity);

- Forskel på array og collections (list):


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);

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)

- For at kunne anvende NXT'en skal man have et Brick-objekt:


○ Øverst i klassen og før Main() skal der stå:

○ Inde i Main() skal der stå:

- For at kunne anvende en motor skal man have et Motor-objekt:


○ Øverst i klassen og før Main() skal der stå:

○ Inde i Main() skal der stå:

(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´)

- For at kunne anvende en touchsensor skal man have et TouchSensor-objekt:


○ Øverst i klassen og før Main() skal der stå:

○ Inde i Main() skal der stå:

(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

- Gyldige input porte: 1, 2, 3 og 4


- Gyldige output porte: ‘A’, ’B’ og ’C’
- Gyldige motorhastigheder: 0 til 100 begge inklusive

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

- For at kunne anvende en touchsensor skal man have et TouchSensor-objekt:


○ Øverst i klassen og før Main() skal der stå:

○ Inde i Main() skal der stå:

(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

- Brugerens visuelle adgang til programmet


- Ved omhyggelig brug af brugerprofil og de 16-principper for gode brugerflader opnås en intuitiv og
ensartet brugerflade, der hurtigt kan betjenes.
- Består af GUI controls
- Vise information på skærmen og/eller
- Modtage brugerinput via mus, tastatur eller anden form for input (f.eks. Stemmestyring)

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):

ListBox listBox1 = new ListBox();

Person p = new Person("Lene", 48);


listBox1.Items.Add("Item 1");
listBox1.Items.Add("Item 2");
listBox1.Items.Add("Person: " + p.ToString());

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

- Breakpoints: Laver pause i afvikling af programmet


- Step into: Går ind i den metode den gule pil er ved
- Step over: Springer linjen over
- Step out: Går ud af den metode den gule pil er ved
- Watch: Overvåger varible, objekter (bliver røde ved ændringer når der køres gennem koden)

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 Management Systemer (DBMS) hjælper med at gøre applikationer:


- Nøjagtig
- Effektive
- Pålidelige
- Sikre
- Delbare

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

DSL - Data Sub Language


- DDL – Data Definition Language
- Opbygning af tabeller
- Primær nøgler/Fremmed nøgler
- Relationer
- DML – Data Manipulation Language
- Indsætte, slette og opdatere informationer af tabeller
- Udtrække informationer af tabeller

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

CREATE TABLE Patient(


Patient_ID INT PRIMARY KEY,
Navn nVARCHAR NOT NULL
);

CREATE TABLE Måling(


Tidsstempel DATETIME PRIMARY KEY,
Værdi DECIMAL(5,2) NOT NULL,
Patient_ID INT FOREIGN KEY REFERENCES Patient(Patient_ID),
Vægt INT FOREIGN KEY REFERENCES Vægt(Serienummer)
);

CREATE TABLE Vægt(


Serienummer nCHAR(12) PRIMARY KEY,
Fabrikant nVARCHAR NOT NULL
);

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.

INSERT INTO Patient(Patient_ID, Navn) VALUES (100, 'Ole Olsen');


INSERT INTO Patient(Patient_ID, Navn) VALUES (101, 'Lis Lorentzen');

INSERT INTO Vægt(Serienummer, Fabrikant) VALUES ('123-45', 'OBH');


INSERT INTO Vægt(Serienummer, Fabrikant) VALUES ('8-4378', '');

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
);

CREATE TABLE Måling(


Tidsstempel DATETIME PRIMARY KEY,
Værdi DECIMAL(5,2) NOT NULL,
Patient_ID INT FOREIGN KEY REFERENCES Patient(Patient_ID),
Vægt INT FOREIGN KEY REFERENCES Vægt(Serienummer)
);

CREATE TABLE Vægt(


Serienummer nCHAR(12) PRIMARY KEY,
Fabrikant nVARCHAR NOT NULL
);

- Indsætter værdierne i tabellen


INSERT INTO Patient(Patient_ID, Navn) VALUES (100, 'Ole Olsen');
INSERT INTO Patient(Patient_ID, Navn) VALUES (101, 'Lis Lorentzen');

INSERT INTO Vægt(Serienummer, Fabrikant) VALUES ('123-45', 'OBH');


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,

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);

b) Find vægt med ciffer 4 i serienummeret:


SELECT Serienummer
FROM Vægt
WHERE (Serienummer LIKE '%4%')

c) Find personer, der er vejet i første kvartal af 2011:


SELECT Patient.Navn, Måling.Tidsstempel, Patient.Patient_ID, Måling.Patient_ID
FROM Patient, Måling
WHERE (Måling.Tidsstempel BETWEEN '01-Jan-2011' AND '31-Mar-2011') 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

b) Find antallet af personer registeret i målingssystemet.


SELECT count(DISTINCT Patient_ID)
FROM Måling

c) Find gennemsnitsvægten for Ole Olsen


SELECT avg(Værdi)
FROM Måling, Patient
WHERE Navn = 'Ole Olsen' and Patient.Patient_ID=Måling.Patient_ID

Tutorial 2 - Spørgsmål 1-5


1) SELECT employee.empno, jobhistory.position, jobhistory.salary
FROM employee, jobhistory
WHERE jobhistory.position LIKE '%Analyst%' and employee.empno=jobhistory.empno

2) SELECT employee.empno, jobhistory.position, jobhistory.salary


FROM employee, jobhistory
WHERE jobhistory.position = 'Analyst Programmer' and jobhistory.ENDDATE is NULL and
employee.empno=jobhistory.empno

3) SELECT forenames, surname


FROM employee
WHERE depno = '3'

4) SELECT empcourse.courseno, empcourse.empno


FROM empcourse
WHERE empcourse.empno = 7 or empcourse.empno = 14

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.

The user should be in control


- Wrong: Computer issues commands and expects the user to obey
- Right: The user can make commands and the computer obey.
- The computer should be a helpful servant, not a cruel master

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.

Never interrupt the user


- An unexpected pop-up box is a serious usability error for several reasons:
- It breaks the system's predictability because the unexpected change of focus from the typing
window to the message box radically changes what the keys do.
- It violates the principle that the user should be in control.
- It breaks the user's line of thought, which can be quite annoying.
- Time and attention are precious resources to many software users. Stealing those resources is a sign
of disrespect to the user's work situation.
- Messages to the user about new mail, new software updates, or whatever, should be presented
discreetely as an icon in a corner of the screen. Sound, animations, or popup windows are
completely unacceptable unless the message is very urgent. And the user is the judge of what is
urgent, not the software producer.

Can I guess what the user wants?


- The software should never do anything on its own initiative, not even correct errors.

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.

Speak the user's language


- In general, you have to use a language that the users understand
- Sometimes users may be offended by a language that sounds too childish, and there may be
situations where the users need to learn the technical terms anyway.

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.

The design of a button should reflect its importance


- The buttons on a control panel or keyboard should be arranged so that the buttons that are used
most often are big and have the most prominent positions, while buttons that are seldom used may
be smaller and put away in a corner.
- Buttons that are used for basic setup and configuration may be put away under a lid, so that people
know that these are not for everyday use.

Provide alternative ways out of a situation


- Options that a user might want to have in a critical situation:
- Proceed to next step
- Return to previous step
- Undo last operation
- Undo more than one operation
- Redo undone operation
- Cancel operation
- Save data and interrupt operation so that I can resume later
- Help about this step
- Help about program in general
- Leave program

Accessibility to handicapped users


- All mechanical devices, like buttons, handles etc., should have a sufficient size and not require small,
precise movements.
- Displays should also have a sufficient size, and the details should not be too small.
- There should be an appreciable difference in luminance between background and text, as well as
other figures that need to be distinguished.
- A difference in color doesn't suffice.
- Software should be designed so that it can be used without a mouse.
- All images that contain important information should have an alternative text behind them.
- Avoid flashing, flickering and animated text and figures.

Novices versus experienced users


- The best guidance may be a self-explaining design that shows what the apparatus can do

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.

Write object to a file


- Object for serializing in binary format
BinaryFormatter formatter = new BinaryFormatter();
- Open file with write access
FileStream output = new FileStream( fileName, FileMode.OpenOrCreate,FileAccess.Write );
- Write Record to file
formatter.Serialize(output,record);
- Close StreamWriter and underlying file
fileWriter.Close();
- Pak ind i try-catch da der kan opstå SerializationException

Read object from a file


- Object for serializing in binary format
BinaryFormatter reader = new BinaryFormatter();
- Open file with read access
FileStream input = new FileStream( fileName, FileMode.Open, FileAccess.Read );
- Read record
RecordSerializable record = (RecordSerializable)reader.Deserialize(input);
- Close StreamReader and underlying file
fileReader.Close();
- Pak ind i try-catch da der kan opstå SerializationException

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

Eksempel: Adminstrerende system til udlejning af køretøjer

- ^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
{

}

public class Truck : Vehicle


{

}

- Skriver vi ikke noget arver man fra objectklassen


- Man kan kun arve fra én klasse

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

- Baseclass – klasse hvis struktur og egenskaber en anden klasse arver (parent)


- Derivedclass – klasse der arver fra/udvider en anden klasse. (child)
- Klassehieraki – klassediagram

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.)

Objekdiagram ved arv

ITS side 71
Objekdiagram ved arv

- De markerede atributter er de atributter der er arvet fra baseclassen


- De har den samme user
- De har hver sin specifikke atribut de har fra deres egen klasse

Access specifier - Protected


- Kendte access specifier:
- Private
- Public
- Og nu… Protected
- Attributter og metoder i klasse A, der har access specifier protected, kan afledte klasser af A anvende (klasser der arver fra A)
- Indkapsling sikres bedre ved brug af get/set metoder eller properties
- :this(), leder efter en constructor uden parametre

Fordele ved arv


- Minimerer kode duplikering
- Giver mulighed for genbrug af generelle egenskaber og operationer
- Letter vedligehold af kode
- Lettere at udvide applikationer med flere type specialiseringer

Ulemper ved arv


- Det er sværere at overskue placering af funktionalitet
- Arvede egenskaber er ikke erklæret explicit i den afledte klasse og heller ikke i dokumentationen

ITS side 72
Polymorfi
15. maj 2014 08:20

- Polymorfi betyder "many shapes"


- En variabel kan holde et objekt af den type den er defineret som (basis klasse) eller et objekt af en afledt
klasse.

- 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

c = new Vehicle(); // Ikke OK, Car er afledt klasse til Vehicle

Person p1 = new Student(); //OK


Person p2 = new PhD(); //OK, man kan godt "springe" en klasse over sålænge det er rigtig rækkefølge
PhD phd1 = new Student(); //Ikke OK
Teacher t1 = new Person(); //Ikke OK
Student s1 = new PhD(); //OK

Person p1 = new Person();


Person p2 = new Person();
PhD phd1 = new PhD();
Teacher t1 = new Teacher();
Student s1 = new Student();

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 {

- Navnet på en abstract klasse skrives i kursiv

- 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

Statisk og dynamisk type


- Statisk type:
- Typen en variabel er erklæret som:
foreach (Shape s in shapes)
{
s.draw();
}
- Det vi erklærer vores variable som i koden
- Ændrer sig ikke igennem afvikling af koden
- Her er den statiske type "Shape", for denne ændrer sig ikke
- Dynamisk type:
- Typen af det objekt, der holdes af variablen
- Kan variere gennem objektets levetid.
- Her (ovenstående eksempel) kan den dynamiske type være, cirkel, rektangel eller trekant alt efter
hvilken type det er i øjeblikket

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:

public class Example : Test, IDrawable, ICountable

Fordele og ulemper ved polymorfi


- Fordele:
- Det er let at udvide en applikation med flere typer
- Programmere generelt i stedet for specifikt
- Ulemper:
- Kan være svært at gennemskue funktionen af kode, da den afhænger af det konkrete objekt på
kørselstidspunktet

ITS side 77
3. semester
8. oktober 2014 13:54

ITS side 78
Tråde
2. september 2014 08:13

- En tråd er en rækkefølge af statements i en del af et program


- Det er en del af programmet, det er ikke hele programmet
- Kaldes også Task
- Tråde gør at man kan køre forskelligt kode samtidigt (samtidigt afhænger af hvor mange CPU'er vi har,
CPU = processer)
- De fleste programmer vi har arbejdet med indtil nu har kørt i en Single Thread, Main (undtaget GUI)
- I C# er det imidlertid muligt at anvende flere tråde i samme program/proces
- Disse tråde kan udføres samtidigt i et program i et multiprocessorsystem.
- I et single processorsystem, deles flere tråde om CPU-tiden.

Multiple Threads kørende på multiple CPU'er

- F.eks. I Visual Studio


- Task 1: Editoren hvor vi skriver
- Task 2: Fejlfinderen der understreger forkert skrevet kode
- Task 3: Udskrift af koden

Multiple Threads dels om en enkelt CPU

- 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:

Thread t = new Thread(Bla);


t.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.

Livscyklus for en tråd

- 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:

Thread t = new Thread (ThreadMethod);


t.Start();
}

static void ThreadMethod()


{

}

Eksempel
- Der er to tråde, den ene er main:

static void Main(string[] args)


{
Thread t = new Thread (ThreadMethod);
t.Start();
}

static void ThreadMethod()


{
Console.WriteLine("Hello world");
}

- Trådmetode med parametre:


- Kan bruges ved klassemetoder

Thread t = new Thread(ThreadMethod);


t.Start(i);

static void ThreadMethod(object threadID)


{

}

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);
}
}

static void ThreadMethod(object threadID)


{
Console.WriteLine("Hello world: " + threadID);
}

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

static void Main(string[] args)


{
for (int i = 0; i < 8; i++)
{
Thread t = new Thread(() => ThreadMethod(i));
t.Start();
}
}

static void ThreadMethod(object threadID)


{
Console.WriteLine("Hello world: " + threadID);
}

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

Thread t = new Thread(ThreadMethod);


t.IsBackground = true;
t.Start();

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

Thread t = new Thread(ThreadMethod);


t.Priority = ThreadPriority.Lowest;
t.Start();

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

Dining Philosophers problem


- Hver filosof kan to ting, spise og tænke
- En filosof kan kun spise hvis han har en gaffel i både venstre og højre hånd.
- Antallet af gafler svarer til antallet af filosoffer.
- Gaflerne kan kun være i én hånd af gangen, så en filosof kan kun bruge en gaffel hvis den ikke bliver brugt
af en anden.
- Når en filosof stopper med at spise skal han lægge sin gaffel ned på bordet så de bliver tilgængelige for de
andre filosoffer.
- En filosof kan samle en gaffel op, enten på hans højre eller venstre side, men han kan ikke starte med at
spise før han har begge gafler.
- Man skal tænke på der er uendelige mænger af spaghetti, når filosoffen lægger sin gaffel ned er hans
tallerken altså ikke tom.
- Hvordan koder man så én af filosofferne ikke kommer til at sulte (en tråd aldrig bliver kørt)

- Gaflerne repræsenterer "shared resources".


- Princippet i at en filosof ikke kan samle en gaffel op som allerede er i brug kaldes "race condition"

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:

Object myLock = new Object();

lock(myLock)
{
//Kritisk region
}

- Det lock gør er at overvåge indgangen og udgangen af koden.


- Hvis en tråd tager fat i objektet lock er koden låst og der er ikke andre tråde der kan tage fat i
objektet.
- Når en tråd går ud af denne kode skal den give slip på låsen igen, så en anden tråd kan tage fat i
objektet lock.
- Locken skal helst omkranse så lidt kode som overhovedet muligt, der skal ikke være kode inde i en
lock der ikke er en kritisk region, altså som ikke skal tilgå den fælles variable.

- Lock låser ikke nødvendigvis objektet:

- 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):

mutex = new Mutex(false, “RT”);


mutex.WaitOne();
{
//Kritisk region
}
mutex.ReleaseMutex();

- 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).

using (var mutex = new Mutex(false, "oreilly.com OneAtATimeDemo"))


{
// Wait a few seconds if contended, in case another instance
// of the program is still in the process of shutting down.

if (!mutex.WaitOne(TimeSpan.FromSeconds(10), false)) // Enter CR


{
Console.WriteLine("Another app instance is running. Bye!");
return;
}
RunProgram();
mutex.ReleaseMutex(); // Leave CR
}
}

static void RunProgram()


{
Console.WriteLine("Running. Press Enter to exit");
Console.ReadLine();
}

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

- En semafor associeres med en tællerværdi (buffer) der har to funktioner:


- Signal
○ signal(semaphore)
○ Tæller op
○ Hvis nogle venter sender den signal dertil
- Wait
○ wait(semaphore)

ITS side 87
○ wait(semaphore)
○ Tæller ned
○ Hvis tælleren er 0 blokeres der indtil der gives signal

- signal() åbner en semaphor:


- Hvis der er tråde der venter på et signal, frigøres blokeringen på én tråd
- Hvis der ikke er tråde der venter på et signal, huskes signalet til næste gang wait(s) kaldes
- Når wait() bliver kaldt af en tråd:
- Hvis semaphoren er "ledig" fortsætter tråden
- Hvis semaphoren er "optaget" blokeres tråden og venter på 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

- CPU'en er hjernen i computeren


- Denne modtager input enheder og giver outputenheder
- Den kan kommunikere med hukommelsen, MEM
- Inde i CPU'en ligger en ALU som er regnekraften i computeren
- Denne tager data ind for at behandle dette
- Den kan ADD, SUB, ROT
- Hvis der bliver lagt to tal ind i ALU'en hvor resultatet bliver for stort (så der skal lægges ekstra ind i
vores register) får denne et flag, en carry
- Et andet flag er hvis det vi prøver at lægge ind vores register er 0, zero
- Et tredje er hvis prøver at lægge noget ind som ikke kan være der, overflow
- I hukommelsen ligger der bit, hvilket kan fortolkes som data
- En enhed (adresse) i hukommelsen er på 32-bit
- Program counteren holder styr på hvor vi er i programmet
- Ram counteren holder styr på hvad der skal køres ud fra program counteren

- 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

- Nedenstående er et billede på hukommelsen og hvordan de forskellige statements ligger deri og hvordan de


bliver behandlet:

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.

- Både den geometriske og det grafiske applikation arbejder på et rektangel.


- GUI kontrollere den grafiske applikation
- To metoder i rektangel klassen, en til at beregne arealer og en til at tegne figuren.
- Dette kan laves om så der er to rektangel klasser, en til at tegne rektanglet og en til at regne arealet.

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

- Nu kommer der en ændring i kravspecifikationen.


- Der er kommet en ny printer.
- Denne printer printer ikke længere i karakterer men i linjer.
- Dette skal nu ændres i teksteditor klassen.
- Dette viser at teksteditoren ikke er lukket for ændringer.
- Der skal ændres heri hvis der ændres i andre klasser som er i modstrid med Open-close princippet.

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.) .

- Vi har et program som forventer en bestemt opførsel.


- Man skal kunne lave en subklasse af T uden at der sker noget uventet.

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.

- Høj niveau moduler må ikke være afhængige af lav niveau moduler.


- Vores system er højt niveau.
- Ud fra denne defineres nogle interfaces, her to, en hvor man kan hente temperaturen og en
hvor man kan regulere temperaturen.
- Derfra laves de afledte klasser.
- For temperaturreguleingsklassen ligger derunder vindue og varmer interfaces og klasser.
- Dette kunne laves i en lagdeling.
- Den laveste er der hvor der ligger drivere
- Den mellemste er der hvor reguleringerne foregår

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.

- Generel problemstilling (provider = subjekt, consumer observer):

- Provider informerer Consumer når data ændres:

ITS side 98
Provider informerer Consumer når data ændres:

- Consumer forespørger Provider periodisk:

- Også kaldet Publish-Subscribe


- Definerer et en til mange forhold mellem objekter sådan at en ændring i et objekts tilstand medfører
at de mange objekter informeres om ændringen og opdateres automatisk.

Eksempel

- De forskellige måder at vise en procentfordeling på skal bruge informationerne af fordelingen.


- De informationer der bliver ændret skal kunne publiceres i de andre klasser der viser fordelingen
grafisk.

Hvornår bruges Observer?


- Når en abstraktion har to aspekter, det ene afhængig af den anden.
- Ved indkapsling af disse aspekter i separate objekter kan du variere og genbruge dem
selvstændigt.
- Når en ændring i et objekt kræver ændring i andre, og du ikke ved, hvor mange objekter, der skal
ændres.
- Når et objekt skal kunne underrette andre objekter uden at vide, hvem disse objekter er.

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.

Push eller pull


- To forskellige måder at sørge for at observeren får informationer
Push

- Subjektet skubber alle informationer til observeren så observere selv skal sortere i disse oplysninger.

Pull

ITS side 100


- Sendes en notify til observeren så observeren selv skal hente informationerne så den selv kan vælge
hvilke infomationer den gerne vil have.

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å.

Hvornår bruges strategy?


- Når adfærd for et objekt ændres over tid.

- Fordele:
- Flytter adfærd ud af klienten

ITS side 101


- Flytter adfærd ud af klienten
- Letter tilføjelsen af anden adfærd
- Gør koblingen mindre

Semester projekt

Fordele ved mønstre


- Genbrug af design
- Fælles sprog for design
- Letter arbejdet med dokumentation
- Hjælper ved restrukturering af system (refactoring)

ITS side 102


Delegates STATIC METODER BRUGES NÅR DER IKKE ER ATRIBUTTER
7. oktober 2014 08:20

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)
{

}

- Instans metoder (metoder der laves i klasser)


string AddPrint(int a, int b)
{

}

string SubPrint(int a, int b)


{

}

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

ITS side 103


- Enhver delegate har en InvokationList med de metoder, der er knyttet til den
Delegate[] liste = delObj.getInvokationList();

- Angiver hvilke metoder der er tilknyttet delegaten

ITS side 104


Konfiguration ToLower() laver alle bogstaverne i en variable små, så
21. oktober 2014 08:12 det kan være tolerant over for fejl med store bogstaver

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

ITS side 105


Distribuerede systemer
28. oktober 2014 08:16

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

- Hardwaren (elektronik) og softwaren udgør tilsammen IT (Informations Teknologi)


- Der kan være forbindelse mellem to computere
- Systemet der nu er koblet sammen kaldes et informationssystem (IS).

Softwarearkitektur - Computerne er ikke vist her

ITS side 106


Softwarearkitektur - Computerne er ikke vist her

- Program = Komponenter + Forbindelser

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

ITS side 107


Object-based architectures

Event-based architectures

Data-centered architectures

- Her kommer nogle vigtige paradigmer (fremgangsmåde)


- For at oprette en forbindelse mellem nogle computere skal softwaren på de forskellige

ITS side 108


- For at oprette en forbindelse mellem nogle computere skal softwaren på de forskellige
computere:
○ Kunne finde hinanden
○ Og i øvrigt kunne snakke sammen (samme sprog)

Client-Server Paradigmet - C/S Paradigmet


1. Deltagere: Server og Client med forbindelse til et fælles netværk.
2. Server åbner en forbindelse til netværket og stiller sig op og venter på et opkald
3. Client, der kender Servers forbindelse, giver et opkald til Server.
4. Server og Client opretter og har nu en indbyrdes forbindelse
5. Nu kan forbindelse mellem Server og Client bruges
6. I C/S paradigmet er Server passiv og Client aktiv omkring oprettelse af netværksforbindelsen.

- Client og Server kan have en anden betydning.


- Her ser man på, hvordan netværksforbindelsen fra C/S paradigmet bruges.

Server og Client forhold funktionsbestemt


- Server er den del som tilbyder en service/ kan løse en opgaver for andre
- Client er den del som bruger en service /opgaveløsning fra en Server
- Forholdet mellem Client og Server aftales via en protokol, som fortæller hvem der kan hvad, og
hvordan dette “hvad” så udføres
- Forholdet mellem hvem der tilbyder en service (Server) og hvem der bruger en service (Client) kan
vendes uafhængigt af Client og Server i C/S paradigmet, det kan altså skifte mellem de to
komponenter.
- Derfor omtales de funktionsbestemte Serverere og Clienter typisk som
- Service Provider (Server der tilbyder funktioner)
- Service Requester (Client som efterspørger og bruger funktioner)

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.

ITS side 109


Multitiered Architectures
- The simplest organization is to have only two types of machines:
- A client machine containing only the programs implementing (part of) the user-interface level
- A server machine containing the rest,
○ the programs implementing the processing and data level

Alternative client-server organizations

An example of a server acting as client

ITS side 110


- Client og server skifter for application server.

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.

Eksempel på infrastruktur E-mail: Simpel model

- 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.

Koordinationsmodel Distribueret System

ITS side 111


Mobil IT
- Mobile Computing: Computere som nemt kan flyttes og/eller er i bevægelse, når de arbejder.
- Hvilke computere?
- Laptop computer, PC’er
- Netbook
- Smartphone og mobiltelefon
- Tablet Computer
- Et digital armbåndsur
- Flydende grænser omkring de forskellige typer
- Forbindelsen mellem mobile computere
- Via kabler
- Begrænset mobilitet m.h.t. afstand og bekvemmelighed
- Trådløs via lyssignaler eller radiosignaler.
- Meget bekvemmeligt men Signal/Støjforhold (SNR) bestemmer afstanden og datakapaciteten
mellem computerne.

ITS side 112


Data Transfer Formats
6. november 2014 12:23

- 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

ITS side 113


XML
30. oktober 2014 13:35

- Extensible Markup Language


- I distribuerende systemer skal udveksles informationer softwarekomponenter imellem, dette gøres i
XML-sproget.
- XML indeholder kun data:
- F.eks. En hjemmesides struktur er opbygget af HTML, CSS benyttes til dens design,
formattering og layout og XML bruges til at indeholde data der hentes ind i HTML dokumentet
og præsenteres.

Hvad vil vi bruge XML til?


- Permanent opbevaring af objekters status på filsystemet
- Erstatte en relationel database
- Som konfigurationsdata til en applikation
- Kan rettes i en simpel editor
- Som udvekslingsformat for beskeder og data mellem en og anden eller flere applikationer.
- Det er forholdsvist nemt at beskrive et format alle kan forstå

Programmering af App’s og XML


- Der findes en del forskellige paradigmer for, hvorledes man arbejder programmatisk med et XML
dokument.
- Hvilket afhænger dels af:
- Hvilket sprog man koder i.
- Hvilken model man ligger ind over XML dokumentet, hvilket igen er afgørende for
- Hvilket hjælpe API man bruger for at
- Søge
- Læse
- Skrive
- Ændre i XML dokumentet.

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

ITS side 114


Datamodeller for persistering
- Logisk modeller som vi bruger til at organisere vores data til brug i vores applikationer
- Konkrete modeller som vi bruger til at programmere efter, når vi implementerer koden til vores
applikationer.

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

HTML vs. XML


- XML erstatter ikke HTML
- XML og HTML blev designet med to forskellige mål:
- XML blve designet til at beskrive data med fokus på hvad data er
- HTML blev designet til at vise data, med fokus på hvordan data ser ud
- HTML: At vise af data
- XML: At indeholde data
- Eksempel:
- Note til Tove fra Janni med overskriften "Reminder" og teksten "Don't forget me this
weekend!"
- Tags i dette XML-eksempel: <note>, <to>, <from>, <heading> og <body> og deres lukke-tags
</to> osv.

ITS side 115


- Dette XML-eksempel indeholder kun data, den GØR ikke noget
- For at sende denne besked skal der laves et softwareprogram der kan det

Hvordan bruges XML?


- Simplificerer data opbevaring og deling
- Adskiller data fra HTML, det er besværligt at skulle ændre HTML koden hver gang noget data
ændres.
- Data opbevares i seperate XML-filer
- XML data opbevares i textfiler så data bliver opbevaret udafhænigt af software og hardware
- Dette gør det nemmere at oprette data der kan deles mellem flere forskellige applikationer
- Simplificerer data transporten
- Simplificerer opgraderinger af applikationer
- Gør data lettilgængelig for alle former for "læsnings-maskiner"

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

ITS side 116


Træstruktur
3. november 2014 11:10

- 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.

- Et XML dokument SKAL have et root element


- Dette element er parent til alle de andre elementer
- Alle elementer kan have child elementer (sub-elementer)

- 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)

- Alle elementer kan have tekstindhold og attributter

Eksempel

ITS side 117


- Ovenstående er én bog i XML dokumentet nedenunder:

- Root: <bookstore>
- <bookstore> indeholder <book>'s
- <book> har 4 child elementer:
○ <title>
○ <author>
○ <year>
○ <price>

ITS side 118


XML DOM
3. november 2014 11:26

- 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.

Hvad er XML DOM?


- En standart objekt model for XML
- Et standart programmerings interface for XML
- Platform- og sprog-uafhængig
- XML DOM er en standart for hvordan man får, ændrer, tilføjer eller sletter XML elementer.

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

- Text nodes: carry the actual contents, leaf nodes


- Element nodes: define hierarchical logical groupings of contents, each have a name
- Attribute nodes: unordered, each associated with an element node, has a name and a value
- Comment nodes: ignorable meta-information
- Processing instructions: instructions to specific processors, each have a target and a value
- Root nodes: every XML tree has one root node that represents the entire tree

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

ITS side 119


- Root node: <bookstore>
- <bookstore> indeholder 4 <book> nodes
- Den første <book> har 4 nodes:
- <title>
- <author>
- <year>
- <price>
- Disse indeholder text nodes:
○ "Everyday Italian"
○ "Giada De Laurentiis"
○ "2005"
○ "30.00"

- Ifølge DOM er XML altid i nodes.


- Elementer indeholder IKKE tekst, men tekst nodes hvori teksten opbevares
- Eksempel:
<year>2005</year>
- Element noden <year> indeholder en text node med værdien "2005".
- "2005" er altså IKKE værdien af <year> elementet!

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 fra XML træstruktur

ITS side 120


- I en node træstruktur kaldes toppen root
- Hver node, undtagen root, har præcis én parent node
- En node kan have hvilket som helst nummer child nodes
- Et leaf er en node uden child nodes
- Siblings er nodes med samme parent node.

Eksempel

ITS side 121


- Runde hjørner er elementerne i XML
- De skarpe hjørner er text content eller atributter.

ITS side 122


Syntaks
3. november 2014 11:58

Alle elementer skal have et lukke-tag


- NEJ! (men JA i HTML)

- 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

Tags kan kende forskel på store og små bogstaver

Tags skal startes og sluttes i den rigtige rækkefølge


- NEJ! (men JA i HTML)

- JA!

XML dokumenter skal have et root-element som er parent til alle andre elementer

Attribut-værdier skal være i citationstegn


- NEJ! (men JA! I HTML)

- JA!

Nogle tegn er defineret i XML og har anden betydning


- Disse kan skrives med en entity reference:

ITS side 123


- Hvis dette skrives i et XML element hvis dette medføre en fejl

Kommentarer

Space
- Hvis der laves to space, vil disse ikke omgenereres til ét, der vil forbilde to spaces

Ny linje
- LF

ITS side 124


Elementer
3. november 2014 12:47

- Et XML dokument indeholder XML elementer

Hvad er et XML element?


- Et XML element er alt fra og inklusiv elementets start-tag til og inklusiv elementets slut-tag
- Et element kan indeholde:
- Andre elementer
- Tekst
- Attributter
- Eller et mix af dem alle

Eksempel

- <bookstore> og <book> har element contents fordi de indeholder elementer


- <book> har også en attribut
- <title>, <author>, <year> og <price> har text content for de indeholder tekst

Tomme XML elementer


- Hvis et XML element ikke har noget indhold kan elementet være selv-lukkende:

- 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:

ITS side 125


XML elementer kan udvides
- XML elementer kan udvides til at bære mere information.
- Eksempel:

- Til dette udvikles en software der kan udtrække <to>, <from>, <body> elementerne fra XMl
dokumentet og producerer dette output:

- Til XML dokumentet tilføjes flere informationer:

- Applikationen kan stadig finde de oprindelige elementer og software applikationen vil derfor
ikke crashe.

- Del informationen op i så små bidder som muligt:


- Her er datoen med dag, måned og år i det samme element <date>:

- Her er date-elementet delt op i flere elementer:

ITS side 126


ITS side 127
Attributter
3. november 2014 13:09

- XML elementer kan have attributter


- Attributter giver flere informationer omkring elementet
- Attributter giver ofte information omkring elementet som ikke er en del af dataet
- Eksempel:

- Her er filtypen irrelevant for dataet, men kan være vigtigt for software applikationen

Attributter skal være i citationstegn


- Attributværdier skal være i citationstegn (enten " eller ', det er ligemeget)

- Hvis der i attributtens værdi er " " kan ' ' bruges:

- Eller der kan bruges entity references:

Elementer vs. attributter


- Der er ingen regler om hvornår der må bruges elementer eller attributter.
- Det anbefales at der ikke bruges attributter i XML, disse er gode i HTML
- Problemer med attributter i XML:
- Attributter kan ikke indeholde flere værdier (det kan elementer)
- Attributter kan ikke indeholde træstrukturer (elementer kan)
- Attributter kan ikke nemt udvides til fremtidige ændringer
- Attributter er svære at læse og vedligeholde.
- Brug elementer til data
- Brug attributter til information som ikke er relevant til dataet.

Attributter til metadata (data om data)


- ID referencer er tit tildelt elementer hvilket kan hjælpe med at identificere disse

- ID attributten er for at identficere XMl elementet, den er ikke en del af selve noten

- Data skal opbevares i elementer


- Metadata (data om data) skal opbevares i attributter (information der beskriver elementet)

ITS side 128


Namespaces
3. november 2014 13:31

- Namespaces i XMl sammenhæng er til for at undgå navne konflikter

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:

- Dette XML dokument indeholder informationer omkring et bord:

- Disse indeholder begge <table>, så hvis disse skulle sammenflettes ville der være en navne konflikt,
som en XML applikation ikke kan løse

- For at løse navne konflikter kan der bruges et navn prefix:

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:

ITS side 129


- Når et namespace bliver defineret for et element, vil alle child elementer med det samme prefix
blive associeret med det sammen namespace.
- Namespaces kan også defineres i root elementet:

- 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:

- Eksempel fra før:

ITS side 130


ITS side 131
Encoding
3. november 2014 13:54

- 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.

UTF-8 - Web Standart


- UTF-8 er standart character encoding på nettet.
- UTF-8 er default character encoding for HTML5, CSS, JavaScript, PHP, SQL, and XML.

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 sofware skal både kunne forstå UTF-8 og UTF-16


- UTF-8 er default for dokumenter uden encoding information.

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

ITS side 132


JSON
3. november 2014 14:14

- JSON: JavaScript Object Notation.


- JSON er letvægts dataudveksling
- JSON er en syntax for opbevaring og udveksling af data.
- JSON er et alternativ til XML.
- JSON er selvbeskrivende
- JSON er sproguafhængigt

Eksempel
- Nedenstående definere et array med 3 employee objekter:

- Dette er det tilsvarende i XML:

- JSON er sprog uafhængigt


- Dog bruger JSON JavaScript syntaksen, men formatet er kun tekst ligesom XML
- JSON er selvforklarende og let at forstå.

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)

Ikke ligesom XML


- JSON bruger ikke tags
- JSON er kortere
- JSON er hurtigere at læse og skrive
- JSON kan bruge arrays

- 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

ITS side 133


Syntaks
3. november 2014 15:43

- JSON syntaksen er en del af JavaScript syntaksen

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:

- I ovenstående indeholder arrayet "employees" indeholder tre objekter.

- Arrays inde i et objekt:

JavaScript syntaks
- Fordi JSON bruger JavaScript syntaksen skal denne ikke bruge en ekstra software for at arbejde med
JSON i JavaScript.

ITS side 134


JSON i JavaScript.
- Med JavaScript kan man oprette et array af objekter og tildele data til det sådan her:
- Eksempel:

○ Den første linje data i arrayet kan tilgås således:

○ Det der returneres er dette:

○ Disse kan ændres således:

ITS side 135


Hvordan bruges JSON
5. november 2014 16:26

- 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.

Example - Objekt fra string


- At oprette en JavaScript string indeholdende JSON syntax:

- JavaScript funktionnen JSON.parse(tekst) kan bruges til at konverterer en JSON tekst til et JavaScript
objekt.

- Dette nye JavaScript objekt på en webside:

- Æ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().

ITS side 136


http
5. november 2014 16:38

- 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:

2. Opret en JavaScript funktion til at vise arrayet.


Opret en funktion myFunction() som kører igennem arrayet og viser indholdet som HTML links:

ITS side 137


Kald myFunction med myArray som parameter:

3. Opret en tekstfil
Læg arrayet i en fil med navnet myTutorials.txt:

4. Læs tekstfilem med et XMLHttpRequest


Skriv et XMLHttpRequest som læser tekstfilen og bruger myFunction() til at vise arrayet:

ITS side 138


Funktions filer
5. november 2014 16:57

- 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

2. Opret en JavaScript metode til at vise arrayet


Metoden skal gennemløbe array objekterne og vise indholdet som HTML links

Kald funktionen med arrayet som parameter

3. Brug et array som parameter


Kald metoden med et array som parameter

ITS side 139


4. Læg metodekaldet i en ekstern js-fil

Tilføj det eksterne script til siden i stedet for metodekaldet:

ITS side 140


Skemaer
11. november 2014 08:21

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

Hvorfor bruge skemaer


- De kan skrives selv (ligesom XML)
- Kan selv tjekke at det ser rigtigt ud
- Formelle beskrivelser, men som kan læses af mennesker
- Både XML-filen med data, træstrukturen og skema-filen med reglerne er læselige for mennesker og
kan skrives i en simpel text editor
- Data validation kan ske med eksisterende skema processorer
- Det kræver en besetmt teknik for at konverterer menneskelig læseligt tekst til computer
information.

Regulærer udtryk (Regular Expressions)


- Matchingsprog der bruges til at sammenligne tekststrenge.
- Brugt i skema sprog til at beskrive sekvenser af karakterer eller elementer.
- : Et alfabet, typisk unicode karakterer eller elementnavne)
- : matcher strengen
- : matcher nul eller en

ITS side 141


- : matcher nul eller en
- *: matcher nul eller flere 'er
- : matcher en eller flere 'er
- : matcher
- : matcher eller

Eksempel
- Regulær udtryk 1:
- d udtrykkes som:

- Regulær udtryk 2, bruger d'er:


- Dato udtrykkes som:

- Dato tillader datoer at være som:

- Regulær udtryk som beskriver tal:


*
- Ud fra denne kan man vælge at skrive:
0 eller (minus eller ikke minus) og et af tallene i den første parrentes (som SKAL være der) og
ingen eller mange af tallene i den anden parrentes.
- F.eks.:
○ 0
○ 102
○ 934501
○ 6
- Regulær udtryk som beskriver tabel indhold:

- Læser fra højre mod venstre:


○ Der må være en til mange tr og en til mange tbodies
○ Der må være nul til en tfoot og nul til en thead
○ Der må være nul eller flere colgroup og nul til flere col
○ Der må være nul til en caption

ITS side 142


DTD
20. november 2014 16:43

- 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

Intern DTD erklæring


- Hvis DTD er erklæret inde i XML filen skal den være i en DOCTYPE definition med følgende syntaks:

Eksempel på XML dokument med intern DTD erklæring

- Ovenstående skal tolkes således:


- !DOCTYPE note: Definerer at root elementet af dokumentet er note
- !ELEMENT note: Definerer at note elementet indeholder fire elementer
"to,from,heading,body".
- !ELEMENT to definerer to elementet til at være af typen #PCDATA
- !ELEMENT from definerer from elementet til at være af typen #PCDATA
- !ELEMENT heading definerer heading elementet til at være af typen #PCDATA
- !ELEMENT body definerer from body til at være af typen #PCDATA

Ekstern DTD erklæring


- Hvis DTD er erklæret i en ekstern fil, skal den være i en DOCTYPE definition medfølgende syntaks:

Samme eksempel som før, men med ekstern DTD erklæring

- note.dtd indeholder DTD'en og ser således ud:

Hvorfor bruge DTD?


- Med DTD er der til hver XML fil en specifik beskrivelse af dens format
- Med DTD kan uafhængige grupper af mennesker blive enige om en standart DTD for fælles data

ITS side 143


- Med DTD kan uafhængige grupper af mennesker blive enige om en standart DTD for fælles data
- DTD kan validerer at data modtaget udefra er korrekt syntaks.
- DTD kan validerer dit eget data.

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

ITS side 144


Elementer
20. november 2014 16:45

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:

Elementer med parsed character data


- Elementer som kun indeholder parsed character data er erklæret med #PCDATA i parenteser:

Elementer med hvilket som helst indhold


- Elementer som indeholder hvilken som helst kombination af parsable data erklæres med ANY:

Elementer med children


- Elementer med et eller flere children er erklæret med child elementets navn i parenteser:

- 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

ITS side 145


- I en fuld erklæring skal child elementerne også erklæres
- Child elementerne kan også have child elementer
- Eksempel med note fra eksemplet over:

Erklæring af én forekomst af et element

- Ovenstående eksempel erklære at childelementet "message" kun må forekomme én gang og kun


inde i "note elementet.

Erklæring af minimum én forekomst af et element

- + i eksemplet ovenover erklærer at child elementet "message" skal forekomme én eller flere gange
inde i "note" elementet

Erklæring af ingen eller flere forekomst af et element

- * i eksemplet ovenover erklærer at child elementet "message" kan forekomme ingen eller flere
gange inde i "note" elementet

Erklæring af ingen eller én forekomst af et element

- ? 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

ITS side 146


element, et "header" element og enten et "message" eller et "body" element

Erklæring af forskelligt indhold

- I eksemplet overnover erklæres det at "note" elementet kan indeholde ingen til flere forekomster af
PCDATA, "to", "from", "header" eller "message" elementer.

ITS side 147


Attributter
20. november 2014 17:12

Erklæring af attributter
- I DTD erklæres attributter med ATTLIST
- Syntaks:

- Attributtyperne kan være en af følgende:


Type Beskrivelse
CDATA Værdien er character data
(en1|en2|..) Værdien skal være en fra en enumerated liste
ID Værdien er et unik ID
IDREF Værdien er id'et fra et andet element
IDREFS Værdien er en liste af andre id'er
NMTOKEN Værdien er et valideret XML navn
NMTOKENS Værdien er en liste af validerede XML navne
ENTITY Værdien er en entities
ENTITIES Værdien er en liste af entites
NOTATION Værdien er et notations navn
xml: Værdien er en foruddefinderet xml værdi

- Attributværdierne kan være en af følgende:


Value Explanation
value Default værdien af en attribut
#REQUIRED Attributten er obligatorisk
#IMPLIED Attributten er valgfri
#FIXED value Attribut værdien er fixed

Default attribut værdi

- 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.

ITS side 148


- 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

Enumerated attribut værdier


- Syntaks:

ITS side 149


- Syntaks:

- 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.

ITS side 150


Entities
20. november 2014 17:34

- 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

Intern entities erklæring


- Syntaks:

- Eksempel:

- En entiti har tre dele: et og-tegn (&), et entiti navn og et semikolon (;)

Ekstern entities erklæring


- Syntaks:

- Eksempel:

ITS side 151


XSD
21. november 2014 08:54

- XML skema er et XML-baseret alternativ til DTD


- Et XML skema beskriver strukturen af XML dokumentet
- Sproget XML skemaet skrives i kaldes XML Skema Definition (XSD)

Hvad er et XML skema?


- Meningen med et XML skema er at definerer bygge blokkene til et XML dokument, ligesom DTD.
- Et XML skema:
- Definerer elementer der kan være i dokumentet
- Definerer attributter der kan være i dokumentet
- Definerer hvilke elementer der er child elementer
- Definerer ordenen af child elementer
- Definerer nummeret af child elementer
- Definerer om et element er tomt eller kan indeholde tekst
- Definerer datatyper for elementer og attributter
- Definerer default og fixed værdier for elementer og attributter

XML skemaer efterfølger DTD'er


- XML skemaer overtager brugen af DTD'er fordi:
- XML skemaer er udvidelige til fremtidige versioner
- XML skemaer er rigere og mere kraftfuld end DTD'er
- XML skemaer er skrevet i XML
- XML skemaer kan bruge datatyper
- XML skemaer kan bruge namespaces

XML skemaer kan bruge datatyper


- Med brug af datatyper:
- Er det nemmer at beskrive tilladt indhold i dokumentet
- Det er nemmere at verificere om dataet er korrekt
- Der er nemmere at arbejde med data fra en database
- Det er nemmere at definere begrænsninger for data
- Det er nemmere at definere datamønstre
- Det er nemmere at konvertere data imellem forskellige datatyper

XML skemaer bruger XML syntaks


- Fordelene ved at XML skemaerne er skrevet i XML:
- Man skal ikke lære et nyt sprog
- Man kan bruge sin XML editor til at ændre skema filerne
- Man kan bruge sin XML parser til at parse skema filen
- Man kan manipulere skemaet med XML DOM
- Man kan transformere skemaet med XSLT

XML skemaer sikre data kommunikaiton


- Når man sender data fra en sender til en modtager er det vigtigt at begge parter har de samme
forventninger omkring indholdet.
- Med XML skemaer kan sendere beskrive data på en måde som modtageren vil forstå
- En dato som: "03-1-2004" vil i nogle lande blive fortolket som d. 3. november og i andre lande som
11. marts.
- Et XML element med en datatype som denne:
<date type="date">2004-03-11</date>
sikre at der er en fælles forståelse af indholdet fordi XML datatypen "date" kræver at formatet
er:
"YYYY-MM-DD"

ITS side 152


"YYYY-MM-DD"

XML skemaer kan udvides


- XML skemaer kan udvides fordi de er skrevet i XML.
- Ved at kunne udvides kan man:
- Genbruge skemaer i andre skemaer
- Oprette sine egne datatyper ud fra standart datatyper
- Referere til flere skemaer i det samme dokument

Well-Formed er ikke nok


- Et well-formed XML dokument er et dokument der er i overensstemmelse med XML syntaksen:
- Det skal begynde med XML erklæringen
- Det skal have et unikt root-element
- Start-tags skal have matchende slut-tags
- Alle elementer skal være lukkede
- Alle elementer skal være indlejret
- Alle attribut værdier skal være i citationstegn
- Entities skal bruges for specielle karakterer
- Selvom dokumentet er well-formed kan der stadig forekomme fejl

Et simpelt XML dokument

Tilhørende DTD fil

- 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"

Tilsvarende XML skema

ITS side 153


- Note elementet er en kompleks type da det indeholder andre elementer
- De andre elementer (to, from, heading, body) er simple typer fordi de ikke indeholder andre
elementer

Reference til DTD

Reference til XML skema

<schema> elementet
- <schema> elementet er root elementet for alle XML skemaer:

ITS side 154


- <schema> elementet kan indeholde attributter
- Erklæringen ser ofte således ud:

- Følgende:

- indikerer at elementerne og data typerne brugt i skemaet kommer fra


"http://www.w3.org/2001/XMLSchema" namespaceet.
- Det specificerer også at elementer og datatyper kommer derfra skal være prefixed med xs:

- Følgende:

- indikerer at elementer defineret i dette skema (note, to, from, heading, body) kommer fra
"http://www.w3schools.com" namespaceet.

- Følgende:

- indikerer at default namespacet er "http://www.w3schools.com".

- Følgende:

- indikerer at alle elementer der bliver brugt af XML instans dokumentet som erklæres i dette skema
skal være namespace qualified.

Reference til et skema i et XML dokument


- Dette XMl dokument har en reference til et XML skema:

- Følgende:

ITS side 155


- Følgende:

- specificerer default namespace erklæringen.


- Denne erklæring fortæller skema-validator at alle elemeneterne i XML dokumentet er erklæret i
"http://www.w3schools.com" namespacet.
- Når man har XML skema instans namespacet tilrådighed:

- kan man bruge schemaLocation attributten.


- Dette attribut har to værdier, adskilt af mellemrum
- Den første værdi er namespacet
- Den anden værdi placeringen af XML skemaet der skal bruges til namespacet:

ITS side 156


Simple typer
21. november 2014 09:02

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

Definering af et simpelt element


- Syntaksen til at definere et elemet er:

- Her er xxx navnet på elementet og yyy er data typen.

- XML skemaer har mange indbyggede datatyper.


- De mest almindelige typer er:
- xs:string
- xs:decimal
- xs:integer
- xs:boolean
- xs:date
- xs:time
- Eksempel
- Her er nogle XML elementer:

- Her er element definitionerne i et XML skema:

Default og fixed værdier for simple elementer


- Simple elementer kan have en default værdi ELLER en fixed værdi specificeret.
- En default værdi tilskrives automatisk til elementet når ingen andre værdi specificeres
- I det følgende eksempel er default værdien "red":

- 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.

Hvordan defineres en attribut?


- Syntaksen for at definere en attribut er:

ITS side 157


- Her er xxx navnet for attributten og yyy specificerer datatypen.
- XML skemaer har mange indbyggede datatyper
- De mest almindelige er:
- xs:string
- xs:decimal
- xs:integer
- xs:boolean
- xs:date
- xs:time
- Eksempel
- Her er et XMl element med en attribut:

- Her er attribut definitionen i et XML skema:

Default og fixed værdier for attributter


- Attributter kan have default værdier eller fixed værdier specificeret.
- En default værdi tilskrives automatisk til attributten når ingen andre værdi specificeres
- I det følgende eksempel er default værdien "EN":

- 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":

Valgfrie og krævede attribitter


- Attributter er valgfrie
- For at specificere at attributten er krævet skal man bruge "use" attributten:

Begrænsninger for indholdet


- Når et XMl element eller attribut har en defineret datatype sætter det nogle begrænsninger til
elementets eller attributtens indhold.
- Hvis et XML element er af typen "xs:date" og indeholder en string som "Hello World" kan elementet
ikke valideres.
- Med XML skemaer kan man tilføje begrænsinger til XML elementer og attributter
- Disse begrænsninger kaldes facets.

Simple datatyper

ITS side 158


Begrænsninger
- Begrænsinger bruges til at definerer acceptable værdier for XML elementer eller attributter
- Begrænsninger for XML elementer kaldes facetter.

Begrænsninger for værdier


- I følgende eksempel defineres et element kaldet "age" med en begrænsning.
- Værdien for "age" indholdet må ikke være lavere end 0 eller højere end 120.

Begrænsninger for et sæt af værdier


- For at begrænse indholdet af et XML element til et sæt af acceptable værdier skal man bruge
enumeration begrænsningen.
- I følgende eksempel defineres et element kaldet "car" med en begrænsning.
- De eneste acceptable værdier er: Audi, Golf, BMW:

- Eksemplet kunne også skrives således:

ITS side 159


- I dette tilfælge kan typen "carType" bruges af andre elementer fordi det ikke er en del af "car"
elementet.

Begrænsninger for flere værdier


- For at begrænse indholdet af et XML element til at definere flere tal eller bogstaver, som kan blive
brugt, skal man bruge pattern begrænsningen.
- Det følgende eksempel definerer et element kaldt "letter" med en begrænsning.
- Den eneste acceptable værdi er én af de små bogstaver fra a til z:

- Det næste eksempel definerer et element kaldet "initials" med en begræsning.


- De eneste acceptable værdier er tre af de store bogstaver fra a til z:

- 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 et ellement kaldet "choice" med en begrænsning.


- Den eneste acceptable værdi er én af de følgende bogstaver: x, y eller z:

- Det næste eksempel definerer et element kaldet "prodid" med en begrænsning.


- De eneste acceptable værdier er fem tal i en rækkefølge og hvert tal skal være mellem 0 og 9:

ITS side 160


Andre begrænsninger for flere værdier
- I det følgende eksempel defineres et element kaldet "letter" med en begrænsning.
- Den acceptable værdi er 0 eller flere forekomster af 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 et element kaldet "gender" med en begænsning


- Den eneste acceptable værdi er "male" eller "female"

- Det næste eksempel definerer et element kaldet "password" med en begrænsning.


- Der skal være præcis otte karakterer efter hinanden og disse karakterer skal være små eller store
bogstaver fra a til z eller et tal fra 0 til 9:

Begrænsninger for whitespaces


- Til at specificere hvordan whitespaces skal behandlet skal man bruge whiteSpace begrænsningen.
- Følgende eksempel definerer et element kaldet "address" med en begrænsning.
- whiteSpace begrænsningen "preserve" (beholder) whitespaces således at XML processoren ikke
fjerne whitespaces:

ITS side 161


fjerne whitespaces:

- 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)

Begrænsninger for længde


- For at begrænse længden af en værdi i et element skal man bruge, "length", "maxLength" og
"minLength" begrænsningerne.
- I dette eksempel defineres et element kaldet password med en begrænsning.
- Værdi skal være præcis otte karakterer.

- 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.

Begrænsninger for datatyper

ITS side 162


Begrænsninger for datatyper
Begrænsning Beskrivelse
enumeration Definerer en liste af acceptable værdier.
fractionDigits Specificerer det maksimalt tilladte antal af decimaler. Denne skal være lig med
eller større end nul.
length Specificerer et præcist nummer af tilladte karakterer eller list items. Dette skal
være lig med eller større end nul.
maxExclusive Specificerer den øvre grænse for nummeriske værdier (værdien skal være mindre
end denne værdi)
maxInclusive Specificerer den øvre grænse for nummeriske værdier (værdien skal være mindre
end eller lig med denne værdi)
maxLength Specificerer maksimum antal af karakterer eller list items tilladt. Skal være lig med
eller større end nul.
minExclusive Specificerer den nedre grænse for nummeriske værdier (værdien skal være større
end denne værdi)
minInclusive Specificerer den øvre grænse for nummeriske værdier (værdien skal være mindre
end eller lig med denne værdi)
minLength Specificere minimum antal af karakterer eller list items tilladt. Skal være lig med
eller større end nul.
pattern Definerer den eksakte sekvens af karakterer der er accepteret.
totalDigits Specificerer det eksakte nummer af tal tilladt. Skal være større end nul.
whiteSpace Specificerer hvordan whitespaces skal håndteres.

ITS side 163


Komplekse typer
21. november 2014 09:10

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:

- Et kompleks element "employee" som kun indeholder elementer:

- Et kompleks element "food" som kun indeholder tekst:

- Et kompleks element "description" som indeholder både elementer og tekst:

Definering af et kompleks element


- Elementet "employee" indeholder andre elementer:

- Man kan definere et kompleks element i et XML skema på to foskellige måder:


1. "employee" elementet kan blive erklæret direkte ved at navngive elementet, således:

- 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:

ITS side 164


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:

Komplekse tomme elementer


- Et tomt XML element:

- "product" elementet ovenfor har intet indhold.


- For at definere en type uden indhold skal man definere en type der tillader elementer i sit indhold,
men man nå ikke erklære elementer:

ITS side 165


- I det ovenstående eksempel definerer vi en kompleks type med et kompleks indhold.
- Elementet "complexContent" signalerer at vi har til hensigt at begrænse eller udvide indholdet af en
kompleks type og begrænsningen af heltal erklære en attribut men introducerer ikke noget element
indhold.
- Der er dog muligt at erklære "product" elementet mere kompakt, 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:

- Man kan definerer "person" elementet i et skema, således:

- <xs:sequence> tag betyder at de definerede elementer ("firstname" og "lastname") skal fremstå i


den samme rækkefølge i et "person" element.
- Eller man kan give "complexType" elementet et navn og lade "person" elementet have en type
attribut som refererer til navnet på "complexType" (hvis man bruger denne metode kan flere
elementer referere til den samme komplekse type):

ITS side 166


Kun tekst
- Denne type indeholder simpelt indhold (tekst og attributter) hvorfor man kan tilføje et
simpleContent element rundt om indholdet.
- Når man bruger simplet indhold skal man definere en udvidelse eller begrænsning inde i
"simpleContent" elementet, således:

- 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:

- Følgende eksempel erklære en complexType "shoesize".


- Indholdet er definere som en talværdi og "shoesize" elementer kan også indeholde en attribut
"country":

- 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):

ITS side 167


referere til den samme komplekse type):

Blandet indhold
- Et XML element "letter" indeholder både tekst og andre elementer.

- Følgende skema erklære "letter" elementet:

- 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):

ITS side 168


Indikatorer
23. november 2014 20:54

- 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:

ITS side 169


Occurrence indikator
- Occurrence indikatorer bliver ofte brugt til at definere hvor ofte et element kan forekomme.
- For alle "Order" og "Group" indikatorer er default værdien for maxOccurs og minOccurs 1.

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":

ITS side 170


- Ovenstående XML fil indeholder et root element kaldt "persons"
- Inde i dette root element er der defineret tre "person" elementer.
- Hver "person" element skal indeholde et "full_name" element og de kan indehilde op til fem
"child_name" elementer.
- Nedenstående er skema filen "family.xsd":

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:

ITS side 171


- Man skal definere et all, choice eller sequence element inde i group erklæringen
- Følgende eksempel definerer en group med navnet "persongroup" som definerer en gruppe af
elementer der skal forekomme i en bestemt sekvens (rækkefølge):

- 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:

- Følgende eksempel definerer en attribute group med navnet "personattrgroup":

- Efter man har defineret en attribute group kan man refererer til det i en anden definition:

ITS side 172


ITS side 173
Udvidelse af elementer
23. november 2014 20:55

<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:

- Nu vil man udvide "person" elementet med et "children" element.


- Dette kan man gøre selvom udvikleren af XML skemaer ikke har erklæret noget "children" element.
- Følgende er en skema fil med navnet "children.xsd":

- Følgende XML fil (med navnet "Myfamily.xml") bruger komponenter fra to forskellige skemaer,
"family.xsd" og "children.xsd":

ITS side 174


- XML filen er korrekt fordi "family.xsd" skemaet tillader at udvide "person" elementet med et valgfrit
element efter "lastname" elementet.

<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:

- Nu vil man udvide "person" elementet med en "gender" attribut.


- Dette kan man gøre selvom udvikleren af XML skemaer ikke har erklæret nogen "gender" attribut.
- Følgende er en skema fil med navnet "attribute.xsd":

ITS side 175


- Følgende XML fil (med navnet "Myfamily.xml") bruger komponenter fra to forskellige skemaer,
"family.xsd" og "attribute.xsd":

- 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.

ITS side 176


Substitution
23. november 2014 20:55

- Med XML skemaer kan et element erstatte et andet element


- F.eks. Man har brugere for to forskellige lande: England og Danmark
- Man vil gerne have mulighed for at brugeren kan vælge om han eller hun vil have danske element
navne eller engelske element navne i XML dokumentet.
- For at løse dette problem kan man definere en substitutionGroup i et XML skema.
- Først erklæres hoved elementet og så erklæret de andre elementer som er mulige at erstatte
hovedelementet med:

- I ovenstående eksempel er "name" elementet hovedelementet og der er muligt at erstatte dette


med "navn" elementet.
- Nedenstående er en del af et XML skema:

- Et korrekt XML dokument (ifølge ovenstående skema) kan se således ud:

- Eller således:

Blokering af element substitution


- For at undgå at elementer erstatter et specifikt element kan der bruges block attributten:

- Hvis man kigger på denne del af et XML skema:

ITS side 177


- Et korrekt XML dokument (ifølge ovenstående skema) ser således ud:

- Men nedenstående er ikke længere korrekt:

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

ITS side 178


Serialization
24. november 2014 10:18

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

Hvordan erklæres en klasse serializable?


- I C# gøres en klasse serialiserbar ved at tilføje attributten [Serializable] til klassen.

ITS side 179


- Brug NonSerialized attributten på områder man ikke vil serialisere.

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

XML DATA FILES


XML Processing Options
XML serializing is just one way to work with XML data files – the .Net framework have several other
technologies to process XML data (found in or below ns: System.Xml):
•XmlReader Fast forward-only access to XML data.

ITS side 180


•XmlReader Fast forward-only access to XML data.
•XmlWriter Fast forward-only generate XML data.
•XmlDocument Implements the W3C DOM Level 1 Core and DOM Level 2 Core interfaces for reading
and creating XML documents.
•XPathNavigator Provides several editing options and navigation capabilities over XML in an
XmlDocument or an XPathDocument.
•LINQ to XML
XmlReader Example

XmlDocument Example

ITS side 181


ITS side 182
Web API
2. december 2014 08:21

Brug af komponenter og forbindelser


- TestNetXML er applikationen med (simpel applikation)
- NetXMLServer,
- NetXMLClient
- Common Library (Aftalegrundlaget mellem client og server)
○ Hvis client og server er skrevet i to forskellige sprog kan de ikke bruge common libary
- Er et ”prof of concept” der viser at
- man over Internettet kan sende
- en besked i et overordnet format/metaformat her XML
- fra et program (Serveren) til et andet program (Clienten)

Hvad mangler TestNetXML systemet?


- Der bruges en absolut minimumsprotokol hvor klientens opkald (Request) til serveren øjeblikkelig
medfører et og kun et bestemt svar (Response) fra serveren.
- Serveren har ingen information modtaget fra klienten inden den sender sit svar og klienten kan ikke
sende data til serveren.
- Der bruges en TCP (transport control protocol)/IP forbindelse/socket (socket er et api), som kun
sørger for at oprette og nedlægge en forbindelse der kan sende data mellem de to endepunkter.
- Mangler yderligere funktionalitet og kontrol for at kunne udføre en meningsfuld interaktion mellem
klient og server.
- Man kan ikke lave noget meningsfuldt kun med client/server fordi forbindelsen er meget primitiv.
- Hvis der skal skabes en fornudtig dialog mellem client/server er der er brug for en overbygning på
TCP/IP forbindelsen, som f.eks. et web api.

API (Application Programming Interface)


- I programmering af computere, er en programmeringsgrænseflade (et API) en samling af rutiner,
protokoller og værktøjer til at bygge programmer.
- Et API udtrykker en softwarekomponent i form af dennes metoder, input, output, og de
bagvedliggende typer.
- Et API definerer en række funktionaliteter, som per definition er uafhængige af deres respektive
implementeringer.
- Derved tillades det, at definition og implementering kan ændres uden at de derved
kompromittere hinanden.
- Et godt API gør det lettere at udvikle et program ved at give alle de nødvendige komponenter.
- Det er så en programmørs arbejde at sætte de forskellige komponenter sammen.
http://en.wikipedia.org/wiki/Application_programming_interface

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

ITS side 183


- Web API er en specialisering af Werb Service
- Specialiseringen består er en forenkling af Web Service
- Bruger en HTTP Server og client (HTTP Connection)
- Bruger Simpel Representational state transfer (REST), det vil sige at:
- Hvor Serveren ikke bekymrer sig som tilstande, klienten/-erne alene kontrollere tilstanden/-
ene
- Request og Response beskeder indeholder al information nødvendnig for at kunne ændre
tilstanden/-ene.

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

ITS side 184


ISO OSI 7 lags model

The Internet Control Suite

HTTP er vores kandidat som en Connection


- Håndterer Klient-Server session både m.h.t. oprettelse samt den efterfølgende interaktion
- Håndtere forskellige slags Forespørgsler og Svar (Requests/Responses)
- Bruge en tilstandsløs/stateless forbindelse (simpel administration)
- Har en meget fleksibel Header som tillader udveksling af kontroldata mellem Klient og Server.
- Tillader forskellig slags ”Nyttelast/Pay load”
- Er enormt udbredt og dermed en stabil og gennemprøvet teknologi
- Er supporteret ekstremt godt på de forskellige sprogplatforme (eks. .NET og Java)

ITS side 185


Eksamen
6. januar 2015 09:06

- Skriftlig del (24 timer):


- Hav design med!
- Tråde f.eks. i forbindelse med opdatering af GUI
- Man må gerne tage kode fra nettet og løsningsforlag så længe man forstår det og kan
redegøre hvorfra det kommer.
- Aflever som zip fil og dokumenter med kommentarer osv. ved siden af.
- Mundtlig del (30 minutter):
- Start med at fremlægge hvordan selve applikationen virker
- Powerpoint
- Fremlæg arkitekturen
- Fremlæg eventuelle beslutninger og ændringer man har taget undervejs
- Fokus på 3. semester pensum (ikke 2. semester)
- Forklar hvorfor man har/har ikke brugt 3. semester stof
- Fortæl hvilke ting man mener man kunne have gjort bedre

- 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?

ITS side 186

You might also like