Δυναμικές πρόσθετες λειτουργίες

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

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

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

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

To σημείο επέκτασης org.eclipse.core.runtime.dynamicHelpers.IExtensionTracker και οι συσχετιζόμενες διεπαφές παρέχουν ένα μηχανισμό με βάση τον οποίο οι προγραμματιστές μπορούν εύκολα να παρακολουθήσουν την κίνηση των επεκτάσεων και να διαχειριστούν τους πόρους που δημιουργούνται από τέτοιες ενέργειες.

Το παράδειγμα που ακολουθεί υποθέτει ότι, στην πρόσθετη λειτουργία σας, έχετε ένα σημείο επέκτασης που ονομάζεται "όργανα" και ότι χρησιμοποιείτε το IExtensionTracker. Εσωτερικά, έχετε τις λειτουργίες WidgetDescriptors που ενθυλακώνουν επεκτάσεις οργάνου και ένα WidgetRegistry για τη διαχείρισή τους.



	public class WidgetRegistry implements IExtensionChangeHandler {

	
	
	  public WidgetRegistry() {
		
		IExtensionTracker tracker = PlatformUI.getWorkbench()
	
  	.getExtensionTracker();
IExtensionPoint point = Platform.getExtensionRegistry() .getExtensionPoint("my.plugin.namespace", "widget");
IExtension[] extensions = point.getExtensions();
// initial population
for (int i = 0; i < extensions.length; i++) { addExtension(tracker, extensions[i]);
} tracker
.registerHandler(this, tracker
.createExtensionPointFilter(point)); } public void addExtension(IExtensionTracker tracker, IExtension extension){ WidgetDescriptor descriptor = new WidgetDescriptor(extension); tracker.registerObject(extension, descriptor,
IExtensionTracker.REF_STRONG); addToInternalStructure(descriptor) } private void addToInternalStructure(WidgetDescriptor descriptor) { // registry specific logic } public void removeExtension(IExtension extension, Object[] objects) { for (int i = 0; i < objects.length; i++) { WidgetDescriptor descriptor = (WidgetDescriptor) objects[i];
removeFromInternalStructure(descriptor);
}
} private void removeFromInternalStructure(WidgetDescriptor descriptor) { // registry specific logic }
} public void dispose() { PlatformUI.getWorkbench() .getExtensionTracker().unregisterHandler(this)
} }

Σε αυτό το παράδειγμα, το περιβάλλον χρήστη της Πλατφόρμας παρέχει χρήσεις IExtensionTracker σε διάφορα επίπεδα του Πάγκου εργασίας. Αν παρακολουθείτε αντικείμενα η παρουσία των οποίων διαρκεί όσο και η ζωή του πάγκου εργασίας, θα πρέπει να χρησιμοποιήσετε τη λειτουργία παρακολούθησης που παρέχεται από τη μέθοδο IWorkbench.getExtensionTracker(). Αν τα αντικείμενά σας συσχετίζονται με συγκεκριμένα παράθυρα ή σελίδες του πάγκου εργασίας, θα πρέπει να χρησιμοποιείτε τις λειτουργίες παρακολούθησης που παρέχονται από τη μέθοδο IWorkbenchWindow.getExtensionTracker() ή IWorkbenchPage.getExtensionTracker(). Για παράδειγμα, ο Πάγκος εργασίας παρακολουθεί περιγραφές προβολών στο επίπεδο Πάγκου εργασίας αλλά παρακολουθεί τις πραγματικές χρήσεις προβολής στο επίπεδο της σελίδας του πάγκου εργασίας. Οι ρουτίνες χειρισμού σας μπορεί να καταχωρούνται σε συγκεκριμένα σημεία επέκτασης μέσω της παροχής μιας χρήσης IFilter στη μέθοδο IExtensionTracker.registerHandler(). Θα γίνεται κλήση της ρουτίνας χειρισμού σας μόνο όταν οι επεκτάσεις οι οποίες ταιριάζουν με το αντικείμενο IFilter προστίθενται ή αφαιρούνται.

Κατά την καταχώρηση μιας επέκτασης στο περιβάλλον εκτέλεσης γίνεται κλήση αυτής της μεθόδου. Η ρουτίνα χειρισμού σας έχει στη συνέχεια τη δυνατότητα να ενσωματώσει τη νέα επέκταση μέσα στο συσχετιζόμενο μοντέλο. Οποιαδήποτε αντικείμενα δημιουργούνται με βάση το IExtension που παρέχεται σε αυτή τη διεπαφή θα πρέπει να καταχωρούνται στη λειτουργία παρακολούθησης μέσω της μεθόδου IExtensionTracker.registerObject(). Όταν μια επέκταση εγκαταλείπει το περιβάλλον εκτέλεσης γίνεται κλήση αυτής της μεθόδου. Οποιαδήποτε αντικείμενα καταχωρούνται στην επέκταση θα περνούν ως ορίσματα. Η ρουτίνα χειρισμού σας μπορεί στη συνέχεια να κάνει εκκαθάριση και να απορρίψει όσα αντικείμενα δεν χρειάζονται. Η κατάργηση της καταχώρησης των ρουτίνων χειρισμού έτσι ώστε να μην προκύπτει διαρροή των καταχωρήσεών σας, αποτελεί μια αποτελεσματική πρακτική.