Τι σημαίνει το γράμμα 'O' στο μοτίβο SOLID;
sobes.tech AI
Απάντηση από AI
Το 'O' σημαίνει την Αρχή Ανοιχτού/Κλειστού (Open/Closed Principle).
Τα modules (κλάσεις, συναρτήσεις κ.λπ.) πρέπει να είναι ανοιχτά για επέκταση, αλλά κλειστά για τροποποίηση. Αυτό σημαίνει ότι μπορείτε να προσθέσετε νέα λειτουργικότητα χωρίς να αλλάξετε τον υπάρχοντα κώδικα.
Παράδειγμα παραβίασης της αρχής:
// Πακέτο 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"
}
// Πακέτο calculator
type AreaCalculator struct{}
func (ac AreaCalculator) CalculateArea(shapes []Shape) float64 {
totalArea := 0.0
for _, shape := range shapes {
switch shape.Type() { // Πρέπει να τροποποιηθεί αυτός ο κώδικας όταν προστεθεί νέο σχήμα
case "rectangle":
// Λογική υπολογισμού επιφάνειας ορθογωνίου
case "circle":
// Λογική υπολογισμού επιφάνειας κύκλου
}
}
return totalArea
}
Όταν προστεθεί νέο σχήμα (π.χ. Τρίγωνο), θα χρειαστεί να τροποποιηθεί η συνάρτηση CalculateArea στο AreaCalculator για να χειριστεί τον νέο τύπο.
Παράδειγμα συμμόρφωσης με την αρχή:
// Πακέτο shape
type Shape interface {
Area() float64 // Προσθέτουμε τη μέθοδο Area() στο interface
}
type Rectangle struct {
Width, Height float64
}
func (r Rectangle) Area() float64 {
return r.Width * r.Height // Η λογική υπολογισμού της επιφάνειας είναι ενσωματωμένη στη δομή
}
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return 3.14 * c.Radius * c.Radius // Η λογική υπολογισμού της επιφάνειας είναι ενσωματωμένη στη δομή
}
// Πακέτο calculator
type AreaCalculator struct{}
func (ac AreaCalculator) CalculateArea(shapes []Shape) float64 {
totalArea := 0.0
for _, shape := range shapes {
totalArea += shape.Area() // Χρησιμοποιούμε πολυμορφισμό, χωρίς να γνωρίζουμε τον συγκεκριμένο τύπο
}
return totalArea
}
Σε αυτό το παράδειγμα, η προσθήκη ενός νέου σχήματος που υλοποιεί το interface Shape με τη μέθοδο Area(), δεν απαιτεί αλλαγή στον κώδικα στο AreaCalculator. Το AreaCalculator είναι ανοιχτό για επέκταση (προσθήκη νέων τύπων Shape), αλλά κλειστό για τροποποίηση (δεν απαιτούνται αλλαγές στον κώδικα κατά την προσθήκη νέων τύπων).
Αυτό επιτυγχάνεται μέσω της χρήσης πολυμορφισμού και ενσωμάτωσης της λογικής υπολογισμού της επιφάνειας σε κάθε τύπο σχήματος. Αυτή η αρχή προάγει τη δημιουργία πιο ευέλικτου, εύκολα συντηρούμενου και επεκτάσιμου κώδικα.