Sobes.tech
Senior

Ποιο από τα 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) Εξάρτηση από αφαιρέσεις, όχι από συγκεκριμένες υλοποιήσεις Ενέσεις εξαρτήσεων