Middle
Με ποιον αρχή συγκεντρώνονται και διαχωρίζονται οι μέθοδοι στα interfaces;
sobes.tech AI
Απάντηση από AI
Οι μέθοδοι στις διεπαφές ομαδοποιούνται και διαχωρίζονται σύμφωνα με την αρχή του συγκολλημένου συμπεριφοράς και την αρχή του ρητού συμβολαίου.
- Συγκολλημένο συμπεριφορά: Οι μέθοδοι που αντιπροσωπεύουν ένα ενιαίο σύνολο λειτουργιών με μια οντότητα ή εκτελούν παρόμοιες ενέργειες, ομαδοποιούνται σε μια διεπαφή. Αυτό βελτιώνει την αναγνωσιμότητα του κώδικα, διευκολύνει την κατανόηση του σκοπού της διεπαφής και αυξάνει την επαναχρησιμοποίησή της.
- Ρητό συμβόλαιο: Η διεπαφή περιγράφει ένα ρητό συμβόλαιο που πρέπει να τηρούν οι κλάσεις που την υλοποιούν. Κάθε μέθοδος στη διεπαφή αποτελεί μέρος αυτού του συμβολαίου. Οι μέθοδοι διαχωρίζονται μεταξύ διαφορετικών διεπαφών αν αντιπροσωπεύουν διαφορετικές πτυχές της συμπεριφοράς ή αν η υλοποίησή τους μπορεί να διαφέρει ανεξάρτητα. Για παράδειγμα, η διεπαφή
Readableμπορεί να περιέχει μεθόδους για ανάγνωση δεδομένων, και ηWritableγια εγγραφή. Μια κλάση μπορεί να υλοποιεί μία ή και τις δύο διεπαφές ανάλογα με τις δυνατότητές της.
Αυτή η προσέγγιση υποστηρίζει τις αρχές SOLID, ειδικά:
- Αρχή της μοναδικής ευθύνης: Η διεπαφή έχει έναν μόνο λόγο για αλλαγή — την αλλαγή του συνόλου της συμπεριφοράς που περιγράφει.
- Αρχή της διαχωρισμού διεπαφών: Οι πελάτες δεν πρέπει να εξαρτώνται από διεπαφές που δεν χρησιμοποιούν. Ο διαχωρισμός μεγάλων διεπαφών σε μικρότερες και εστιασμένες επιτρέπει στις κλάσεις να υλοποιούν μόνο αυτές που πραγματικά χρειάζονται.
Παράδειγμα:
Ας υποθέσουμε ότι έχουμε μια οντότητα που μπορεί να αποθηκευτεί και να φορτωθεί. Αντί για μια ενιαία διεπαφή Persistable με δύο μεθόδους save() και load(), είναι καλύτερο να δημιουργήσουμε δύο ξεχωριστές διεπαφές:
// Διεπαφή για αποθηκεύσιμες οντότητες
interface Savable
{
public function save(): void;
}
// Διεπαφή για φορτώσιμες οντότητες
interface Loadable
{
public function load(): void;
}
Μια κλάση που μπορεί να αποθηκευτεί και να φορτωθεί υλοποιεί και τις δύο διεπαφές:
// Κλάση που υλοποιεί και τις δύο διεπαφές
class DataObject implements Savable, Loadable
{
public function save(): void
{
// Λογική αποθήκευσης
}
public function load(): void
{
// Λογική φόρτωσης
}
}
Μια κλάση που υλοποιεί μόνο την αποθήκευση, υλοποιεί μόνο το Savable:
// Κλάση που υλοποιεί μόνο το `Savable`
class TempData implements Savable
{
public function save(): void
{
// Λογική αποθήκευσης προσωρινών δεδομένων
}
}
Αυτό επιτρέπει τον πιο ευέλικτο σχεδιασμό των κλάσεων και των εξαρτήσεών τους.