
Είμαι εργάζονται για μια συλλογή από κλάσεις που χρησιμοποιούνται για αναπαραγωγή βίντεο και εγγραφής. Έχω μια κύρια κατηγορία που ενεργεί όπως το κοινό περιβάλλον εργασίας, με μεθόδους όπως `play()`, `stop()`, `pause()`, `record()`κλπ ... Τότε θα έχουν μαθήματα κινητήριος δύναμη που κάνει την αποκωδικοποίηση βίντεο και κωδικοποίηση βίντεο.


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


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

 
Θα πρέπει να χρησιμοποιούν ένθετα μαθήματα σε αυτή την περίπτωση;
=================================================================



Θα ήθελα να είναι λίγο διστακτικοί στη χρήση ένθετων κατηγορίες εδώ. Τι γίνεται αν έχετε δημιουργήσει μια αφηρημένη κλάση βάσης για μια «οδηγός πολυμέσων» για να χειριστεί το back-end πράγματα (κινητήριος δύναμη), και μια ξεχωριστή κατηγορία για το front-end εργασία; Το front-end class θα μπορούσε να λάβει ένα δείκτη / αναφορά σε μια υλοποιηθούν τάξη οδηγού (για τον κατάλληλο τύπο και την κατάσταση των μέσων ενημέρωσης) και να εκτελέσει τις αφηρημένες λειτουργίες σχετικά με τη δομή κινητήριος δύναμη.


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


Θα αναφορά κάτι σαν [QTextDocument](http://qt-project.org/doc/qt-4.8/qtextdocument.html) σε Qt. Θα παρέχει άμεση διασύνδεση με το γυμνό χειρισμό μέταλλο δεδομένων, αλλά και να περάσει την αρχή, μαζί με ένα αντικείμενο, όπως ένα QTextEdit να κάνει τη χειραγώγηση.

 

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


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

 

Ακούγεται σαν μια περίπτωση που θα μπορούσε να χρησιμοποιήσει το [σχέδιο στρατηγικής](http://en.wikipedia.org/wiki/Strategy_pattern)

 

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

 

Θα χρησιμοποιήσετε μια ένθετη τάξη για να δημιουργήσετε ένα (μικρό) βοηθός τάξη που απαιτείται για την υλοποίηση της κύριας κατηγορίας. Ή, για παράδειγμα, να καθορίσει μια διεπαφή (μια κατηγορία με την αφηρημένη μεθόδους).


Στην περίπτωση αυτή, το κύριο μειονέκτημα των ένθετων κατηγορίες είναι ότι αυτό το καθιστά πιο δύσκολο να τις χρησιμοποιήσετε ξανά. Ίσως θα θέλατε να χρησιμοποιήσετε τάξη VideoDecoder σας σε ένα άλλο έργο. Αν το ένα ένθετο κατηγορία VideoPlayer κάνουν, δεν μπορείτε να το κάνετε αυτό σε ένα κομψό τρόπο.


Αντ 'αυτού, βάλτε τις άλλες τάξεις σε ξεχωριστά αρχεία .h / .cpp, που μπορείτε να χρησιμοποιήσετε στην τάξη VideoPlayer σας. Ο πελάτης της VideoPlayer τώρα χρειάζεται μόνο να συμπεριλάβει το αρχείο που δηλώνει συσκευή βίντεο, και ακόμα δεν χρειάζεται να ξέρετε για το πώς θα εφαρμόσει.

 

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


Σας κατηγορία κωδικοποιητή / αποκωδικοποιητή ακούγεται σαν να ταιριάζει καλύτερα το [μοτίβο στρατηγική](http://en.wikipedia.org/wiki/Strategy_pattern)

 

Ένας λόγος για να αποφευχθεί η ένθετη τάξεις είναι αν ποτέ την πρόθεση να τυλίξει τον κώδικα με γουλιά ( <http://www.swig.org> ) για χρήση με άλλες γλώσσες. Γουλιά σήμερα έχει προβλήματα με ένθετα κατηγορίες, έτσι διασυνδέεται με τις βιβλιοθήκες που εκθέτουν όλα τα ένθετα κατηγορίες γίνεται ένας πραγματικός πόνος.

 

Έχουμε χτυπήσει ένα πρόβλημα με ένα πρόγραμμα μεταγλώττισης ημι-old Sun C ++ και την προβολή των ένθετων κατηγορίες που η συμπεριφορά άλλαξε στο πρότυπο. Αυτό δεν είναι λόγος για να μην κάνετε ένθετα τάξη σας, φυσικά, απλά κάτι που πρέπει να γνωρίζει αν το σχέδιο για την κατάρτιση του λογισμικού σας σε πολλές πλατφόρμες συμπεριλαμβανομένων των παλαιών μεταγλωττιστές.

 

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

 

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


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


Εδώ είναι περισσότερες πληροφορίες σχετικά με το [σχέδιο PIMPL](http://www.apibook.com/Chapter_3.pdf) (ενότητα 3.1.1).

 