Αν έχεις ποτέ χρησιμοποιήσει το keyword foreach, έχεις ήδη χρησιμοποιήσει μία μορφή του Iterator pattern χωρίς να το ξέρεις. Τα patterns είναι λύσεις σε προβλήματα που εμφανίζονται συνέχεια σε όλες τις εφαρμογές, άσχετα αν είναι Windows, Web, Java ή PHP. Πες ότι έχεις μία εφαρμογή με εντολές σε μενού (αν είναι desktop) ή links (αν είναι web). Μπορείς να φτιάχνεις με κώδικα ή με το IDE μία-μία τις εντολές και μετά να γράφεις και τον κώδικα από πίσω τους. Θα το κάνεις για 5, για 10 εντολές. Αν όμως οι εντολές αρχίζουν και γίνονται πολλές? Αν θέλεις η ίδια εντολή να καλείται και από το μενού, και από ένα κουμπί στο Toolbar και κάποιο shortcut και κάποιο gesture (λέμε τώρα)? Θα κάτσεις να ξαναγράψεις τον κώδικα για κάθε νέο κουμπί, μενού και shortcut?
Ή μπορείς να φτιάξεις ένα κατάλογο εντολών ο οποίος θα περιέχει τον κώδικα της εντολής, το κείμενο και τη θέση των menu items και των κουμπιών που θέλεις να εμφανίσεις. Όταν πρέπει να φτιάξεις την φόρμα, τα μενού ή το toolbar διαβάζεις αυτό τον κατάλογο και δημιουργείς τα αντίστοιχα controls, περνώντας στο καθένα και το όνομα της εντολής. Όταν ο χρήστης πατάει το μενού, το κουμπί, ή εκτελεί το gesture, λές στον κατάλογο να σου εκτελέσει την κατάλληλη εντολή. Αυτή η σχεδίαση χρησιμοποιεί πολλά patterns, όπως το Command και το Builder (για να φτιάξεις με ένα κοινό τρόπο τις πολλές διαφορετικές εντολές).
Όσο για εφαρμογές τύπου Outlook, όπου πατάς ένα email και αυτομάτως πρέπει να αλλάξουν το Reading pane, το Form Caption, τα μενού και τα Toolbars? Καταρχήν μπορείς να θεωρήσεις ότι κάθε ένα από τα "αυτά" που πρέπει να αλλάξουν είναι ένα "view". Ακόμα και το form caption. Μετά μπορείς να πεις ότι η επιλογή ενός email αντιστοιχεί στο "Item Select" event και να φτιάξεις ένα κατάλογο με όλα τα "views" που ενδιαφέρονται για το "Item Select" event. Όταν ο χρήστης επιλέξει ένα email ανατρέχεις τον κατάλογο και βρίσκεις όλα τα views που ενδιαφέρονται για το "Item Select" event και τους λες να το χειριστούν. Αυτό περίπου είναι και το publisher-subscriber pattern.
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos