Πώς να αφαιρέσει τις δηλώσεις εντοπισμού σφαλμάτων από τον κώδικα της παραγωγής σε Java

ψήφοι
14

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

Είναι εύκολο να ορίσετε ένα ακίνητο (debug = true) και ελέγξτε ότι σε κάθε κατάσταση εντοπισμού σφαλμάτων, αλλά αυτό μπορεί να μειώσει την απόδοση. Θα ήταν ωραίο αν ο compiler θα κάνει απλά το debug δηλώσεις εξαφανίζονται.

Δημοσιεύθηκε 28/08/2008 στις 10:40
χρήστη
Σε άλλες γλώσσες...                            


8 απαντήσεις

ψήφοι
0

Χρησιμοποιήστε Java Preprocessor ; (google foo χαμηλά, αλλά αυτό είναι μια σύνδεση με το παλιό φόρουμ Joel συζητάμε αυτό)

Απαντήθηκε 28/08/2008 στις 10:46
πηγή χρήστη

ψήφοι
10
public abstract class Config
{
    public static final boolean ENABLELOGGING = true;
}

import static Config.*;

public class MyClass
{
    public myMethod()
    {
        System.out.println("Hello, non-logging world");

        if (ENABLELOGGING)
        {
            log("Hello, logging world.");
        }
    }
}

Ο compiler θα αφαιρέσετε το μπλοκ κώδικα με το «Γεια σας, συνδεθείτε κόσμο.» σε αυτό, αν ENABLE_LOGGING έχει οριστεί σε true, διότι είναι μια στατική τελική τιμή. Εάν χρησιμοποιείτε ένα συσκοτιστής όπως ProGuard, τότε η τάξη Config θα εξαφανιστούν πολύ.

Μια συσκοτιστής θα επιτρέψει επίσης τα πράγματα όπως αυτό, αντί:

public class MyClass
{
    public myMethod()
    {
        System.out.println("Hello, non-logging world");

        Log.log("Hello, logging world.");
    }
}

import static Config.*;

public abstract class Log
{
    public static void log(String s)
    {
        if (ENABLELOGGING)
        {
            log(s);
        }
    }
}

Η μέθοδος καταγραφής # καταγραφής θα μειώσει σε τίποτα στον compiler, και να αφαιρεθεί από το obfuscator, μαζί με τα τυχόν κλήσεις σε αυτή τη μέθοδο και τελικά ακόμα και της τάξης Σύνδεση ίδια θα πρέπει να αφαιρεθεί.

Απαντήθηκε 28/08/2008 στις 11:22
πηγή χρήστη

ψήφοι
0

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

Απαντήθηκε 28/08/2008 στις 11:28
πηγή χρήστη

ψήφοι
-2

Για να απαντήσω ευθέως στην ερώτησή σας: Δεν ξέρω.

Αλλά εδώ είναι μια άλλη λύση στο πρόβλημά σας: Στο μυαλό μου, υπάρχουν δύο δηλώσεις που συγκρούονται μεταξύ τους εδώ: «δηλώσεις debug» και «κωδικός παραγωγής».

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

Διαφωνώ με το να αφήνει δηλώσεις εντοπισμού σφαλμάτων στον κώδικα παραγωγής. Σίγουρα κανείς δεν ενοχλεί τον έλεγχο παρενέργειες του κώδικα εντοπισμού σφαλμάτων στον κώδικα παραγωγής. Ο κωδικός ίσως κάνει αυτό που θα έπρεπε να κάνει, αλλά το κάνει περισσότερο από αυτό; Μήπως όλα #defines σας λειτουργεί σωστά και πραγματικά λάβουν όλα τα διορθώσετε τον κωδικό έξω; Ποιος αναλύει 100000 γραμμές του προ-επεξεργασία κώδικα για να δείτε αν όλα τα πράγματα εντοπισμού σφαλμάτων έχει φύγει;

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

Απαντήθηκε 28/08/2008 στις 11:35
πηγή χρήστη

ψήφοι
23

Δύο προτάσεις.

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

Και αν έχετε περισσότερες από μία δήλωσή ημερολόγιο, φρουρεί το σύνολο του συγκροτήματος:

(Log4j, για παράδειγμα :)

if (logger.isDebugEnabled()) {

  // perform expensive operations
  // build string to log

  logger.debug("....");
}

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

Δεύτερος:

Μπορείτε να βρείτε ισχυρισμοί είναι πιο ό, τι χρειάζεστε. Ένας ισχυρισμός είναι μια δήλωση που αποτιμάται σε μια δυαδική αποτέλεσμα, με ένα προαιρετικό μήνυμα:

 assert (sky.state != FALLING) : "The sky is falling!";

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

Το τακτοποιημένο πράγμα είναι, αυτά αντιμετωπίζονται ειδικά από το JVM και μπορεί να εναλλάσσεται κατά το χρόνο εκτέλεσης μέχρι το επίπεδο της τάξης, χρησιμοποιώντας μια παράμετρο VM (δεν μεταγλωττίστε απαιτείται). Εάν δεν είναι ενεργοποιημένη, υπάρχει μηδενική επιβάρυνση.

Απαντήθηκε 28/08/2008 στις 11:46
πηγή χρήστη

ψήφοι
0

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

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

Χρησιμοποιώντας ένα πλαίσιο καταγραφής σημαίνει ότι μπορείτε να ρυθμίσετε τα επίπεδα καταγραφής on the fly χωρίς επανεκκίνηση της εφαρμογής.

Θα μπορούσατε να έχετε την καταγραφή, όπως:

logger.error("Something bad happened")
logger.debug("Something bad happend with loads more detail")
Απαντήθηκε 28/08/2008 στις 13:11
πηγή χρήστη

ψήφοι
1

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

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

Απαντήθηκε 28/08/2008 στις 13:52
πηγή χρήστη

ψήφοι
0

Αυτό το « κόλπο » φαίνεται να κάνει δηλώσεις εντοπισμού σφαλμάτων σας εξαφανίστηκε

public static final boolean DEBUG = false;

if (DEBUG) { //disapeared on compilation }

Η θέση είπε ότι javacείναι αρκετά έξυπνος για να ελέγξετε το static final booleanκαι αποκλείουν τις δηλώσεις εντοπισμού σφαλμάτων. (Εγώ δεν το δοκιμάσετε προσωπικά)

Για την καταγραφή, εγώ προσωπικά donot ήθελα να δω τον κωδικό όπως:

if (logger.isDebugEnabled()) {
    logger.debug("....");
}
realImportantWork();

Τα πράγματα καταγραφής μου αποσπά την προσοχή από το realImportantWork(). Ο σωστός τρόπος για μένα είναι:

logger.debug("....");
realImportantWork()

συν το config που αποκλείει όλα τα μηνύματα εντοπισμού σφαλμάτων για την παραγωγή.

Θέλω να πω ότι ο logger.isDebugEnabled()έλεγχος θα πρέπει να είναι η δουλειά του πλαισίου καταγραφής, όχι η δουλειά μου. Οι περισσότερες έννοιες στήριξη πλαίσιο της καταγραφής, όπως «καταγραφέα», «LogLevel» .. που μπορεί να κάνει το κόλπο.

Απαντήθηκε 08/05/2014 στις 11:21
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more