Ποιο από τα principles SOLID σας είναι πιο δύσκολο να εφαρμόσετε στην πράξη;
sobes.tech AI
Απάντηση από AI
Αρχή αντικατάστασης της Barbara Liskov (LSP).
Η δυσκολία έγκειται στο γεγονός ότι η παραβίαση του LSP δεν είναι πάντα προφανής με την πρώτη ματιά και μπορεί να αποκαλυφθεί μόνο κατά τη χρήση υποκατηγοριών σε ένα πλαίσιο όπου αναμένεται η συμπεριφορά της βασικής κλάσης. Αυτό απαιτεί βαθιά κατανόηση της προβλεπόμενης συμπεριφοράς της βασικής κλάσης και σχολαστικά τεστ.
Παράδειγμα παραβίασης:
class Rectangle {
var width: Double = 0
var height: Double = 0
func setWidth(_ width: Double) { self.width = width }
func setHeight(_ height: Double) { self.height = height }
func area() -> Double { width * height }
}
class Square: Rectangle {
override func setWidth(_ width: Double) {
super.setWidth(width)
super.setHeight(width) // Παραβίαση LSP: η αλλαγή του πλάτους επηρεάζει το ύψος
}
override func setHeight(_ height: Double) {
super.setHeight(height)
super.setWidth(height) // Παραβίαση LSP: η αλλαγή του ύψους επηρεάζει το πλάτος
}
}
Αν χρησιμοποιήσουμε το Square εκεί όπου αναμένεται το Rectangle, η συμπεριφορά του Square κατά την αλλαγή μόνο μιας πλευράς (πλάτους ή ύψους) θα οδηγήσει σε απρόβλεπτα αποτελέσματα, καθώς η βασική κλάση Rectangle δεν διαθέτει τέτοια συμπεριφορά.
Για την αποφυγή παραβιάσεων του LSP, συχνά είναι απαραίτητο να επανασχεδιάσουμε τις ιεραρχίες κλάσεων, να χρησιμοποιήσουμε σύνθεση αντί για κληρονομικότητα ή να εισάγουμε πιο αφηρημένα interfaces/protocols. Αυτό μπορεί να προσθέσει πολυπλοκότητα στον σχεδιασμό στα αρχικά στάδια.
Πίνακας σύγκρισης:
| Αρχή SOLID | Σύντομη περιγραφή | Βασική δυσκολία στην εφαρμογή του LSP |
|---|---|---|
| S (SRP) | Μία κλάση - ένας λόγος για αλλαγή | Εύρεση της "μοναδικής αιτίας" |
| O (OCP) | Ανοιχτό σε επέκταση, κλειστό σε τροποποίηση | Ορθή χρήση αφαιρέσεων |
| L (LSP) | Οι υποκλάσεις πρέπει να είναι αντικαταστάσιμες από τις βασικές κλάσεις | Μη προφανείς παραβιάσεις, απαιτεί κατανόηση του συμβολαίου της βασικής κλάσης |
| I (ISP) | Οι πελάτες δεν πρέπει να εξαρτώνται από μη χρησιμοποιούμενες μεθόδους | Διάσπαση διεπαφών |
| D (DIP) | Εξάρτηση από αφαιρέσεις, όχι από συγκεκριμένες υλοποιήσεις | Ενέσεις εξαρτήσεων |