Øvelse 27 – Opsamlende øvelse med domæneprimitiver
Source code
First name
RegistreringsNummer.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
namespace domæneprimitiver.primitives
{
public class RegistreringsNummer
{
private string value;
public RegistreringsNummer(string regNummer)
{
if (string.IsNullOrWhiteSpace(regNummer)) throw new ArgumentNullException(nameof(regNummer));
if (regNummer.Length != 7) throw new ArgumentException("Længde skal være 7.");
Regex regex = new Regex("^(?:[A-E H J-P R-V X-Z][A-E H J-P R-V X-Z]|O[A-E H J-P R-V X-Z])\\d{5}$");
if (!regex.IsMatch(regNummer)) throw new ArgumentException("Ugyldigt registreringsnummer.");
this.value = regNummer;
}
public string GetValue()
{
return value;
}
}
}
Farve.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
namespace domæneprimitiver.primitives
{
public class Farve
{
private string value;
public Farve(string farve)
{
if (string.IsNullOrWhiteSpace(farve)) throw new ArgumentNullException(nameof(farve));
//Længde valgt da specifikke farve navne på biler kan variere meget
if (farve.Length < 3 || farve.Length > 50) throw new ArgumentException("Farve skal være mellem 3 og 50 bogstaver langt.");
if (!Regex.IsMatch(farve, "^[a-zA-ZæøåÆØÅ]+$")) throw new ArgumentException("Farve må kun bestå af bogstaver.");
this.value = farve;
}
public string GetValue()
{
return value;
}
}
}
Årgang.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace domæneprimitiver.primitives
{
public class Årgang
{
private int value;
public Årgang(int årgang)
{
//Tillader årgange mellem 1886 til nuværende år + 1 år, da nogle årgange udkommer året før.
if (årgang < 1886 || årgang > DateTime.Now.Year + 1) throw new ArgumentOutOfRangeException(nameof(årgang), "Årgang skal være mellem 1886 og nuværende år + 1 år.");
this.value = årgang;
}
public int GetValue()
{
return value;
}
}
}
Bil.cs
using domæneprimitiver.primitives;
using System;
using System.Collections.Generic;
using System.Text;
namespace domæneprimitiver.entities
{
public class Bil
{
private RegistreringsNummer registreringsNummer;
private Farve farve;
private Årgang årgang;
public Bil(RegistreringsNummer registreringsNummer, Farve farve, Årgang årgang)
{
if (registreringsNummer == null) throw new ArgumentNullException(nameof(registreringsNummer));
if (farve == null) throw new ArgumentNullException(nameof(farve));
if (årgang == null) throw new ArgumentNullException(nameof(årgang));
this.registreringsNummer = registreringsNummer;
this.farve = farve;
this.årgang = årgang;
}
public string GetRegistreringsnummer()
{
return this.registreringsNummer.GetValue();
}
public string GetFarve()
{
return this.farve.GetValue();
}
public int GetÅrgang()
{
return this.årgang.GetValue();
}
}
}
Reflekterende spørgsmål
- Hvordan kan domæneprimitiverne bidrage til øget sikkerhed og robusthed i denne model?
Ved at sikre at de data/værdier der er på en bil altid er valideret og ikke kan ændres. Derfor kan man stole på dataene.
- Hvilke fordele og ulemper ser du ved at bruge domæneprimitiver i denne kontekst?
Fordelen er at man får opsat klare regler for de forskellige værdier, ulempen kan dog f.eks. være at det kræver lidt mere at oprette en ny bil da man nu også skal oprette de forskellige domæneprimitiver.
- Hvordan kan denne tilgang understøtte separation of concerns og forbedre testbarheden?
Man flytter f.eks. validering ud i egne klasser på selve domæneprimitivet. Dette giver derfor også mulighed for at teste for om den korrekte validering nu også er implementeret.
Kobling til standarder
| Element i øvelsen | Relateret standard / princip | Kommentar |
|---|---|---|
| Inputvalidering | ISO/IEC 27002:2022, afsnit 8.26 (applikationssikkerhed) | Anbefaler validering og integritetstjek af input til en applikation. |
| OWASP ASVS 5.0.0, kontrol 16.5 (Error Handling) | Krav om korrekt håndtering af fejl(undtagelser) | |
| Secure by Design (Johnsson et al.) | Fremhæver princippet om at skabe robuste domænemodeller og sikre objekters tilstand gennem konstruktion. Herunder domæne primitiver. |