Øvelse 22 – Opretholdelse af invarians med konstruktøren
Source code
Person.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
namespace Invarians
{
public class Person
{
private string firstname;
private string lastname;
public Person(string firstname, string lastname)
{
//Tjek for null
if (string.IsNullOrWhiteSpace(firstname)) throw new ArgumentNullException(nameof(firstname), "Firstname må ikke være null eller tomt.");
if (string.IsNullOrWhiteSpace(lastname)) throw new ArgumentNullException(nameof(lastname), "Lastname må ikke være null eller tomt.");
// Tjek længder
if (firstname.Length > 20 || firstname.Length < 3) throw new ArgumentException("Firstname skal være mellem 3 og 20 karaktere langt.", nameof(firstname));
if (lastname.Length > 20 || lastname.Length < 3) throw new ArgumentException("Lastname skal være mellem 3 og 20 karaktere langt.", nameof(lastname));
//Regex tjek for at det kun er bogstaver
Regex regex = new Regex(@"^[A-Za-zÆØÅæøå]+$");
if (!regex.IsMatch(firstname)) throw new ArgumentException("Firstname må kun bestå af store og små bogstaver mellem a og å.", nameof(firstname));
if (!regex.IsMatch(lastname)) throw new ArgumentException("Lastname må kun bestå af store og små bogstaver mellem a og å.", nameof(lastname));
this.firstname = firstname;
this.lastname = lastname;
}
public string GetFirstName()
{
return firstname;
}
public string GetLastName()
{
return lastname;
}
}
}
Program.cs
using Invarians;
Person person = new Person("Egon", "Olsen");
Console.WriteLine($"{person.GetFirstName()} {person.GetLastName()}");
Reflekterende spørgsmål
- Hvordan sikrer håndhævelse af invarians gennem konstruktøren objektets integritet?
Det gør det ved at objektet aldrig kan oprettes uden at opretholde de regler som invarians kræver.
- Hvilken rolle spiller exceptions i valideringsprocessen i konstruktøren?
Den stopper eksekveringen og dermed oprettelsen hvis validering mislykkes.
- Hvorfor er det vigtigt at undgå at lade objekter eksistere i en ugyldig tilstand?
For at sikre integriteten i domænenet, altså man opretholder forretningslogikken.
- Hvordan relaterer immutability sig til sikker softwareudvikling og undgåelse af utilsigtede fejl?
Det sikrer at objekter ikke kan ændre efter oprettelse. Det sikrer dermed også at man ikke ved en fejl ændrer i objektets data andre steder i systemet.
- Hvordan kan denne tilgang med invarians og konstruktører forebygge sikkerhedsproblemer?
Hvis man tænker tilbage på eksemplet med bogbutikken som tillod et antal bestilte bøger på -1, så ville den sårbarhed aldrig have kunnet finde sted i tilgangen med invarians og konstruktør. Man sikrer altså at forretningslogikken / regler, som blev udformet i domænemodelleringen opretholdes i systemet.
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. |