Was bedeutet der Buchstabe 'O' im SOLID-Muster?
sobes.tech KI
Antwort von AI
'O' steht für das Open/Closed-Prinzip.
Module (Klassen, Funktionen usw.) sollten für Erweiterungen offen, aber für Änderungen geschlossen sein. Das bedeutet, dass neue Funktionalitäten hinzugefügt werden können, ohne den bestehenden Code zu verändern.
Beispiel für eine Verletzung des Prinzips:
// Paket 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"
}
// Paket calculator
type AreaCalculator struct{}
func (ac AreaCalculator) CalculateArea(shapes []Shape) float64 {
totalArea := 0.0
for _, shape := range shapes {
switch shape.Type() { // Es ist notwendig, diesen Code bei Hinzufügen einer neuen Form zu ändern
case "rectangle":
// Logik zur Berechnung der Rechteckfläche
case "circle":
// Logik zur Berechnung der Kreisfläche
}
}
return totalArea
}
Beim Hinzufügen einer neuen Form (z.B. Dreieck) müsste die Funktion CalculateArea in AreaCalculator geändert werden, um den neuen Typ zu behandeln.
Beispiel für die Einhaltung des Prinzips:
// Paket shape
type Shape interface {
Area() float64 // Hinzufügen der Methode Area() zur Schnittstelle
}
type Rectangle struct {
Width, Height float64
}
func (r Rectangle) Area() float64 {
return r.Width * r.Height // Die Flächenberechnung ist in der Struktur gekapselt
}
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return 3.14 * c.Radius * c.Radius // Die Flächenberechnung ist in der Struktur gekapselt
}
// Paket calculator
type AreaCalculator struct{}
func (ac AreaCalculator) CalculateArea(shapes []Shape) float64 {
totalArea := 0.0
for _, shape := range shapes {
totalArea += shape.Area() // Wir verwenden Polymorphismus, ohne den konkreten Typ zu kennen
}
return totalArea
}
In diesem Beispiel erfordert das Hinzufügen einer neuen Form, die die Schnittstelle Shape mit der Methode Area() implementiert, keine Änderung des Codes in AreaCalculator. AreaCalculator ist offen für Erweiterungen (Hinzufügen neuer Shape-Typen), aber geschlossen für Änderungen (keine Codeänderungen beim Hinzufügen neuer Typen).
Dies wird durch die Verwendung von Polymorphismus und Kapselung der Flächenberechnungslogik in jedem Formtyp erreicht. Dieses Prinzip fördert die Erstellung von flexiblerem, wartbarem und erweiterbarem Code.