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


Αναρωτιέμαι αν αυτό είναι μια καλή πρακτική για τη σύνταξη μοντέλα τομέα, καθώς και. Έτσι, για παράδειγμα, αν έχετε μια τάξη τομέα πελατών και κάθε πελάτης μπορεί να έχει μια λίστα με τις παραγγελίες, θα σας *γενικά* να γράψετε διασυνδέσεις ICustomer και IOrder. Και επίσης θα Πελάτης έχει μια λίστα με IOrders αντί για παραγγελίες; Ή θα χρησιμοποιήσει τις διασυνδέσεις στο μοντέλο τομέα, μόνο αν είναι πραγματικά οδηγείται από την περιοχή, όπως έχετε τουλάχιστον δύο διαφορετικά είδη παραγγελίες; Με άλλα λόγια, θα μπορείτε να χρησιμοποιήσετε τις διασυνδέσεις, διότι μόνο τεχνικές ανάγκες του μοντέλου τομέα, ή μόνο όταν είναι πραγματικά κατάλληλη σε σχέση με την πραγματική τομέα;

 
Προγραμματισμός ενάντια διεπαφές: Να γράψετε τις διασυνδέσεις για όλες τις τάξεις του τομέα σας;
================================================================================================



Γράφοντας διασυνδέσεις «μόνο και μόνο επειδή» μου φαίνεται σαν χάσιμο χρόνου και ενέργειας, για να μην αναφέρω μια παραβίαση των KISS-αρχή.


Τους γράψω όταν είναι πραγματικά χρήσιμα στην εκπροσώπηση κοινή συμπεριφορά των σχετικών κατηγοριών, όχι μόνο ως ένα φανταχτερό αρχείο μπάλα.

 

Μην σχεδιάσετε πάνω από το σύστημά σας. Αν διαπιστώσετε ότι έχετε διάφορους τύπους Παραγγελίες και πιστεύω ότι είναι σκόπιμο να δηλώσει μια διεπαφή για παραγγελίες από refactor όταν παραστεί ανάγκη. Για τα μοντέλα τομέα, η πιθανότητα είναι υψηλή ότι το συγκεκριμένο περιβάλλον θα αλλάξει πολύ κατά τη διάρκεια της ανάπτυξης, γι 'αυτό σπάνια χρήσιμο να γράψετε μια διεπαφή νωρίς.

 

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

 

Εμείς ως επί το πλείστον τη δημιουργία εφαρμογών web με ανθρωποθυρίδα, την άνοιξη και το Hibernate και χρησιμοποιούμε τις διασυνδέσεις για την Άνοιξη φασόλια, π.χ. Υπηρεσίες και DAOs. Για αυτές τις κατηγορίες, τις διασυνδέσεις κάνουν απολύτως νόημα. Αλλά χρησιμοποιούμε επίσης διασυνδέσεις για κάθε κατηγορία τομέα και πιστεύω ότι αυτό είναι μόνο υπερβολή.

 

Ακόμα κι αν είστε πολύ σίγουρος ότι υπάρχει μόνο πρόκειται να είναι ένα συγκεκριμένο είδος του μοντέλου αντικειμένου, χρησιμοποιώντας τις διασυνδέσεις κάνει σκωπτική και δοκιμή κάπως πιο εύκολο (αλλά αυτές τις μέρες υπάρχουν framworks που μπορούν να σας βοηθήσουν να δημιουργήσετε εικονικές τάξεις αυτόματα, ακόμη και για συγκεκριμένες Java classes- Mockito, JTestR, άνοιξη, Groovy ...)


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

 

Διασυνδέσεις είναι ένας εξαιρετικός τρόπος απομόνωσης συστατικών μερών με σκοπό τον έλεγχο μονάδας και γενική διαχείριση της εξάρτησης. Λέγοντας αυτό, συχνά προτιμούν αφηρημένες κλάσεις, έτσι τουλάχιστον ένα μέρος της κοινής συμπεριφοράς εκφορτωθούν εκεί παρά αναγκάζει ορισμένες από τις αλληλεπικαλύψεις που φέρνουν διασυνδέσεις. Σύγχρονη IDEs να είναι γρήγορο και εύκολο να δημιουργήσει διασυνδέσεις ώστε να μην είναι *ότι* πολλή δουλειά :-)

 

