PC_MAGAS Δημοσ. 12 Οκτωβρίου 2016 Δημοσ. 12 Οκτωβρίου 2016 Όπως γράφω στο http://stackoverflow.com/questions/39997321/do-i-need-to-create-new-iterator-instance-to-my-visitor-when-i-visit-a-non-leaf Έχω ένα θέμα με το να εφαρμόσω ένα Iterator pattern σε ένα Composite. Η εφαρμογή είναι απλά ένας webserver γραμμένος σε java όπως βλέπετε στο: https://github.com/pc-magas/webChecker Η γενική ιδέα είναι έχω μια σκακιέρα που κάθε πλακίδιο-νταμάκι-τετράγωνο- πως το καλό το λέτε μπορεί να είναι χρωματιστό. Ακόμα κάθε πλακίδιο μπορεί να είναι μια σκακιέρα και κάθε σκακιέρα μπορεί να έχει παραπάνω από 2 ειδών πλακίδια. Έτσι χρησιμοποίησα ένα Composite pattern όπως περιγράφετε στο παρακάνω UML διάγραμμα: Το πρόβλημα είναι όταν ο Visitor (https://github.com/pc-magas/webChecker/blob/master/src/main/java/app/app/image/draw/image/JpegDrawingAlgorithm.java) του Iterator (https://github.com/pc-magas/webChecker/blob/master/src/main/java/app/app/image/iterator/CheckerIterator.java) συναντά ένα πλακίδιο - σκακιέρα (https://github.com/pc-magas/webChecker/blob/master/src/main/java/app/app/image/elements/CheckerBoard.java) Θα πρέπει να διμιουργήσω έναν νέο Iterator instance ή είναι καλύτερο ο Iterator να επιστρέφει ΚΑΙ τα πλακίδια μια σκακιέρας που είναι πλακίδιο;
defacer Δημοσ. 13 Οκτωβρίου 2016 Δημοσ. 13 Οκτωβρίου 2016 Μου φαίνεται πως έχεις κάνει τα πράγματα τελείως λάθος. Κάθε CheckerBoard έχει ενσωματωμένο iterator state μέσα της (οπότε π.χ. δε μπορείς να την κάνεις iterate δύο φορές παράλληλα). Αυτό είναι κόντρα στο πνεύμα του iterator, όπου ο κάθε iterator είναι που κρατάει το state και άρα μπορείς να έχεις όσους θες παράλληλα. Σε σένα ο iterator είναι τελείως γλάστρα όσον αφορά το iteration, όλα τα κάνει το board. Επίσης τι δουλειά έχει ο iterator να κάνει apply visitor κατά τη διάρκεια του iteration? Αυτό θα το κάνει ο consumer του iterator. Έτσι που τα έχεις τώρα δε μπορείς καλά καλά να κάνεις iteration αν δεν έχεις κάποιο visitor στα χέρια σου. Όσον αφορά την αρχική σου ερώτηση: εφόσον έχεις composite τότε δε γίνεται οτιδήποτε άλλο παρά το κάθε στοιχείο να δίνει iterator για τον εαυτό του, και τα composites να παρέχουν μέσα από το δικό τους iterator τα αντικείμενα που επιστρέφουν οι iterators των components τους.
PC_MAGAS Δημοσ. 13 Οκτωβρίου 2016 Μέλος Δημοσ. 13 Οκτωβρίου 2016 Μου φαίνεται πως έχεις κάνει τα πράγματα τελείως λάθος. Κάθε CheckerBoard έχει ενσωματωμένο iterator state μέσα της (οπότε π.χ. δε μπορείς να την κάνεις iterate δύο φορές παράλληλα). Αυτό είναι κόντρα στο πνεύμα του iterator, όπου ο κάθε iterator είναι που κρατάει το state και άρα μπορείς να έχεις όσους θες παράλληλα. Σε σένα ο iterator είναι τελείως γλάστρα όσον αφορά το iteration, όλα τα κάνει το board. Επίσης τι δουλειά έχει ο iterator να κάνει apply visitor κατά τη διάρκεια του iteration? Αυτό θα το κάνει ο consumer του iterator. Έτσι που τα έχεις τώρα δε μπορείς καλά καλά να κάνεις iteration αν δεν έχεις κάποιο visitor στα χέρια σου. Όσον αφορά την αρχική σου ερώτηση: εφόσον έχεις composite τότε δε γίνεται οτιδήποτε άλλο παρά το κάθε στοιχείο να δίνει iterator για τον εαυτό του, και τα composites να παρέχουν μέσα από το δικό τους iterator τα αντικείμενα που επιστρέφουν οι iterators των components τους. Φχαριστώ γι αυτό ρώτησα. Εαν δεν ρωτήσεις δεν μαθαίνεις .
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα