defacer Δημοσ. 9 Ιανουαρίου 2014 Δημοσ. 9 Ιανουαρίου 2014 υλοποίησα δυο abstract κλάσεις Sudoku και Wordoku που έχουν μοναδική διαφορά στην υλοποίηση της getElement(). Τι κάνει η getElement? Ποιό είναι το signature της? Οι κλάσεις αυτές όμως έχουν και μια abstract method isAcceptedValue() Τι κάνει η isAcceptedValue? Ποιό είναι το signature της? Γιατί δεν είναι κι αυτή δηλωμένη στη base class? την οποία πρέπει να υλοποιήσουν οι κλάσεις 1 και 2. Οι κλάσεις 1 και 2 γιατί δε βρίσκονται στην ίδια ιεραρχία? Τι αναπαριστούν? Τι ρόλο παίζουν στην εφαρμογή? Ποιά η σχέση τους με τις boards? Υποψιάζομαι ότι αυτά που γράφει ο Zakk για strategy pattern είναι στη σωστή κατεύθυνση (σε κάθε περίπτωση είναι ένα από τα βασικότερα design patterns ever οπότε να το κάνεις κτήμα σου), αλλά σε ρωτάω επειδή α) δεν είμαι σίγουρος και β) είναι τεράστιας σημασίας να διατυπώσεις ξεκάθαρα και χωρίς αβεβαιότητες το πλάνο σου με κάθε λεπτομέρεια: "θέλω να κάνω αυτό κι αυτό προκειμένου να γίνει εκείνο και το άλλο". Εδώ δεν το έχεις κάνει αυτό (ακόμα), με αποτέλεσμα πρώτον να πέσεις πάλι στην παγίδα του XY problem που λέω παραπάνω και δεύτερον να αισθάνεσαι αβέβαιος. Κάνε λοιπόν τον κόπο και γράψε μια λεπτομερή περιγραφή του που βρίσκεσαι τώρα. Wax on, wax off. έχω τη φρικτή υποψία ότι μπορεί οι περισσότεροι στο φόρουμ να μην ξέρουν σε τι αναφέρεται αυτό 3
alexc Δημοσ. 9 Ιανουαρίου 2014 Μέλος Δημοσ. 9 Ιανουαρίου 2014 Το γενικότερο project το έχετε καταλάβει πιστεύω. Παιχνίδι Sudoku. Τώρα αναλυτικότερα σε αυτά που αναφέρεσαι: 1) H getElement() επιστρέφει την τιμή σε ένα συγκεκριμένο κελί του πίνακα παιχνιδιού( Μπορεί να είναι νούμερο στην περίπτωση απλού Sudoku,μπορεί να είναι γράμμα στην περίπτωση του Wordoku) . 2) isAcceptedValue() ελέγχει αν κάποια συγκεκριμένη τιμή μπορεί να τοποθετηθεί σε συγκεκριμένο κελί του παραπάνω πίνακα.Πιστεύω οτι θα ήταν καλύτερο να είναι στην base class όπως είπες. 3) Οι κλάσεις 1 και 2 αναπαριστούν διαφορετικό μορφή παιχνιδιού Sudoku. Απλό sudoku δηλαδή και hypersudoku ( Μια πιο δύσκολη μορφή του). Οι διαφορές τους είναι οτι στην δεύτερη περίπτωση έχουμε εξτρα περιορισμούς για τις τιμές ( Διαφορετική δηλαδή υλοποίηση της acceptedValue() ) . Η λογική του παιχνιδιού με πολλά άλλα τα οποία δεν επηρεάζουν τούτο το κομμάτι και έχουν υλοποιηθεί ( χρήστες,scores ktl ) είναι αυτή. Πιστεύω ( αν και πολύ άπειρος ακόμα ) οτι η στρατιγική που μου πρότεινε ο Zakk κινείται σε αυτά που θέλω πάνω κάτω Οποιεσδήποτε άλλες συμβουλές ευπρόσδεκτες και ευχαριστώ πολύ για την βοήθεια σας. public enum Acceptable {METHOD1 { public boolean isAcceptedValue(); //implementation1 return true; } }, METHOD2 { public boolean isAcceptedValue(); //implementation2 return false; } } }; public abstract boolean isAcceptedValue();} Μπορείς να μου εξηγήσεις λίγο τα return?? Και την δήλωση της μεθόδου στο τέλος?
ZAKKWYLDE Δημοσ. 9 Ιανουαρίου 2014 Δημοσ. 9 Ιανουαρίου 2014 Μπορείς να μου εξηγήσεις λίγο τα return?? Και την δήλωση της μεθόδου στο τέλος? Τα return έτσι τα έβαλα ενδεικτικά...για να γίνεται compile. Προφανώς εσύ θα φτιάξεις τη λογική μέσα σε αυτό το method η οποία θα κρίνει το πότε θα επιστρέφει τι. Τώρα τη δήλωση της μεθόδου. Για να μπορέσω να δηλώσω methods μέσα σε ένα enum member, χρειάζεται ένα abstract method εκτός του body τους, το οποίο θα κάνουν implement. Δες το enum ως Interface, και τα enum members ως implementations του. Τώρα στο θέμα μας. Εγώ θα σου πρότεινα να πάρεις και άλλο ένα βιβλίο. Το Head First design patterns και να διαβάσεις ΠΟΛΥ καλά το Factory και Strategy. Για να πω την αλήθεια η περίπτωσή σου περισσότερο ταιριάζει σε Factory και ίσως Abstract Factory και μπορεί να χρειαστεί να χώσεις και strategy κάπου: Αυτό το site έχει γενικώς ωραία παραδείγματα: http://java.dzone.com/articles/design-patterns-factory
alexc Δημοσ. 9 Ιανουαρίου 2014 Μέλος Δημοσ. 9 Ιανουαρίου 2014 Το project είναι για την σχολή μου δυστυχώς.. οπότε υπάρχει ενα χρονικό περιθώριο.. Δεν πιστεύω οτι θα προλάβω να κατανοήσω καλά το βιβλίο που μου προτείνεις μέχρι την προθεσμία. Ακολουθώ πάντως τον τρόπο που μου πρότεινες. Η αλήθεια είναι οτι πρώτη φορά συναντάω design patterns χάρη σε σας ( νομίζω οτι θα μάθουμε κάποια βασικά την επόμενη εβδομάδα και στην σχολή ) για αυτό και οι ερωτήσεις μου. Θα ακολουθήσω τον τρόπο σου πάντως ( Strategy pattern ) γιατί ταιριάζει πολύ καλά στην υλοποίηση μου. Ακόμη μια ερώτηση. Εξήγησε μου λίγο αυτό: public class Wordoku { private Acceptable acceptable; //Για να μην μπορεί να την καλέσουν private class Wordoku() { }
ZAKKWYLDE Δημοσ. 10 Ιανουαρίου 2014 Δημοσ. 10 Ιανουαρίου 2014 Το project είναι για την σχολή μου δυστυχώς.. οπότε υπάρχει ενα χρονικό περιθώριο.. Δεν πιστεύω οτι θα προλάβω να κατανοήσω καλά το βιβλίο που μου προτείνεις μέχρι την προθεσμία. Ακολουθώ πάντως τον τρόπο που μου πρότεινες. Η αλήθεια είναι οτι πρώτη φορά συναντάω design patterns χάρη σε σας ( νομίζω οτι θα μάθουμε κάποια βασικά την επόμενη εβδομάδα και στην σχολή ) για αυτό και οι ερωτήσεις μου. Θα ακολουθήσω τον τρόπο σου πάντως ( Strategy pattern ) γιατί ταιριάζει πολύ καλά στην υλοποίηση μου. Ακόμη μια ερώτηση. Εξήγησε μου λίγο αυτό: Οκ είχα την εντύπωση ότι ήταν personal project. Στα πλαίσια της σχολής νομίζω θα το εκτιμήσει αρκετά ο καθηγητής αν δει design pattern. Αν σε ενδιαφέρει όντως η γλώσσα πάντως, κάποια στιγμή όταν έχεις χρόνο διάβασε τα βιβλία που σου έχω προτείνει. Στην ερώτησή σου φαντάζομαι ρωτάς γιατί έχω private constructor. Το κάνω επειδή δεν θέλω να καλέσει κάποιος τον non-argument constructor, γιατί αλλιώς το Object θα είναι inconsistent. Αν κάποιος κάνει δηλαδή Board b = new Sudoku(); b.isAcceptedValue(); Θα κρασάρει γιατί το "Acceptable acceptable" instance variable μας δεν έχει γίνει instantiated απο κάποιο Object. Μην ξεχνάς ότι η method isAcceptedValue(); του Sudoku/Wordoku κάνει encapsulate την isAcceptedValue(); του Acceptable interface.
alexc Δημοσ. 10 Ιανουαρίου 2014 Μέλος Δημοσ. 10 Ιανουαρίου 2014 Οκ το φαντάστηκα απλά επειδή γράφεις class μέσα στην class δεν φάνηκε για constructor ( Τυπογραφικό προφανώς ). Η γλώσσα με ενδιαφέρει πολύ και τα έχω σίγουρα υπόψη αυτά που μου πρότεινες.
ZAKKWYLDE Δημοσ. 10 Ιανουαρίου 2014 Δημοσ. 10 Ιανουαρίου 2014 Ναι όντως μου ξέφυγε σε όλους τους constructor, και είχα ξεχάσει να κάνω και extend και το Board. Anyway το διόρθωσα για να μην μπερδευτεί και κανένας άλλος
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα