Wat betekent de letter 'O' in het SOLID-patroon?
sobes.tech AI
Antwoord van AI
'O' betekent het Open/Gesloten Principe.
Modules (klassen, functies, enz.) moeten openstaan voor uitbreiding, maar gesloten zijn voor wijziging. Dit betekent dat je nieuwe functionaliteit kunt toevoegen zonder de bestaande code te wijzigen.
Voorbeeld van schending van het principe:
// Package shape
type Shape interface {
Type() string
}
type Rectangle struct{}
func (r Rectangle) Type() string {
return "rectangle"
}
type Circle struct{}
func (c Circle) Type() string {
return "circle"
}
// Package calculator
type AreaCalculator struct{}
func (ac AreaCalculator) CalculateArea(shapes []Shape) float64 {
totalArea := 0.0
for _, shape := range shapes {
switch shape.Type() { // Moet worden aangepast bij het toevoegen van een nieuwe vorm
case "rectangle":
// Logica voor het berekenen van de oppervlakte van een rechthoek
case "circle":
// Logica voor het berekenen van de oppervlakte van een cirkel
}
}
return totalArea
}
Bij het toevoegen van een nieuwe vorm (bijvoorbeeld, Driehoek), moet de functie CalculateArea in AreaCalculator worden aangepast om het nieuwe type te verwerken.
Voorbeeld van naleving van het principe:
// Package shape
type Shape interface {
Area() float64 // Voeg de methode Area() toe aan de interface
}
type Rectangle struct {
Width, Height float64
}
func (r Rectangle) Area() float64 {
return r.Width * r.Height // De logica voor het berekenen van de oppervlakte is ingekapseld in de structuur
}
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return 3.14 * c.Radius * c.Radius // De logica voor het berekenen van de oppervlakte is ingekapseld in de structuur
}
// Package calculator
type AreaCalculator struct{}
func (ac AreaCalculator) CalculateArea(shapes []Shape) float64 {
totalArea := 0.0
for _, shape := range shapes {
totalArea += shape.Area() // Gebruik polymorfisme, zonder het specifieke type te kennen
}
return totalArea
}
In dit voorbeeld vereist het toevoegen van een nieuwe vorm die de interface Shape implementeert met de methode Area(), geen wijziging in de code in AreaCalculator. AreaCalculator is open voor uitbreiding (nieuwe Shape-types toevoegen), maar gesloten voor wijziging (geen codewijzigingen bij het toevoegen van nieuwe types).
Dit wordt mogelijk gemaakt door gebruik te maken van polymorfisme en encapsulatie van de oppervlakteberekeningslogica binnen elk type vorm. Dit principe bevordert het creëren van flexibelere, onderhoudbare en uitbreidbare code.