Θα συνιστούσα να μείνετε αδύνατοι και ευέλικτο - δεν κάνουν τίποτα μέχρι να χρειαστεί να το κάνει, τότε ας IDE σας κάνει το refactoring για σας όταν το χρειάζεστε. 


αρκετά τετριμμένο της στο IDEA / έκλειψη για να μετατρέψει μια συγκεκριμένη τάξη σε ένα περιβάλλον όταν αποφασίσετε θα πρέπει να έχετε ένα.


Στη συνέχεια, χρησιμοποιήστε εξαρτήσεων ένεση με [την άνοιξη](http://www.springframework.org/) ή [Guice](http://code.google.com/p/google-guice/) αν έχετε πολλές εφαρμογές της διεπαφής να εισάγει τις θέσεις στον κώδικά σας που χρησιμοποιείτε «νέα»

 

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


Intefaces δοκιμάσει επίσης πολλαπλές εφαρμογές των διεπαφών σας για το μοντέλο τομέα σας. Έτσι, δεν νομίζω ότι είναι πάντα υπερβολή.

 

Νομίζω ότι ο κύριος λόγος για τον προγραμματισμό κατά διασυνδέσεις είναι ελεγξιμότητα. Ως εκ τούτου, για τα αντικείμενα τομέα - απλά να κολλήσει σε POJOs ή POC # Os :) κλπ, δηλαδή, απλά συνεχίστε τις τάξεις σας από την προσθήκη κάθε συγκεκριμένο πλαίσιο, ώστε να τους αποτρέψει από differend κατασκευής και εκτέλεσης εξαρτήσεις και αυτό είναι όλο. Η δημιουργία διεπαφών για DAOs είναι μια καλή ιδέα, όμως.

 

Γράφοντας περιβάλλον προτού να πάρει χρειάζονται (είτε για τη δοκιμή ή την αρχιτεκτονική) είναι μια υπερβολή. 


Επιπλέον, γράφοντας μια διεπαφή χειροκίνητα είναι χάσιμο χρόνου. Μπορείτε να χρησιμοποιήσετε refactoring «Μέλη Pull» Resharper να το αφήσει να δημιουργήσετε νέο περιβάλλον από τη συγκεκριμένη κατηγορία μέσα σε λίγα δευτερόλεπτα. Άλλα εργαλεία refactoring που ενοποιούνται με το IDE θα πρέπει να έχουν παρόμοιες λειτουργίες, καθώς και.

 

Όχι, χρησιμοποιώ μόνο διασυνδέσεις σε αντικείμενα τομέα για να τους κρατήσει χαλαρά συνδεδεμένες. Για μένα η κύρια άγκιστρο της ανάπτυξης το δικό μου κώδικα με διασυνδέσεις είναι ότι μπορώ να δημιουργήσετε εύκολα το ψευδές όταν κάνουμε δοκιμές μονάδα. Δεν βλέπω το σημείο στο σκωπτική Αντικείμενα τομέα, καθώς δεν έχουν τις ίδιες εξαρτήσεις που ένα στρώμα υπηρεσία ή κατηγορίας στρώμα DAO θα έχουν.


Αυτό βέβαια δεν σημαίνει να απομακρυνθούν από τη χρήση διεπαφές σε αντικείμενα τομέα. Χρησιμοποιήστε ανάλογα με την περίπτωση. Για παράδειγμα, τον τελευταίο καιρό έχω εργαστεί σε μια εφαρμογή ιστού, όπου διάφορα είδη Αντικείμενα τομέα αντιστοιχούν σε permalink σελίδες στις οποίες οι χρήστες μπορούν να αφήσουν σχόλια. Έτσι, κάθε ένα από αυτά τα αντικείμενα Τομέα εφαρμόσει τώρα τη διεπαφή «Commentable». Όλα του κώδικα σχόλιο που βασίζεται στη συνέχεια προγραμματιστεί για την Commentable περιβάλλον, αντί των αντικειμένων τομέα.

 

Αυτό είναι ένα άλλο πράγμα που πρέπει να έχετε κατά νου ότι έχω τρέξει στο, ειδικά με δημιουργούνται τομέα και τα αντικείμενα DAO. Πολλές από τις διασυνδέσεις είναι ακριβώς πάρα πολύ συγκεκριμένες. Πείτε πολλά αντικείμενα περιοχής έχουν μια ταυτότητα και ένα πεδίο κατάστασης, γιατί δεν μοιράζονται μια κοινή διεπαφή; Αυτό έχει προκαλέσει μου απογοήτευση, άσκοπα απλό μοντέλο τομέα (κληρονομικότητα-σοφός).

 

Εξάγουμε διασυνδέσεις από τα πάντα μόνο και μόνο επειδή βοηθά στον έλεγχο (σκωπτική) και για πράγματα όπως AOP. Eclipse μπορεί να κάνει αυτό αυτόματα: Refactor-> Εξαγωγή Interface.


Και αν χρειαστεί να τροποποιήσετε την τάξη αργότερα, μπορείτε να χρησιμοποιήσετε Refactor-> Τραβήξτε προς τα πάνω ... για να σηκώσει τις μεθόδους που χρειάζεστε πάνω στο περιβάλλον.

 

* Το κάνω γιατί το έχω ανάγκη για τη δημιουργία πληρεξούσια των αντικειμένων του τομέα μου.

 

Στην πραγματικότητα, το ερώτημα αυτό είναι ένα παράδειγμα της κοινής παρεξήγηση για «προγραμματισμό κατά διασυνδέσεις».


Βλέπετε, αυτό *είναι* μια πολύ καλή αρχή, αλλά αυτό *δεν* σημαίνει ότι αυτό που πολλοί άνθρωποι σκέφτονται αυτό σημαίνει!


«Πρόγραμμα σε ένα περιβάλλον, δεν αποτελεί εφαρμογή» (από το βιβλίο GoF) σημαίνει ακριβώς αυτό, όχι ότι θα πρέπει να βγουν έξω από το δρόμο σας για να *δημιουργήσετε* ξεχωριστές διασυνδέσεις για τα πάντα. Εάν έχετε ένα `ArrayList`αντικείμενο, στη συνέχεια, να δηλώσει τη μεταβλητή / τομέα / παράμετρο / τύπος επιστροφής ως του τύπου `List`. Κωδικός Πελάτη τότε θα ασχοληθεί μόνο με τον τύπο διεπαφής.


Στο βιβλίο «Αποτελεσματική Java» από Joshua Bloch, η αρχή αυτή εκφράζεται με μεγαλύτερη σαφήνεια, το «Στοιχείο 52: Ανατρέξτε στα αντικείμενα από τις διασυνδέσεις τους». Είναι ακόμη, λέει, με έντονα γράμματα:



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


Για τον έλεγχο μονάδας, η κατάσταση εξαρτάται πλήρως από τις δυνατότητες του εργαλείου σκωπτική που χρησιμοποιείται. Με το δικό μου εργαλείο, [JMockit](http://code.google.com/p/jmockit) , μπορώ να γράψω εξετάσεις μονάδα εξίσου εύκολα για τον κώδικα που χρησιμοποιεί τις διασυνδέσεις και την εξάρτηση Injection και για κώδικα που χρησιμοποιεί τελευταίων τάξεων τεκμηριώθηκε από το εσωτερικό του κώδικα υπό δοκιμή.


Έτσι, για μένα, η απάντηση είναι: χρησιμοποιείτε πάντα τις διασυνδέσεις που υπάρχουν ήδη, αλλά να αποφύγει τη δημιουργία νέων αν δεν υπάρχει καλός λόγος για να το κάνει (και *δοκιμαστικότητα* , από μόνη της, δεν θα πρέπει να είναι ένα).

 