Αποσφαλμάτωση
Όσο τα προγράμματα που γράφουμε γίνονται πιο περίπλοκα αναγκαζόμαστε να
χρησιμοποιούμε διάφορες τεχνικές για την αποσφαλμάτωσή τους.
Μερικές από αυτές είναι:
- ο διαχωρισμός του προγράμματος σε ξεχωριστές δομικές μονάδες
και ο ξεχωριστός έλεγχος της κάθε μιας με ένα
πρόγραμμα ελέγχου (test harness).
- ο έλεγχος της ροής του προγράμματος με τη χρήση
υπολοιμάτων ελέγχου (test stubs) αντί για ολόκληρες
συναρτήσεις.
- Η προσθήκη εντολών εκτύπωσης σε σημεία που θέλουμε να ελέγξουμε
τη ροή του προγράμματος ή τις τιμές των μεταβλητών του.
Την εκτέλεση των εντολών αυτών μπορούμε να την ελέξγουμε με μια συνθήκη
π.χ. τη μεταβλητή debug την οποία αλλάζουμε όταν το πρόγραμμα μπει σε
παραγωγή.
- Την εκτέλεση του προγράμματος σε αποσφαλματωτή.
Το παρακάτω πρόγραμμα περιέχει εντολές εκτύπωσης κάτω από τον έλεγχο
της μεταβλητής debug.
import gr.aueb.dds.BIO;
/*
* Solve a qudratic equation ax^2 + bx + c = 0
* Demonstrates the use of debug print statements
*/
class Quadratic {
public static void main(String args[]) {
double a, b, c; // Equation factors
double d; // Discriminant
boolean debug; // True during development, false in production
debug = false;
BIO.print("a=");
a = BIO.readDouble();
BIO.print("b=");
b = BIO.readDouble();
BIO.print("c=");
c = BIO.readDouble();
if (debug == true) {
BIO.println("a=" + a);
BIO.println("b=" + b);
BIO.println("c=" + c);
}
if (a == 0) {
if (debug)
BIO.println("a == 0");
if (b == 0) {
BIO.println("No solutions");
} else {
// Not really quadratic; one root
BIO.print("r=");
BIO.println(-c / b);
}
} else {
// Zero or two roots
if (debug)
BIO.println("a != 0");
d = b * b - 4 * a * c;
if (debug)
BIO.println("d=" + d);
if (d < 0) {
// Complex root
BIO.print("r=");
// Real part
BIO.print(-b / 2 / a);
BIO.print("+");
// Imaginary part
BIO.print(Math.sqrt(-d) / 2 / a);
BIO.println("i");
} else if (d == 0) {
// Two equal roots
BIO.print("r1=r2=");
BIO.println(-b / 2 / a);
} else {
BIO.print("r1=");
BIO.println((-b + Math.sqrt(d)) / 2 / a);
BIO.print("r2=");
BIO.println((-b - Math.sqrt(d)) / 2 / a);
}
}
}
}