Sobes.tech
Junior

Que signifie la lettre 'O' dans le motif SOLID?

sobes.tech IA

Réponse de l'IA

'O' signifie le principe Ouvert/Fermé (Open/Closed Principle).

Les modules (classes, fonctions, etc.) doivent être ouverts à l'extension, mais fermés à la modification. Cela signifie que l'on peut ajouter de nouvelles fonctionnalités sans modifier le code existant.

Exemple de violation du 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() { // Nécessite de modifier ce code lors de l'ajout d'une nouvelle forme
		case "rectangle":
			// Logique de calcul de l'aire du rectangle
		case "circle":
			// Logique de calcul de l'aire du cercle
		}
	}
	return totalArea
}

Lors de l'ajout d'une nouvelle forme (par exemple, Triangle), il faudrait modifier la fonction CalculateArea dans AreaCalculator pour gérer le nouveau type.

Exemple de respect du principe :

// Package shape
type Shape interface {
	Area() float64 // Ajout de la méthode Area() à l'interface
}

type Rectangle struct {
	Width, Height float64
}

func (r Rectangle) Area() float64 {
	return r.Width * r.Height // La logique de calcul de l'aire est encapsulée dans la structure
}

type Circle struct {
	Radius float64
}

func (c Circle) Area() float64 {
	return 3.14 * c.Radius * c.Radius // La logique de calcul de l'aire est encapsulée dans la structure
}

// Package calculator
type AreaCalculator struct{}

func (ac AreaCalculator) CalculateArea(shapes []Shape) float64 {
	totalArea := 0.0
	for _, shape := range shapes {
		totalArea += shape.Area() // Utilisation du polymorphisme, sans connaître le type précis de la forme
	}
	return totalArea
}

Dans cet exemple, l'ajout d'une nouvelle forme implémentant l'interface Shape avec la méthode Area(), ne nécessite pas de modification du code dans AreaCalculator. AreaCalculator est ouvert à l'extension (ajout de nouveaux types Shape), mais fermé à la modification (pas besoin de changer le code lors de l'ajout de nouveaux types).

Cela est rendu possible grâce à l'utilisation du polymorphisme et de l'encapsulation de la logique de calcul de l'aire dans chaque type de forme. Ce principe favorise la création d'un code plus flexible, maintenable et extensible.