Σημείωση:
Ο νόμος Demeter (προφ. νταϊμέτρ) (Lieberherr και Holland 1989)
έλαβε το όνομά του από το ομώνυμο ερευνητικό έργο,
το οποίο με τη σειρά του ονομάστηκε προς τιμή της
αρχαίας θεάς Δήμητρας.
Μερικοί κανόνες (Kernighan και Plauger 1976, Davis 1995) που πρέπει να ακολουθούμε κατά την κωδικοποίηση είναι οι παρακάτω:
Προσέχετε την όψη του κώδικα
Πόσα σχόλια είναι αρκετά;
Σχόλια για τα σχόλια
- Γράφετε τα σχόλια από την αρχή
- Τα σχόλια να μην επαναλαμβάνουν ό,τι λέει ο κώδικας
- Μην επεξηγείτε τον κακό κώδικα με σχόλια, ξαναγράψτε τον
- Μη χρησιμοποιείτε υπερβολικά πολλά σχόλια
- Εκφράζουμε τα σχόλια σε προστακτική
- Αφήνουμε κενό ανάμεσα στο /* // και το σχόλιο
- Ο κώδικας να συμφωνεί με τα σχόλια
Έλεγχοι
- Επιθεωρείτε τον κώδικα
- Να χρησιμοποιείτε βεβαιώσεις
- Να ελέγχετε την είσοδο του προγράμματός σας
- Να γράφετε ρουτίνες ελέγχου του κώδικα
- Να στοχεύετε στην ορθότητα πριν την απόδοση
Τι να αποφεύγετε
- Μη διορθώνετε κακογραμμένο κώδικα, ξαναγράψτε τον
- Αποφεύγετε τα "έξυπνα" τεχνάσματα
int a, b;
a ^= b;
b ^= a;
a ^= b;
int a, b, tmp;
tmp = a;
a = b;
b = tmp;
- Αποφεύγετε τις καθολικές μεταβλητές
- Αποφεύγετε τα παράπλευρα αποτελέσματα (side effects)
- Αποφεύγετε την υπερβολική εμφώλευση
- Όταν βρείτε ένα λάθος (πραγματικό ή εμφάνισης),
ψάξτε για παρόμοια
Οδηγίες και παράδειγμα μορφοποίησης κώδικα
- Σχόλιο στην αρχή του προγράμματος.
- Τα σχόλια γράφονται στα αγγλικά.
- Τα * στοιχίζονται κάθετα μεταξύ τους.
- Όνομα κλάσης.
- Το όνομα του αρχείου πρέπει να είναι ίδιο με το όνομα της κλάσης.
- Copyright.
/*
* Όνομα της κλάσης
*
* Copyright έτος όνομα/οργανισμός.
*/
- Τα τμήματα του ορισμού της κλάσης χωρίζονται από δύο κενές γραμμές.
- Πρώτος έρχεται ο προσδιοριστής package.
- Ο προσδιοριστής καθορίζει τον κατάλογο στον οποίο θα βρίσκεται ο πηγαίος κώδικας.
- Το πρόθεμα πρέπει να είναι το πλήρες όνομα ενός πεδίου ονοματοδοσίας (FQDN).
package gr.aueb.dmst.Package;
- Μια κενή γραμμή χωρίζει εντολές import από export.
import java.blah.blough.bligh;
- Ακολουθεί το σχόλιο της κλάσης.
/**
* Σύνοψη της κλάσης σε μια γραμμή.
* Αναλυτική περιγραφή της κλάσης.
*
* @version 1.82 18 Mar 1999
* @author Όνομα Επώνυμο
*/
- Η δήλωση σε μια γραμμή (αν χωράει).
- Κενό πριν το {
- Το όνομα της κλάσης αρχίζει με κεφαλαίο γράμμα.
public class SpecialHtmlParser extends FileHtmlParser {
- Μπορεί να ακολουθήσει σχόλιο που αναφέρεται στην υλοποίηση της κλάσης.
/*
* Εδώ γράφεται το σχόλιο υλοποίησης της κλάσης.
*/
- Ακολουθούν τα πεδία της κλάσης με προσδιοριστή public.
/** Σύνοψη του πεδίου κλάσης classVar1 */
public static int classVar1;
- Ακολουθούν τα πεδία της κλάσης με προσδιοριστή protected.
- Μια κενή γραμμή ανάμεσα σε δηλώσεις πεδίων και μεθόδων της κλάσης.
/** Σύνοψη του πεδίου κλάσης classVar2 */
protected static int classVar2;
- Ακολουθούν τα πεδία της κλάσης χωρίς προσδιοριστή (ορατά στο πακέτο μόνο).
/** Σύνοψη του πεδίου κλάσης classVar3 */
static int classVar3;
- Ακολουθούν τα πεδία της κλάσης με προσδιοριστή private.
/** Σύνοψη του πεδίου κλάσης classVar3 */
private static Object classVar3;
- Ακολουθούν τα πεδία υπόστασης με προσδιοριστή public.
- Σχόλιο javadoc με εκτενή επεξήγηση.
/**
* Σύνοψη του πεδίου υπόστασης instanceVar1
* Εκτενής επεξήγηση του πεδίου instanceVar1 σε πολλαπλές
* γραμμές
*/
public int instanceVar1;
- Ακολουθούν τα πεδία υπόστασης με προσδιοριστή protected.
- Μια κενή γραμμή ανάμεσα σε δηλώσεις πεδίων και μεθόδων της κλάσης.
/** Σύνοψη του πεδίου υπόστασης instanceVar2 */
protected int instanceVar2;
- Ακολουθούν τα πεδία υπόστασης χωρίς προσδιοριστή (ορατά στο πακέτο μόνο).
/** Σύνοψη του πεδίου υπόστασης instanceVar3 */
static int instanceVar3;
- Ακολουθούν τα πεδία υπόστασης με προσδιοριστή private.
/** Σύνοψη του πεδίου υπόστασης instanceVar4 */
private Object instanceVar4;
- Ακολουθούν οι μέθοδοι κατασκευής.
- Δεν υπάρχουν κενά γύρω από την ανοιχτή παρένθεση.
- Ένα κενό μετά από κάθε κόμμα στα ορίσματα.
- Ένα κενό μετά την παρένθεση.
- Το { στην ίδια γραμμή.
- Το σώμα της μεθόδου στοιχισμένο μέσα κατά τέσσερα κενά.
- Το } στοιχισμένο στο τέλος.
/** Construct a parser for the specified HTML dialect. */
SpecialHtmlParser(string dialect, int maxNesting) {
// Κώδικας
}
- Στην ίδια γραμμή το { και } αν δεν υπάρχει κώδικας στο σώμα της μεθόδου.
/** Construct a default HTML parser. */
SpecialHtmlParser(string dialect, int maxNesting) {}
- Ακολουθούν οι υπόλοιπες μέθοδοι.
- Οι μέθοδοι διαχωρίζονται μεταξύ τους με μια κενή γραμμή.
- Ορίζονται σύμφωνα με τη λειτουργικότητά τους και όχι την ορατότητά τους.
- Μέθοδοι που έχουν συγγενική λειτουργικότητα εμφανίζονται μαζί.
/**
* Σύνοψη της μεθόδου.
* Εκτενής επεξήγηση της μεθόδου σε πολλαπλές
* γραμμές.
*/
public void doSomething() {
- Οι μεταβλητές δηλώνονται στην αρχή του μπλοκ που χρησιμοποιούνται.
- Μιά δήλωση μεταβλητής σε κάθε γραμμή.
- Ένα κενό μετά τον τύπο της μεταβλητής.
- Σχόλιο για κάθε δήλωση.
- Προσπαθούμε να αρχικοποιούμε τις μεταβλήτές στη δήλωση (εκτός αν η τιμή τους εξαρτάται από μεταγενέστερο υπολογισμό).
- Δε χρειάζεται σχόλιο για μεταβλητές βρόχων ή άλλες προσωρινές μεταβλητές.
- Αποφεύγουμε να ξαναδηλώσουμε μεταβλητές με ίδιο όνομα σε εσωτερικά μπλοκ.
- Τα ονόματα των αντικειμένων είναι ουσιαστικά.
- Ένα κενό ανάμεσα στις δηλώσεις των μεταβλητών και τον κώδικα.
int nLines = 0; // HTML lines in the file
int nChars = 0 // Number of characters in the file
int i;
double averageDensity = 1.; // Average density of comments in the file
Car transport; // Transport to use
- Στοίχιση της δομής for με μια εντολή.
- Χρήση της δομής for για ατέρμονα βρόχο.
- Στοίχιση της δομής for με πολλαπλές εντολές.
- Χρήση κενών στη δομή for.
- Στη δομή for επιτρέπεται και η δήλωση του τύπου της μεταβλητής.
- Το σώμα του κώδικα στο μπλοκ στοιχισμένο μέσα κατά τέσσερα κενά.
for (int j = 0; j < 10; j++) {
a++;
b++;
}
- Στοίχιση της δομής while.
while (a < 10) {
a++;
b += 12;
}
- Στοίχιση μιας δομής μέσα σε μια άλλη.
- Κάθε φορά το σώμα του κώδικα στοιχισμένο μέσα κατά τέσσερα κενά.
while (a < 10) {
a++;
for (int i = 0; i < 10; i++)
b += 12;
}
- Στοίχιση της δομής do while.
do {
a++;
b += 12;
} while (a < 10);
- Στοίχιση της δομής switch.
switch (c) {
case 'a':
system.out.println("Alpha");
break;
case 'b':
system.out.println("Bravo");
break;
case 'c':
system.out.println("Charlie");
break;
default:
system.out.println("???");
break;
}
if (a == 3) {
system.out.println("Threee");
k = 52;
}
- Στοίχιση της δομής if else.
if (a == 3) {
system.out.println("Three");
k = 52;
} else {
system.out.println("Not three");
k = 55;
}
- Στοίχιση της δομής if else με μια εντολή σε κάθε κλάδο.
if (a == 3)
system.out.println("Three");
else
system.out.println("Not three");
- Στοίχιση πολλαπλών if else if ... else if ... else if ... else .
if (s.equals("a")
system.out.println("Alpha");
else if (s.equals("b")
system.out.println("Bravo");
else if (s.equals("c")
system.out.println("Charlie");
else
system.out.println("???");
- Στοίχιση της δομής try / catch / finaly .
try {
i = 12;
o.myMethod();
} catch (ExceptionClass e) {
statements;
} finally {
statements;
}
- Κενό ανάμεσα στους δυαδικούς τελεστές (εκτός από το `.').
- Κενό μετά το κόμμα.
- Κενό μετά τις δεσμευμένες λέξεις (for, while, do, switch, try, return, κλπ).
if (a && !b) {
a = 2 * (3 + 8) % 15;
k = a.myMethod(q, b, c);
}
return k;
- Τα ονόματα των μεθόδων πρέπει να είναι ρήματα.
- Τα ορίσματα και η επιστρεφόμενη τιμή της μεθόδου ορίζονται με σχόλιο javadoc (@param, @return)
/**
* Returns an Image object that can then be painted on the screen.
* The url argument must specify an absolute {@link URL}. The name
* argument is a specifier that is relative to the url argument.
* <p>
* This method always returns immediately, whether or not the
* image exists. When this applet attempts to draw the image on
* the screen, the data will be loaded. The graphics primitives
* that draw the image will incrementally paint on the screen.
*
* @param url an absolute URL giving the base location of the image
* name the location of the image, relative to the url argument
* @return the image at the specified URL
* @see Image
*/
public Image getImage(URL url, String name) {
try {
return getImage(new URL(url, name));
} catch (MalformedURLException e) {
return null;
}
}
- Στα απλά (όχι javadoc) σχόλια μπορούμε να χρησιμοποιήσουμε ορισμένες ειδικές λέξεις,
για να μας υπενθυμίσουν κάτι στον κώδικα.
/*
* A non-javadoc comment with a special keyword
* (recommended keywords in parenthesis)
*
* (XXX, FIXME, TODO): The comment
*/
Σημείωση: οι στηλοθέτες (tab) πρέπει να αντιστοιχούν σε 8 κενά,
έστω και αν πάντα η στοίχιση γίνεται σε 4 κενά.
Στο διορθωτή vim οι σωστές ρυθμίσεις είναι:
set shiftwidth=4
set smarttab
Βιβλιογραφία
- Rogers Candenhead. Πλήρες Εγχειρίδιο της Java 12. 8η Έκδοση.
Εκδόσεις X. Γκιούρδα, 2023.
Κεφ. 2.
- Herbert Schildt. Οδηγός της Java 7. 5η έκδοση. Εκδόσεις Γκιούρδας Μ., Αθήνα 2012. Κεφ. 12, Παράρτημα Β.
- Εμμανουήλ Σκορδαλάκης.
Εισαγωγή στην Τεχνολογία Λογισμικού, σελίδες 119-132.
Εκδόσεις Συμμετρία, 1991.
- Εμμ. Α. Γιακουμάκης
Τεχνολογία Λογισμικού: Απαιτήσεις Λογισμικού, σχεδίαση λογισμικού,
σελίδες 157-196.
Εκδόσεις Α. Σταμούλης, Αθήνα, Πειραιάς, 1994.
- Εμμ. Α. Γιακουμάκης
Τεχνολογία Λογισμικού: Κωδικοποίηση, έλεγχος και συντήρηση λογισμικού.
σελίδες 17-54.
Εκδόσεις Α. Σταμούλης, Αθήνα, Πειραιάς, 1993.
- L.W. Cannon, R.A. Elliott, L.W.
Kirchhoff, J.H. Miller, J.M. Milner, R.W. Mitze, E.P. Schan, N.O.
Whittington, Henry Spencer, David Keppel, and Mark Brader.
Recommended C style
and coding standards.
Available online http://sunland.gsfc.nasa.gov/info/cstyle.html (December 2001).
Updated version of the Indian Hill C Style and Coding Standards paper.
- Edsger Wybe Dijkstra.
Go to statement considered harmful.
Communications of the ACM, 11(3):147–148, March 1968.
- Richard Stallman et al.
GNU coding
standards.
Available online http://www.gnu.org/prep/standards_toc.html (December 2001),
October 2001.
- The FreeBSD Project.
Style – Kernel Source File Style Guide, December 1995.
FreeBSD Kernel Developer's Manual: style(9).
- Andrew Hunt and David
Thomas.
The Pragmatic
Programmer: From Journeyman to Master.
Addison Wesley Longman, 2000.
- Brian W. Kernighan
and Rob Pike.
The Practice of
Programming.
Addison-Wesley, 1999.
- Brian W. Kernighan
and P. J. Plauger.
Software
Tools.
Addison-Wesley, 1976.
- Brian W. Kernighan
and P. J. Plauger.
The Elements of
Programming Style.
McGraw-Hill, second edition, 1978.
- Karl Lieberherr
and Ian Holland.
Assuring
good style for object-oriented programs.
IEEE Software, pages 38–48, September 1989.
- Steve C McConnell.
Code Complete:
A Practical Handbook of Software Construction.
Microsoft Press, Redmond, WA, second edition, 2004.
- Roger S. Pressman.
Software
Engineering: A Practitioner's Approach, pages 420–425.
McGraw-Hill, 1987.
- Roger S. Pressman.
Software
Engineering: A Practitioner's Approach, pages 413–425.
McGraw-Hill, fifth edition, 2000.
European Adaptation. Adapted by Darrel Ince.
- Ian Sommerville.
Software
Engineering, pages 260–284,392–416.
Addison-Wesley, sixth edition, 2001.
- Henry Spencer.
The Ten Commandments for C programmers (annotated edition).
;login:, 18(2):29–31, March slash April 1993.
- Diomidis Spinellis.
Code Quality: The Open
Source Perspective.
Addison-Wesley, Boston, MA, 2006.
- Sun
Microsystems Inc.
Java code conventions (http://java.sun.com/docs/codeconv/).
Available online http://java.sun.com/docs/codeconv/ (December 2001), April
1999.
Πρόσθετες πληροφορίες
Ασκήσεις
Άσκηση 15
Μπορείτε να κατεβάσετε το αντίστοιχο αρχείο και να στείλετε τους
βαθμούς σας από τους δεσμούς που βρίσκονται στη
σελίδα των ασκήσεων.
Περιεχόμενα