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

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

Δημοσ.

Καλησπέρα,

 

Θέλω να φτιάξω ένα πρόγραμμα με το οποίο ο χρήστης δημιουργεί ορθογώνια και θέλω να έχω αποθηκευμένα το πραγματικό τους μέγεθος. Μέχρι εδω καλά, o χρήστης έχει τη δυνατότητα κατα τη δημιουργία τους να εισάγει το μέγεθος τους είτε σαν ιντσες είτε σαν εκατοστά είτε ως πόδια (κ.ο.κ). Σαν το google sketchUp

 

εδώ προβληματίζομαι. Πως θα ορίσω τη κατάλληλη κλάση που θα μου επιτρέπει την αναπαράσταση σε πολλά metrics systems? Προφανώς θέλω να γλιτώσω να κάνω συνέχεια τους ελέγχους (αν είναι επιλεγμένες οι ιντσες, αν είναι τα εκατοστά κτλπ). τι είδους flag πρέπει να βάλω στη κλάση για να μου κάνει απευθείας την μετατροπή χωρίς να κάνω τους ελέγχους?

 

Δεν ξέρω αν έγινα κατανοητός, έχω καιρό να πιάσω java και ίσως να είναι κάτι απλό, απλά δώστε μια κατεύθυνση και βλέπουμε. 

Δημοσ.

Το σκεπτικό σου θα είναι να φτιάξεις μια abstract class (έστω shape) και οι υποκλάσεις θα είναι τα διαφορα σχήματα: Η κάθε υποκλάση που θα θέλει διαφορετικό μέγεθος θα εισάγει τις κατάλληλες properties,functions. Κώδικα δε θα σου γράψω νομίζω είναι κατανοητό αυτό. 

Δημοσ.

Ναι στο παράδειγμα με πολλά διαφορετικά σχήματα έχει νόημα η abstract κλάση. 

https://docs.oracle.com/javase/tutorial/figures/java/classes-graphicObject.gif

 

όμως εγώ δεν θέλω πολλές κλάσεις (σχήματα). Ένα σχήμα έχω (rectangle) με πολλές αναπαραστάσεις (εκατοστά, ιντσες).

 

Κάπως έτσι το σκέφτομαι,

 

1) μια κλάση SizeMetric που περιέχει μια double μεταβλητή (+ κάτι σαν flag που αυτό είναι που ψάχνω)

 

2) μια κλάση Rectangle με δύο μεταβλητές τύπου SizeMetric

 

και στο gui/main το σκέφτομαι κάποιες επιλογές θα είναι:

 

3) create rectangles in cm/inches

4) show rectangles in cm/inches

 

5) show all rectangles with one side larger than (cm/inches)

 

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

Δημοσ.

Μαλλον θες custom implicit cast operator, αλλα στη java δεν γινεται.

 

Στην c# μπορεις να φτιαξεις μια κλαση XUnit και να δηλώσεις μεταβλήτες

class XUnit
{
   public static implicit operator XUnit(string value)
   {
    ....
   }
}

XUnit x1=5;
XUnit x2="1mm";
XUnit x3="5pc";
XUnit x4="10cm";
XUnit x5="72in";
Δημοσ.

Μα ποτε δεν δουλευεις ετσι. Οταν εχεις να κανεις με graphics εχεις ως μοναδα μετρησης το διαστημα [min,max]. Τα cm/inch κλπ ειναι για εισαγωγη/προβολη.

Δημοσ.

Μα ποτε δεν δουλευεις ετσι. Οταν εχεις να κανεις με graphics εχεις ως μοναδα μετρησης το διαστημα [min,max]. Τα cm/inch κλπ ειναι για εισαγωγη/προβολη.

 

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

 

Ας το πω ίσως διαφορετικά το πρόβλημα:

 

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

 

Μετά, δηλαδή μετά απο κανα χρόνο αποφασίσω να προσθέσω αυτό το "feature" του να επιλέγω το μετρικό σύστημα!! Θα πρέπει να αλλάξω όλο το πρόγραμμα???

 

Το πρόβλημα (και ο λόγος που θέλω να υπάρχει αυτή η επιλογή του μετρικού συστήματος) είναι όταν ο ένας χρήστης λέει στον άλλον, "πρόσθεσε ένα ορθογώνιο 10 χ 15 ιντσες", ενώ ο άλλος έχει τα ορθογώνια του στα εκατοστά οπότε θα πρέπει να κάθεται και να κάνει την μετατροπή και να τα εισάγει ως εκατοστά, οπότε fail το πρόγραμμα!!

Δημοσ.

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

 

