Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Όπως γράφω στο 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 διάγραμμα: post-141042-0-64441400-1476279257_thumb.png

 

Το πρόβλημα είναι όταν ο 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 να επιστρέφει ΚΑΙ τα πλακίδια μια σκακιέρας που είναι πλακίδιο;

Δημοσ.

Μου φαίνεται πως έχεις κάνει τα πράγματα τελείως λάθος.

 

Κάθε CheckerBoard έχει ενσωματωμένο iterator state μέσα της (οπότε π.χ. δε μπορείς να την κάνεις iterate δύο φορές παράλληλα). Αυτό είναι κόντρα στο πνεύμα του iterator, όπου ο κάθε iterator είναι που κρατάει το state και άρα μπορείς να έχεις όσους θες παράλληλα. Σε σένα ο iterator είναι τελείως γλάστρα όσον αφορά το iteration, όλα τα κάνει το board.

 

Επίσης τι δουλειά έχει ο iterator να κάνει apply visitor κατά τη διάρκεια του iteration? Αυτό θα το κάνει ο consumer του iterator. Έτσι που τα έχεις τώρα δε μπορείς καλά καλά να κάνεις iteration αν δεν έχεις κάποιο visitor στα χέρια σου.

 

Όσον αφορά την αρχική σου ερώτηση: εφόσον έχεις composite τότε δε γίνεται οτιδήποτε άλλο παρά το κάθε στοιχείο να δίνει iterator για τον εαυτό του, και τα composites να παρέχουν μέσα από το δικό τους iterator τα αντικείμενα που επιστρέφουν οι iterators των components τους.

Δημοσ.

Μου φαίνεται πως έχεις κάνει τα πράγματα τελείως λάθος.

 

Κάθε CheckerBoard έχει ενσωματωμένο iterator state μέσα της (οπότε π.χ. δε μπορείς να την κάνεις iterate δύο φορές παράλληλα). Αυτό είναι κόντρα στο πνεύμα του iterator, όπου ο κάθε iterator είναι που κρατάει το state και άρα μπορείς να έχεις όσους θες παράλληλα. Σε σένα ο iterator είναι τελείως γλάστρα όσον αφορά το iteration, όλα τα κάνει το board.

 

Επίσης τι δουλειά έχει ο iterator να κάνει apply visitor κατά τη διάρκεια του iteration? Αυτό θα το κάνει ο consumer του iterator. Έτσι που τα έχεις τώρα δε μπορείς καλά καλά να κάνεις iteration αν δεν έχεις κάποιο visitor στα χέρια σου.

 

Όσον αφορά την αρχική σου ερώτηση: εφόσον έχεις composite τότε δε γίνεται οτιδήποτε άλλο παρά το κάθε στοιχείο να δίνει iterator για τον εαυτό του, και τα composites να παρέχουν μέσα από το δικό τους iterator τα αντικείμενα που επιστρέφουν οι iterators των components τους.

Φχαριστώ γι αυτό ρώτησα. Εαν δεν ρωτήσεις δεν μαθαίνεις ;) .

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...