Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Πως γράφουμε τον κώδικα για μια σχετικά πολύπλοκη συνάρτηση;

Îåêßíçóå áðü ôï ìÝëïò Dimitris Papadimitriou. Τελευταία δημοσίευση από το μέλος PALLADIN στις 29-08-2008, 22:07. Υπάρχουν 3 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  29-08-2008, 11:15 44350

    Πως γράφουμε τον κώδικα για μια σχετικά πολύπλοκη συνάρτηση;

    Άλλη μια ερώτηση-αφορμή για συζήτηση. Έτσι για να δούμε όλοι πως δουλεύει ο καθένας!

    Έστω ότι πάνω στη δουλειά προκύπτει η ανάγκη για μια νέα συνάρτηση. Μια συνάρτηση πολύπλοκη αρκετά ώστε να απαιτεί κάποια αρχική σκέψη, αλλά όχι τόσο πολύπλοκη που να απαιτεί δημιουργία κλάσεων και σπάσιμο του κώδικα σε υπο-συναρτήσεις.

    Πως ξεκινάτε τη δουλειά; Την σκέφτεστε λίγο και ξεκινάτε κώδικα; Κάνετε κάποιο διάγραμμα στο χαρτί; Γράφετε πρώτα το/τα unit test(s) που θα ελέγξουν το αποτέλεσμα; Κάνετε κάτι άλλο; (σημείωση: η επιλογή να την δώσετε να την κάνει κάποιος άλλος δεν παίζει!)

    Ας δώσω και ένα παράδειγμα: Έστω ότι πρέπει να κάνουμε μια συνάρτηση που να δέχετε αριθμό εδρών και array από αριθμό ψήφων ανά κόμμα και να επιστρέφει array εδρών ανά κόμμα.


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  29-08-2008, 18:10 44367 σε απάντηση της 44350

    Απ: Πως γράφουμε τον κώδικα για μια σχετικά πολύπλοκη συνάρτηση;

    Καταρχήν, να ξεκαθαρίσω πως δεν υπάρχει κάποιος κανόνας που να λέει πότε πρέπει να κάνουμε class, πότε μια συνάρτηση ή περισσότερες μέσα σε μια class. Αυτό είναι αρκετά υποκειμενικό και υπάρχουν ακόμα προγραμματιστές "purists" που υποστηρίζουν ότι ακόμα και ένας απλό value type int Θα έπρεπε να είναι δικό μας class. Με αυτό που λέω απλώς θέλω να θέσω πως κάθε άνθρωπος αναπτύσσει με τον καιρό δικούς του κανόνες για το τι είναι σωστό και τι όχι.

    Έχοντας βγάλει αυτό από τη μέση, να ξεκινήσω με την παραδοχή πως πρέπει να γράψω μια συνάρτηση.

    Για αρχή θα αναφέρω ένα από αυτά που κάνω, λόγω έλλειψης χρόνου, αλλά θα συμμετέχω στη συνέχεια στη συζήτηση για περισσότερα. Ένας γενικός κανόνας που ακολουθώ όταν κάτι θέλει λίγη περισσότερη σκέψη είναι να δημιουργήσω πρώτα μια ψεύτικη συνάρτηση που να γυρίζει πίσω ένα αποτέλεσμα "καρφωτό" και να δοκιμάζω σε πραγματικό κώδικα να δω κατά πόσο βολεύει τελικά ή όχι το signature της. Για μένα είναι σημαντικό μια συνάρτηση να έχει σωστό signature. Ένα σωστό signature βοηθάει η συνάρτηση αυτή να μπορεί να χρησιμοποιηθεί ενδεχομένως σε διάφορα σενάρια και όχι μόνον από ένα συγκεκριμένο σημείο. Επίσης, να είναι σχετικά εύκολη η χρήση της και να μη χρειάζεται κάποιος να δηλώσει το σύμπαν για να παίξει. Βέβαια εκεί θέλει μια ισορροπία διότι όσα περισσότερα βρίσκει μια συνάρτηση αυτόματα τόσο πιο δεμένη είναι με διάφορα σημεία του συστήματος.

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

    Κανένας άλλος;


    Πέτρος
  •  29-08-2008, 20:11 44371 σε απάντηση της 44350

    Απ: Πως γράφουμε τον κώδικα για μια σχετικά πολύπλοκη συνάρτηση;

    Ο Πέτρος το έθεσε πολύ σωστά. Ακόμη και στο παράδειγμα των κομμάτων και των εδρών μπορεί οι κλάσεις να είναι απαραίτητες. Για παράδειγμα, γιατί να μην υπάρχει μία κλάση Κόμμα με properties τον αριθμό ψήφων και εδρών? Σε αυτή την περίπτωση η συνάρτηση υπολογισμού των εδρών θα μπορούσε να πάει σε κάθε κόμμα, να υπολογίσει τις έδρες και να τις αποθηκεύσει στο κατάλληλο πεδίο. Και, γιατί array και όχι Dictionary με κλειδί το κόμμα?

    Τα πάντα εξαρτώνται από το πως θέλεις να χρησιμοποιήσεις τη συνάρτηση και σε ποιό πλαίσιο. Για παράδειγμα, έτσι όπως αλλάζουν οι εκλογικοί νόμοι, θα ήθελα να μπορώ να αλλάξω τον τρόπο υπολογισμού των εδρών χωρίς να πειράξω το υπόλοιπο πρόγραμμα, άσε που αν ήμουν τηλεοπτικό κανάλι θα ήθελα να δείξω τα αποτελέσματα με τον παλιό και το νέο εκλογικό νόμο. Σε μία τέτοια περίπτωση θα κοίταζα να μετατρέψω το function σε delegate έτσι ώστε να μπορώ να κάνω τους υπολογισμούς με διαφορετικό τρόπο, επιλέγοντας ποιό function να χρησιμοποιήσω.

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

    Πέρα όμως από το σχεδιασμό της σωστής λειτουργίας του function, θα πρέπει κανείς να σκεφτεί και τί θα γίνει σε περίπτωση σφαλμάτων, και φυσικά να προσθέσει τα κατάλληλα tests. Για παράδειγμα, τί θα γίνει αν υπάρχουν περισσότερα ή λιγότερα κόμματα από αυτά που περιέχονται στο array των ψήφων? Τί θα γίνει αν κάπου υπάρχουν μηδενικές ή αρνητικές ψήφοι? Αν ο αριθμός των εδρών είναι μηδέν? Όλα αυτά μπορεί να φαίνονται "περίεργα" αλλά ένα bug κάπου αλλού μπορεί άνετα να αφήσει κάποιο πεδίο με μηδενική ή παράλογη τιμή.

    Και αφού βρούμε το λάθος, τί κάνουμε? Αν έχουμε ήδη θέσει τιμές σε κάποιο εξωτερικό array ή αντικείμενο θα πρέπει να τις αντιστρέψουμε. Ακόμα καλύτερα, θα πρέπει να σχεδιάσουμε το function έτσι ώστε να μην προκαλεί παρενέργειες όταν κάτι πάει στραβά. Και τέλος, θα πρέπει να αποφασίσουμε τί θα κάνουμε με το σφάλμα? Μία περίπτωση είναι να ρίξω exception και σε περίπτωση λάθος παραμέτρων αυτό είναι καλή λύση. Ποιός όμως θα χειριστεί αυτό το exception?
        Και τί θα γίνει αν εμφανιστεί exception μέσα στο function? Ο τρόπος χειρισμού δεν είναι δεδομένος. Αν δεν σκοπεύω να κάνω κάτι γι αυτό, μπορώ απλά να αφήσω το exception να ανέβει προς τα πάνω και κάποιος άλλος θα το πιάσει και θα το χειριστεί, είτε ειδοποιώντας το χρήστη, είτε ξαναδιαβάζοντας τα δεδομένα από την πηγή. Ή μπορεί να το πιάσω σε ένα catch, να προσθέσω επιπλέον στοιχεία στο exception και να το ξαναρίξω. Τέλος μπορώ να γράψω απλά πληροφορίες σε ένα log στο finally και να αφήσω το exception να προχωρήσει.

    Όλα αυτά όμως έχουν να κάνουν με το πως και γιατί δημιουγώ το function και όχι μόνο με το τί θέλω να κάνει αυτό.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  29-08-2008, 22:07 44373 σε απάντηση της 44350

    Απ: Πως γράφουμε τον κώδικα για μια σχετικά πολύπλοκη συνάρτηση;

    Συνήθως ξεκινάω με unit tests έτσι ώστε να έχω ένα executable specification+safe net... Κατόπιν δουλεύω στην πιο απλή υλοποίηση που δουλεύει και προσπαθώ να εξασφαλίσω ότι η συνάρτηση είναι πραγματική συνάρτηση (pure)...
    Εάν είμαστε green συνεχίζω με refactoring μέχρι να ικανοποιήσω το αισθητικό μου κριτήριο...
    Εάν είμαστε ακόμα green τότε τσεκάρω εάν το performance είναι good enough για κάποιο n... Γενικά πάντως, δεν αρχίζω performance tuning εάν δεν έχω συγκεκριμένους αριθμούς που θέλω να πιάσω...

    Palladinos Nick
    Software Engineer
    -----------------------
    The limits of my language mean the limits of my world. (Ludwig Wittgenstein)
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems