Προγραμματισμός

Πώς να μην χρησιμοποιήσετε διεπαφές στο C #

Κατά το σχεδιασμό μιας εφαρμογής, θα πρέπει συχνά να χρησιμοποιείτε διεπαφές και αφηρημένες τάξεις. Αυτό το άρθρο ασχολείται με μερικά κοινά παραδείγματα «κατάχρησης διεπαφής» και τις στρατηγικές που μπορούμε να χρησιμοποιήσουμε για την αποφυγή τους. Συζητά επίσης τι σημαίνει το δόγμα, «πρόγραμμα σε μια διεπαφή και όχι σε εφαρμογή».

Τι είναι οι διεπαφές;

Πρώτα απ 'όλα, ας κατανοήσουμε τις διεπαφές και γιατί χρειάζονται στον προγραμματισμό. Μια διεπαφή είναι αυστηρά σύμβαση. δεν έχει καμία εφαρμογή. Μια διεπαφή περιέχει μόνο δηλώσεις μελών. Μπορείτε να έχετε δηλώσεις μεθόδου αλλά όχι ορισμούς. Τα μέλη που δηλώνονται σε μια διεπαφή πρέπει να εφαρμόζονται στους τύπους (τάξεις και δομές) που επεκτείνουν ή εφαρμόζουν τη διεπαφή. Μια διεπαφή δεν μπορεί να περιέχει πεδία. Δεν είναι δυνατή η σειριοποίηση μιας διεπαφής επειδή δεν μπορεί να έχει μέλη δεδομένων. Όπως είπα, μια διεπαφή μπορεί να έχει μόνο δηλώσεις και όχι ορισμούς.

Αποφύγετε να κάνετε αλλαγές στις διεπαφές

Μια τάξη ή μια δομή που επεκτείνει μια διεπαφή θα πρέπει να εφαρμόζει όλα τα μέλη της. Εάν η εφαρμογή αλλάξει, ο κώδικάς σας θα εξακολουθήσει να λειτουργεί. Ωστόσο, εάν αλλάξει η σύμβαση, δηλαδή η διεπαφή, θα πρέπει να αλλάξετε τις εφαρμογές όλων των τύπων που επεκτείνουν τη διεπαφή. Με άλλα λόγια, οποιαδήποτε αλλαγή στη διεπαφή θα επηρεάσει όλους τους τύπους που επεκτείνουν τη διεπαφή. Οι τύποι που επεκτείνουν τη διεπαφή πρέπει να τηρούν τη σύμβαση. Επομένως, χρησιμοποιήστε διεπαφές μόνο όταν σπάνια χρειάζεται να τις αλλάξετε. Επίσης, είναι γενικά καλύτερο να δημιουργήσετε μια νέα διεπαφή παρά να αλλάξετε μια υπάρχουσα.

Προγραμματίστε σε μια διεπαφή και όχι σε μια εφαρμογή

Ίσως να έχετε ακούσει τις λέξεις «πρόγραμμα σε μια διεπαφή και όχι σε μια εφαρμογή» τώρα και ξανά. Ίσως να χρησιμοποιείτε διεπαφές στον κώδικά σας, αλλά εξακολουθείτε να προγραμματίζετε την υλοποίηση. Ας εξετάσουμε τώρα τη διαφορά μεταξύ των δύο προσεγγίσεων.

Όταν προγραμματίζετε σε μια διεπαφή, χρησιμοποιείτε την πιο γενική αφαίρεση (μια διεπαφή ή μια αφηρημένη κλάση) αντί για συγκεκριμένη εφαρμογή. Δεδομένου ότι οι διεπαφές εγγυώνται ομοιομορφία, ο προγραμματισμός σε μια διεπαφή σημαίνει ότι μπορείτε να χειριστείτε παρόμοια αντικείμενα με ομοιόμορφο τρόπο. Με αυτόν τον τρόπο, αποσυνδέεστε από την εφαρμογή - δηλαδή, οι υλοποιήσεις σας μπορεί να διαφέρουν. Αυτό προσθέτει ευελιξία και στα σχέδιά σας.

Το παρακάτω απόσπασμα κώδικα απεικονίζει τον προγραμματισμό σε μια διεπαφή. Εξετάστε μια διεπαφή με το όνομα IRepository που περιέχει τη δήλωση μερικών μεθόδων. Οι κλάσεις ProductRepository και CustomerRepository επεκτείνουν τη διεπαφή IRepository και εφαρμόζουν τις μεθόδους που δηλώνονται στη διεπαφή IRepository, όπως φαίνεται παρακάτω.

δημόσιο περιβάλλον εργασίας IRepository

    {

// Κάποιος κωδικός

    }

δημόσια κλάση ProductRepository: IRepository

    {

// Κάποιος κωδικός

    }

δημόσια κλάση CustomerRepository: IRepository

    {

// Κάποιος κωδικός

    }

Ο ακόλουθος κώδικας μπορεί να χρησιμοποιηθεί για τη δημιουργία μιας παρουσίας του ProductRepository.

IRepository repository = νέο ProductRepository ();

Η ιδέα είναι ότι μπορείτε να χρησιμοποιήσετε οποιαδήποτε κλάση εδώ που εφαρμόζει τη διεπαφή IRepository. Επομένως, η ακόλουθη δήλωση είναι επίσης έγκυρη.

IRepository repository = νέο CustomerRepository ();

Όταν προγραμματίζετε σε μια εφαρμογή, αυτή η ομοιομορφία χάνεται. Αντ 'αυτού, συνήθως θα έχετε κάποιες κατασκευές, όπως δηλώσεις "if..else" ή "switch..case", για τον έλεγχο της συμπεριφοράς στον κώδικά σας.

Αποφύγετε την υπερβολική χρήση διεπαφών

Η συσχέτιση κάθε τάξης με μια διεπαφή δεν είναι καλή πρακτική. Η υπερβολική χρήση διεπαφών με αυτόν τον τρόπο δημιουργεί περιττή πολυπλοκότητα, εισάγει πλεονασμό κώδικα, παραβιάζει το YAGNI και μειώνει την αναγνωσιμότητα και τη συντήρηση της βάσης κώδικα. Οι διεπαφές χρησιμοποιούνται για την ομαδοποίηση αντικειμένων που έχουν την ίδια συμπεριφορά. Εάν τα αντικείμενα δεν έχουν την ίδια συμπεριφορά, δεν υπάρχει ανάγκη για αυτήν την ομαδοποίηση. Η χρήση διεπαφών όταν δεν πρόκειται να έχετε πολλές υλοποιήσεις είναι ένα παράδειγμα υπερβολικής χρήσης της διεπαφής.

Η δημιουργία διεπαφής για μια τάξη που ταιριάζει με τα δημόσια μέλη της τάξης είναι πολύ συνηθισμένη. Με αυτόν τον τρόπο δεν προσθέτετε καθόλου αξία - απλώς αντιγράφετε τη διεπαφή της τάξης χωρίς να προσθέτετε καμία πραγματική αφαίρεση.

Ας δούμε τώρα ένα παράδειγμα του πώς χρησιμοποιούνται οι διεπαφές. Εξετάστε την ακόλουθη διεπαφή με το όνομα IProduct.

δημόσια διεπαφή IProduct

    {

int Id {get; σειρά; }

string ProductName {get; σειρά; }

διπλή τιμή {get; σειρά; }

int Ποσότητα {get; σειρά; }

    }

Η κατηγορία προϊόντων επεκτείνει τη διεπαφή IProduct όπως φαίνεται παρακάτω.

δημόσια τάξη Προϊόν: IProduct

    {

δημόσιο int Id {get; σειρά; }

δημόσια συμβολοσειρά ProductName {get; σειρά; }

δημόσια διπλή τιμή {get; σειρά; }

δημόσια int Quantity {get; σειρά; }

    }

Σαφώς, δεν χρειαζόμαστε τη διεπαφή IProduct, καθώς η διεπαφή και η εφαρμογή της είναι πανομοιότυπες. Ο περιττός κωδικός δεν είναι απαραίτητος.

Ας δούμε ένα άλλο παράδειγμα. Το ακόλουθο απόσπασμα κώδικα δείχνει μια διεπαφή που ονομάζεται IProductManager που έχει τη δήλωση δύο μεθόδων, δηλαδή Αποθήκευση και Ενημέρωση.

 δημόσια διεπαφή IProductManager

    {

void Save (προϊόν IP)

άκυρη ενημέρωση (προϊόν IProduct).

    }

Η διεπαφή IProductManager περιέχει τις δηλώσεις των δημόσιων μεθόδων της κλάσης ProductManager. Δείτε πώς φαίνεται η κλάση ProductManager.

 δημόσια κλάση ProductManager: IProductManager

    {

δημόσια ακύρωση Αποθήκευση (προϊόν IP)

        {

// Γράψτε την εφαρμογή σας εδώ

        }

δημόσια ακύρωση ενημέρωσης (προϊόν IProduct)

        {

// Γράψτε την εφαρμογή σας εδώ

        }

    }

Οι διεπαφές IProduct και IProductManager είναι παραδείγματα υπερβολικής χρήσης διεπαφών. Και οι δύο αυτές διεπαφές έχουν μία εφαρμογή και δεν προσθέτουν καθόλου αξία.

Χρησιμοποιώντας διεπαφές, μπορείτε να αφαιρέσετε τους περιττούς συνδέσμους στον κώδικά σας και να κάνετε τον κώδικά σας εύκολα ελεγχόμενο. Ωστόσο, πρέπει να αποφεύγεται η υπερβολική χρήση διεπαφών. Χρησιμοποιήστε διεπαφές μόνο όταν θα υπάρξουν περισσότερες από μία υλοποιήσεις αυτών. Μπορείτε επίσης να χρησιμοποιήσετε διεπαφές όταν έχετε μια τάξη που έχει πολλούς ρόλους για να παίξει ή που έχει πολλές ευθύνες. Σε αυτήν την περίπτωση η τάξη σας μπορεί να εφαρμόσει πολλαπλές διεπαφές - μία για κάθε ρόλο.