Tuesday, May 13, 2008

Dead Store to null - κακές συνήθειες απο τα παλιά

Το μόνο που ζητάω είναι λίγο χρόνο και ηρεμία για να μπορώ να μελετώ όλα αυτά που μου λέει το FindBugs ή το PMD για κώδικα που έχω γράψει εγώ ή συνάδελφοι! Σήμερα μου έκανε εντυπωση κάτι μικρο γενικά στον κώδικα αλλά και στα δικά μου programming habits!Τόσο απλό, τόσο λογικό αλλά όταν το φαινόμενο επαναλαμβανεται σε πολλές χιλιάδες γραμμές κώδικα τότε ξεκινάει να έχει και impact - performance wise.

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

Όταν αναφερόμαστε σε member variables η static members μιας κλάσης τότε δεν θα πρέπει να ξεχνάμε ότι αυτά γίνονται by default auto - initialized σε null ή οποιαδήποτε default value ορίζει το spec. Ας πούμε ότι αυτό είναι αρκετά σημαντικό και θα πρέπει αν το έχουμε στο μυαλό μας.

Ας πάμε όμως σε local variables μέσα σε methods. Παρατηρώ κώδικα μου και μηχανικά να γράφω το εξής!

public void doSomething( ){
String aComment = null;
boolean flag = true;
if(flag){
aComment ="true value";
}else{
aComment = "false value;
}
}


Η παραπάμνω μέθοδος είναι απόλυτα σωστή, αλλά αν την σκανάρει το FindBugs θα σε ενημερώσει
'The code stores null into a local variable, and stored value is not read. This store may have been introduced in assist the garbage collector, but as of Java SE 6.0, this is no longer needed or useful'
Βασικά ακόμα δεν έγινε και κάτι τρομερό, παρόλα αυτά αν ψάξεις παραπάνω θα δεις ότι γι'αυτο το άχρηστο null assignment στην μεταβλητή aComment έχει χαθεί μικρός χρόνος και έχει παραχθεί κάποιο bytecode! Αν δεις τον κώδικα θα μπορουσα να μην το ειχα κάνει ποτέ μιας και όπως και να έχει το aComment θα πάρει κάποια τιμή!

Θα μου πεις τώρα καλά εντάξει κάτι μας είπες. Δεν ειναι το super υπερτραγικό λάθος , αλλά μελετώντας όλα αυτά που έχει βρει το findbugs σε project με 100αδες source μην σου πω χιλιάδες βλέπεις ότι ειναι κάτι το οποίο επαναλαμβάνεις όχι μόνο εσυ αλλά και άλλοι, άρα το φαινόμενο μεγαλώνει και μεγαλώνει!

Μπορείς να δεις την μικρή εξήγηση του FindBugs εδώ + ένα απο τα πολλά thread στα forum της Sun.

3 comments:

  1. Έτσι..όπως το είπες στον τίτλο! Κακές συνήθειες!

    Αν και δεν νομίζω ότι είναι αυτή η εξήγηση (δεν μπορεί όλοι να ξεκινήσανε από c και να τους έχει μείνει το ίδιο habit!)

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

    Επίσης να και ένα καλό σχόλιο για εμάς τους ... low level (Γράφε πιο συχνά παρόμοια posts!! :D)

    ReplyDelete
  2. Διευκρίνηση ... καλό σχόλιο (επισήμανση) το θέμα του post εννοούσα, όχι το δικό μου σχόλιο ε?!

    ReplyDelete
  3. Εν τάξει Πάρι δεν έγινε και τίποτα. Ίσα ίσα που σε [b]πολλές[/b] περιπτώσεις πρέπει να το κάνεις, όταν χρησιμοποιείς μεταβλητή μέσα σε try...catch κώδικα για παράδειγμα πρέπει να την έχει αρχικοποιήσει σε null. Οπότε βλέπεις ότι πολλές φορές είναι απαραίτητο.

    ReplyDelete