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

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

Δημοσ.

Αυτό είναι βασικά μία από τις πιο καλές λύσεις που θα μπορούσες να δώσεις. Το πρόβλημα που λες ποιό είναι εδώ;

Δημοσ.

Αποφασίζεις την προεπιλεγμένη μονάδα σου αρχικά πχ cm.Μετά

 

Έχεις μια class το Rectangle με properties

 

SizeMetric Width

SizeMetric Height

 

H SizeMetric είναι βοηθητικό class και έχει 2 properties

 

double value,int MetricUnit

 

To MetricUnit είναι από ένα enum πχ του στυλ Cm=1,Inches=2 κοκ.Αν θες βάλτο string να περιέχει κατευθείαν το κείμενο πχ cm,inch

 

Η SizeMetric περιλαμβάνει επίσης μια "συνάρτηση" πχ format που δεν κάνει τίποτα άλλο από να μετατρέπει την τιμή του value χρησιμοποιώντας τον τύπο του MetricUnit από την προεπιλεγμένη μονάδα που επέλεξες αρχικά. ΣΗΜΑΝΤΙΚΟ: Η τιμή του value είναι πάντα στην προεπιλεγμένη μονάδα.

 

Πάμε μετά στην εισαγωγή

 

Δες μια το fiddle του πάπι.O χρήστης βάζει την τιμή και την μονάδα που θέλει.

 

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

 

Aν η μονάδα που επέλεξε είναι διαφορετική από την προεπιλεγμένη τότε κάνεις την μετατροπή πρώτα στην προεπιλεγμένη και μετά βάζεις την τιμή στο αντίστοιχο property μαζί με την μονάδα που επιλέχτηκε. (Άραγε πως πρέπει να είναι ο constructor του class SizeMetric ?)

 

Όταν είναι να δείξεις κάπου τις διαστάσεις του Rectangle στον χρήστη καλείς πρώτα την format βάζεις και την σωστή αναπαράσταση του MetricUnit που έχει και έτοιμος.

 

Εγώ τουλάχιστον αυτό κατάλαβα από όσα πρότειναν οι παραπάνω.

  • Like 1
Δημοσ.

Γιατί να το κάνουμε πολύπλοκο; Γιατί να μην έχουμε το rectangle μας σε απλά εκατοστά(ή οτιδήποτε)

 

class Rectangle
{
   float width;
   float height;
}
Και όταν δείχνουμε στον χρήστη τις τιμές να κάνουμε τις μετατροπες απλά(όπως ειπε και ο defacer) ?

 

rect.width = ConvertToCm(userwidth, usermetric);
rect.height = ConvertToCm(userheight, usermetric);

//...

Print(ConvertFromCm(rect.width, "mm")+","+ConvertFromCm(rect.height, "mm"));
Δημοσ.

Τελική μορφή:

public class SizeMetric {

    private double size_cm; // always save as cm
    
    public SizeMetric() {
        this.size_cm = 0;
    }

    public SizeMetric(double size) {
        this.size_cm = size;
    }
    
    public SizeMetric(double size, String metricFrom) {
        // default in centimeters
        this.size_cm = ConvertToCm(size,metricFrom);
    }
    
    public void changeSize(double new_size,String metricFrom){
        this.size_cm=ConvertToCm(new_size,metricFrom);
    }
    
    public double getSize(){
        // be careful of this one, return always in cm
        return this.size_cm;
    }

    public static double ConvertToCm(double size, String metricFrom) {
        switch (metricFrom) {
            case "cm":
                return size;
            case "in":
                return size * 2.54;
            case "feet":
                return size * 30.48;
            case "mm":
                return size * 0.1;
            default:
                return -1;
        }
    }
    public static double ConvertFromCm(double size_cm, String metricTo) {
        switch (metricTo) {
            case "cm":
                return size_cm;
            case "in":
                return size_cm / 2.54;
            case "feet":
                return size_cm / 30.48;
            case "mm":
                return size_cm / 0.1;
            default:
                return -1;
        }
    }

}
Δημοσ.

Ο σχεδιασμός της κλάσης SizeMetric..

 

Θέλω δύο constructors με ένα όρισμα (double) και οι δύο.

 

Όχι, ίσως όμως θέλεις δύο διαφορετικές classes που κάνουν implement το ίδιο interface (ενδεχομένως με κοινή abstract base αν σε βολεύει, αυτό είναι καθαρά τεχνική λεπτομέρεια και όσον αφορά το σχεδιασμό δεν παίζει κανένα ρόλο). Οι classes αυτές θα κρατάνε τα μεγέθη σε κάποια μονάδα Χ και θα έχουν μεθόδους για να σου τα δίνουν σε όποια μονάδα θέλεις εσύ.

 

Ή όπως το έκανες και παραπάνω, μια μόνο class που θα κάνει εσωτερικά τις μετατροπές. Αυτό έχει πλεονεκτήματα και μειονεκτήματα, στην περίπτωσή σου μάλλον τα πλεονεκτήματα είναι πιο σημαντικά.

 

Όπως και σε πολλά πράγματα εδώ υπάρχουν πολλές επιλογές και η μαστοριά είναι να επιλέξεις το καλύτερο tradeoff για την περίπτωσή σου. Ο,τι και να διαβάσεις σε κάποιο forum, κανένας δεν ξέρει περισσότερα για την περίπτωσή σου απο σένα.

 

Όμως μπορεί να ξέρει περισσότερα όσον αφορά τους τρόπους με τους οποίους μπορείς να υλοποιήσεις το ίδιο πράγμα. Από όλη τη συζήτηση και τον κώδικα που δίνεις φαίνεται πως έχεις Χ γνώσεις αλλά είναι ως επι το πλείστον "μηχανικές" -- να το πω με δικά μου λόγια, "ξέρεις να γράφεις προγράμματα αλλά δεν ξέρεις προγραμματισμό". Μου δίνεται η εντύπωση πως αφού ασχολείσαι θα είχες πολλά να ωφεληθείς αν επενδύσεις σε καλύτερη γνώση αφηρημένων εννοιών (OO design, design patterns).

Δημοσ.

Όμως μπορεί να ξέρει περισσότερα όσον αφορά τους τρόπους με τους οποίους μπορείς να υλοποιήσεις το ίδιο πράγμα. Από όλη τη συζήτηση και τον κώδικα που δίνεις φαίνεται πως έχεις Χ γνώσεις αλλά είναι ως επι το πλείστον "μηχανικές" -- να το πω με δικά μου λόγια, "ξέρεις να γράφεις προγράμματα αλλά δεν ξέρεις προγραμματισμό". Μου δίνεται η εντύπωση πως αφού ασχολείσαι θα είχες πολλά να ωφεληθείς αν επενδύσεις σε καλύτερη γνώση αφηρημένων εννοιών (OO design, design patterns).

Η αλήθεια είναι οτι τα (OO design, design patterns) μου ακούγονται ξένα. Ή τουλάχιστον αν τα ξέρω δεν τα ξέρω με αυτά τα ονόματα. Όταν είχαμε κάνει αντικειμενοστρεφή προγραμματισμό στη σχολή είχαμε μάθει για κληρονομικότητα, abstract interface και τα σχετικά αλλά αν και τότε τα είχα μάθει ποτέ δεν τα "ένιωσα", και αργότερα δεν χρειάστηκαν πουθενά. Πάντως τα υπόλοιπα που θέλω να κάνω για τη συνέχεια του προγράμματος ξέρω πως και δεν θα συναντήσω θέμα σχεδίασης κλάσης. Θα τα κοιτάξω όμως. Ευχαριστώ.

 

ισως θα ηθελες να αποφυγεις switch statements

Με if τα είχα και το netbeans μου πρότεινε να το κάνω με switch...

 

Και όσον αφορά το σκοπό του προγράμματος:

 

 

Τελευταία βλέπω woodworking videos και μου γεννήθηκαν κάποια ερωτήματα σχετικά με τον τρόπο με τον οποίον επιλέγουν ποια κομμάτια ξύλων θα κόψουν και πως.

 

Επομένως το πρόγραμμα έχει σκοπό:

1) καταγραφή ξύλων (Rectangles) διάσταση + texture
2) Εμφάνιση όλων των ξύλων οργανωμένα
3) Σχεδίαση ή εισαγωγή project (πχ ένα γραφείο αποτελείται από 4 ξύλα διάστασης τόσο επι τόσο)
   α) η σχεδίαση θα γίνει με opengl (στην java το λένε JOGL δεν ξέρω ακόμη αλλά
    πόσο διαφορετικό από opengl θα ναι? ) και η εισαγωγή θα γίνεται 
    διαβάζοντας π.χ. ένα txt
4) Εμφάνιση τρόπων με τους οποίους μπορεί να γίνει το κόψιμο με τα διαθέσιμα ξύλα που
   υπάρχουν ώστε:
   α) να ελαχιστοποιηθεί η φύρα
   β) να ελαχιστοποιηθεί ο αριθμός των κοψιμάτων
   γ) να ελαχιστοποιηθεί το πλήθος των διαφορετικών ξύλων 
     (ποσα διαφορετικά Rectangles θα χρησιμοποιηθούν)
   δ) ανοιχτό για προτάσεις.
   *) + η επιλογή του να κρατιέται το texture στο project σε συνδυασμό με τα άλλα.
5) αποθήκευση ξυλείας με τέτοιο τρόπο που ελαχιστοποιείται ο όγκος (αυτό μου φαίνεται παλουκάκι)

Όταν θα βγει κάτι χρήσιμο (και αν βρω τον χρόνο) θα το ανεβάσω σε κάποιο git...

 

 

Δημοσ.

Η αλήθεια είναι οτι τα (OO design, design patterns) μου ακούγονται ξένα. Ή τουλάχιστον αν τα ξέρω δεν τα ξέρω με αυτά τα ονόματα. Όταν είχαμε κάνει αντικειμενοστρεφή προγραμματισμό στη σχολή είχαμε μάθει για κληρονομικότητα, abstract interface και τα σχετικά αλλά αν και τότε τα είχα μάθει ποτέ δεν τα "ένιωσα", και αργότερα δεν χρειάστηκαν πουθενά.

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

 

Το δε χρειάστηκαν που λες: δεν είναι αλήθεια. Η αλήθεια είναι πως χρειάστηκαν, αλλά λόγω έλλειψης γνώσεων και εμπειρίας δε μπορούσες να ξέρεις ότι στην παρούσα φάση αυτό που "χρειάζεται" για να σου λύσει το πρόβλημα σωστά είναι το ΧΥΖ. Όταν κάποιος ξέρει μόνο τα βασικά και έστω κακήν κακώς καταφέρνει να κάνει τη δουλειά του μ' αυτά είναι λογικό να νομίζει πως δε χρειάζονται τα πιο εξελιγμένα.

 

Anyway απλά ήθελα να πω ότι αν έχεις όρεξη αυτά τα πράγματα είναι το επόμενο βήμα στην ανάπτυξη της ικανότητάς σου στον προγραμματισμό. :)

 

Με if τα είχα και το netbeans μου πρότεινε να το κάνω με switch...

Case in point: if και switch είναι το ίδιο πράγμα στην ουσία. Δεν εννοούσε αυτό. Εννοούσε ότι μπορείς να έχεις πολύ καλύτερη δομή χρησιμοποιώντας τα design patterns που αναφέρει στο link που έδωσε.

 

Δες αν έχεις όρεξη κι αυτό: http://en.wikibooks.org/wiki/C++_Programming/Code/Design_Patterns

Δημοσ.

A οκ κατάλαβα αυτό με τα switch... 

 

το άλλαξα. 

public class SizeMetric {

    private double size_cm; // always save as cm
    
    public SizeMetric() {
        this.size_cm = 0;
    }

    public SizeMetric(double size) {
        this.size_cm = size;
    }
    
    public SizeMetric(double size, String metricFrom) {
        // default in centimeters
        this.size_cm = ConvertToCm(size,metricFrom);
    }
    
    public void changeSize(double new_size,String metricFrom){
        this.size_cm=ConvertToCm(new_size,metricFrom);
    }
    
    public double getSize(){
        // be careful of this one, return always in cm
        return this.size_cm;
    }

    public static double ConvertToCm(double size, String metricFrom) {
        switch (metricFrom) {
            case "cm":
                return size;
            case "in":
                return Inches_2_CM(size);
            case "feet":
                return Feet_2_CM(size);
            case "mm":
                return MM_2_CM(size);
            default:
                return -1;
        }
    }
    public static double ConvertFromCm(double size_cm, String metricTo) {
        switch (metricTo) {
            case "cm":
                return size_cm;
            case "in":
                return CM_2_Inches(size_cm);
            case "feet":
                return CM_2_Feet(size_cm);
            case "mm":
                return CM_2_MM(size_cm);
            default:
                return -1;
        }
    }
    
    public static double Inches_2_CM(double size){
        return size*2.54;
    }
    public static double Feet_2_CM(double size){
        return size*30.48;
    }
    public static double MM_2_CM(double size){
        return size*0.1;
    }
    
    public static double CM_2_Inches(double size){
        return size/2.54;
    }
    public static double CM_2_Feet(double size){
        return size/30.48;
    }
    public static double CM_2_MM(double size){
        return size/0.1;
    }
    

}

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

  • 2 εβδομάδες αργότερα...

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

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

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

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

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

Σύνδεση

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

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