Δεν καταλαβαίνω πού κολλάς.

Δημοσ.

Ναι σύμφωνοι, απλά ήλπιζα να υπήρχε κάτι που να με βοηθούσε να ενσωματώσω αυτή την ιδιότητα μέσα σε κάποια κλάση για να κάνει όλη την υπόθεση πιο εύκολη. Δεν υπάρχει, δε πειράζει, προχωρούμε με αυτά που ξέρουμε.. 

 

Αν είχες μία μεταβλητή για κάθε metric; :P

έτσι το ξεκίνησα αλλά έπεσα σε παγίδα γιατί θα έπρεπε να κάνω έλεγχο ποιο σύστημα είναι αυτό που τον ενδιαφέρει επομένως να επιστρέψω πχ σε μία μέθοδο τύπου get_Side() που επιστρέφει τη μια πλευρά σε εκατοστά ή σε ίντσες (get_Side_Inches() or get_Side_Cm() ) , και αυτό ήθελα να γλιτώσω...

Δημοσ.

Δεν είμαι σίγουρος τι εννοείς να την κάνει εύκολη. Υπάρχουν πολλοί τρόποι να το κάνεις, άλλοι πιο σωστοί αρχιτεκτονικά και άλλοι πιο εύκολοι στη χρήση.

 

Δώσε ένα παράδειγμα του τι κώδικα θα ήθελες να γράφεις στην ιδανική περίπτωση για να δούμε πώς μπορείς να κάνεις τα πράγματα να δουλεύουν έτσι.

Δημοσ.

Στην main κάπως έτσι

        // paradeigma dimourgias
        // alla de ginetai giati de mporw na exw constructor me ta idia akribws orismata
        Rectangle a=new Rectangle_In_Inches(5,6);
        Rectangle b=new Rectangle_In_Cm(30,20);

        // paradeigma enallagis system metric
        a.switchRectangle2CM();
        b.switchRectangle2Inches();
        
        // xwris na dilwnw to metriko sistima
        double side_A=a.getSideA();
        double side_B=a.getSideB();
        
        // change all rectangles to CM / Inches
        // de kserw akomi, tha prepei na to skeftw parapanw

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

Δημοσ.

Γιατί να υπάρχει κάτι τέτοιο σε αυτό το επίπεδο; είναι άχρηστο, και μονο προβλήματα θα σου βγάλει.

Γιατί δεν λυνεις αυτό το θέμα στο input?

Δημοσ.

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

 

Σαν αποτέλεσμα στη συνέχεια γράφεις getSideA και παίρνεις πίσω ένα βαθμωτό μέγεθος το οποίο δεν ξέρεις (και καλά) τι είναι. Προφανώς για να κάνεις κάτι μ' αυτό πρέπει να ξέρεις τι είναι, π.χ. για να εμφανίσεις "Χ cm" θα πρέπει να ξέρεις να πεις και cm. Σκέψου πώς θα γίνει και αυτό και ενσωμάτωσέ το στον κώδικα που δίνεις, έτσι πως είναι τώρα δε στέκει σαν ολοκληρωμένη ιδέα.

Δημοσ.

Γιατί να υπάρχει κάτι τέτοιο σε αυτό το επίπεδο; είναι άχρηστο, και μονο προβλήματα θα σου βγάλει.

Γιατί δεν λυνεις αυτό το θέμα στο input?

 

μέχρι στιγμής αυτό που λες είναι το πιο σωστο...

 

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

 

Σαν αποτέλεσμα στη συνέχεια γράφεις getSideA και παίρνεις πίσω ένα βαθμωτό μέγεθος το οποίο δεν ξέρεις (και καλά) τι είναι. Προφανώς για να κάνεις κάτι μ' αυτό πρέπει να ξέρεις τι είναι, π.χ. για να εμφανίσεις "Χ cm" θα πρέπει να ξέρεις να πεις και cm. Σκέψου πώς θα γίνει και αυτό και ενσωμάτωσέ το στον κώδικα που δίνεις, έτσι πως είναι τώρα δε στέκει σαν ολοκληρωμένη ιδέα.

 

 

Δίκιο έχεις!

 

        // paradeigma dimourgias
        // to problima twra einai ston constructor tou SizeMetric
        Rectangle a=new Rectangle(new SizeMetricInches(5),new SizeMetricInches(6));
        Rectangle b=new Rectangle(new SizeMetricCM(30),new SizeMetricCM(20));

        
        // xwris na dilwnw to metriko sistima
        SizeMetric side_A=a.getSideA();
        SizeMetric side_B=a.getSideB();
        

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

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

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

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

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

Σύνδεση

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

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