Dagger 2 @Binds vs @ Προσφορές

Ξεκινώντας Dagger 2,12 (συγνώμη, ξέρω αρκετό καιρό πίσω, αλλά αξίζει να το καταλάβετε), υπάρχει αυτό το νέο χαρακτηριστικό που ονομάζεται @Binds που προστέθηκε στο Daggers. Υπάρχουν ήδη μερικά blogs για αυτό. Ωστόσο, η ανάγνωση τους εξακολουθεί να με κάνει να αναρωτιέμαι τι πλεονέκτημα έχει για τους παλιούς πιστούς @ που μας προσφέρει στις ενότητες μας.

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

Ποιο είναι το διαφορετικό όσον αφορά την κωδικοποίηση

@ Παρέχει

@Μονάδα μέτρησης
class MyModule {
    @ Παρέχει
    διασκέδαση getInjectClass (injectObject: InjectClass): InjectInterface {
        επιστροφή injectObject
    }}
}}
class InjectClass @Inject κατασκευαστής (): InjectInterface
interface InjectInterface

@Binds

@Μονάδα μέτρησης
αφηρημένη κλάση MyModule {
    @Binds
    αφηρημένη διασκέδαση getInjectClass (injectObject: InjectClass):
        InjectInterface
}}
class InjectClass @Inject κατασκευαστής (): InjectInterface
interface InjectInterface

Από τα παραπάνω, δεν υπάρχει προφανές σαφές πλεονέκτημα του @Binds over @Provides. Κάποιος έχει μετατραπεί σε αφηρημένη τάξη και λειτουργία, ενώ η άλλη είναι συγκεκριμένη. Δεν μειώνει οποιαδήποτε λέξη (ή λέβητα).

Ποιο είναι λοιπόν το πλεονέκτημα του @Binds;

Για να το ξέρετε αυτό, ας δούμε κάποια ιστορία

Ιστορικά ...

Στο πολύ πολύ πολύ πρώιμο στάδιο του Dagger, δεν υπάρχει τέτοιο πράγμα όπως το @ Module. @Module στην πραγματικότητα δεν είναι απαραίτητα για το Dagger 2 να δουλέψει (ελέγξτε το μικρότερο κόσμο 2 κώδικα του μαχαιριού).

Ωστόσο, οι πολίτες διαμαρτύρονται και επιθυμούν να ομαδοποιήσουν συναφή εξαρτώμενα μέλη. Έτσι, ο Dagger 2 προγραμματιστής έδωσε και δημιούργησε αυτό το διάσημο γνωστό call χαρακτηριστικό @Module που έχει τα οφέλη που επιθυμούσε πολλοί.

Παρ 'όλα αυτά, η ύπαρξη @Module με @Provides εισάγει κάποια γενικά έξοδα στον παραγόμενο κώδικα. Έτσι @Binds εισήχθη για να βοηθήσει αυτό.

Αποδειξε το μου…

Χρησιμοποιώντας τον παραπάνω κώδικα (μαζί με τον @Component που δεν εμφανίζεται στο απόσπασμα κώδικα παραπάνω) ... ας δούμε τα διαφορετικά

Επιπλέον κλάσεις εργοστασιακών μονάδων

Οι παρακάτω είναι οι κλάσεις που δημιουργούνται.

Σημειώστε ότι @Provides δημιουργεί την κλάση MyModule_GetInjectClassFactory, η οποία δεν υπάρχει στο @Binds

Τι μοιάζει με την τάξη; Πω πω, αρκετά κομμάτια ...

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

@ Παρέχει
διασκέδαση getInjectClass (injectObject: InjectClass): InjectInterface {
    επιστροφή injectObject
}}
@ Παρέχει
διασκέδαση getInjectClass2 (injectObject2: InjectClass2): InjectInterface2 {
    επιστροφή injectObject2
}}
@ Παρέχει
διασκέδαση getInjectClass3 (injectObject3: InjectClass3): InjectInterface3 {
    επιστροφή injectObject3
}}

Φανταστείτε πώς θα προσθέσει το DexCount και το μέγεθος της εφαρμογής μας!

Επιπλέον στρώμα περιτυλίγματος μονάδας

Εκτός από την πρόσθετη κλάση Module Factor, αν θέλουμε να εξετάσουμε την κατηγορία DaggerMyComponent που δημιουργήσαμε, θα δούμε το μέγεθος του κώδικα διαφορετικό.

Ροζ είναι εκείνοι που @ Παρέχει μόνο ενώ πράσινο είναι εκείνοι στο @Binds μόνο

Οι @Provides δημιουργούν 52 γραμμές κωδικών και το @Binds παράγει μόνο 29 γραμμές κωδικών (~ 40% μείωση !!).

Εάν εντοπίσετε τον κώδικα, θα δείτε τη ροή όπως παρακάτω.

Δείτε πόσο συνοπτικό @Binds δημιουργεί το InjectObject;

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

Ας αλλάξουμε τα πάντα στο @Binds;

Δυστυχώς, το @Binds λειτουργεί μόνο με βάση τους παρακάτω κανόνες

Οι μέθοδοι @Binds πρέπει να έχουν μόνο μία παράμετρο του οποίου ο τύπος είναι επιτρεπτός στον τύπο επιστροφής

Επομένως, μόνο μία παράμετρος και η επιστροφή τύπου τυπικά είναι η διεπαφή του αντικειμένου δεδομένου παραμέτρου.

Τούτου λεχθέντος, οι άλλες συμβουλές εξετάζουν τη χρήση της στατικής λειτουργίας για @Provides που θα βοηθούσαν επίσης να μειώσουν ορισμένους κωδικούς που δημιουργήθηκαν.

Ανατρέξτε στην ενότητα του τμήματος 1 του παρακάτω ιστολογίου για να πάρετε περισσότερες πληροφορίες (μετά την ανάγνωση των παραπάνω, μπορεί να έχετε μια πιο ξεκάθαρη κατανόηση του παρακάτω ιστολογίου)

Ελπίζω ότι αυτή η θέση θα σας βοηθήσει. Μπορείτε να δείτε τα άλλα ενδιαφέροντα μου θέματα εδώ.

Παρακολουθήστε με μεσαία, Twitter ή Facebook για λίγες συμβουλές και μάθηση σε θέματα Android, Kotlin κλπ. ~ Elye ~