paedubucher hat geschrieben:
Nachtrag: In Clean Code wird es so gelöst:
Code: Alles auswählen
public static boolean isLeapYear(int year) {
boolean fourth = year % 4 == 0;
boolean hundredth = year % 100 == 0;
boolean fourHundredth = year % 400 == 0;
return fourth && (!hundreth || fourHundredth);
}
Auch ich will noch was nachtragen:
In ``The C Programming Language'' (2nd Ed.) von Kernighan und Ritchie ist auf Seite 41 folgender Code zu finden:
Code: Alles auswählen
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
printf("%d is a leap year\n", year);
else
printf("%d is not a leap year\n", year);
Auf Seite 111 wird die gleiche Codezeile aufgegriffen, aber mit fehlendem Whitespace um den Modulo-Operator und ohne Klammern:
(Evtl. ist die Anpassung der kurzen Zeilenlaenge im Buch geschuldet.)
In ``The Practice of Programming'' von Kernighan und Pike -- dem IMO besseren Zwilling von ``Clean Code'' -- steht auf Seite 7, im Abschnitt zu runden Klammern:
Even if parenthesis aren't necessary, they can help if the grouping is hard to grasp at first glance. This code doesn't need parenthesis:
Code: Alles auswählen
leap_year = y % 4 == 0 && y % 100 != 0 || y % 400 == 0;
but they make it easier to understand:
Code: Alles auswählen
leap_year = ((y%4 == 0) && (y%100 != 0)) || (y%400 == 0);
We also removed some of the blanks: grouping the operands of higher-precedence operators helps the reader to see the structure more quickly.
(Dass hier `y' statt `year' verwendet wird ist vermutlich der Zeilenlaenge geschuldet; dafuer wurde aber vorne `leap_year' statt nur `leap' verwendet, was das `y' dadurch verstaendlich macht.)
(Edit: Interessanterweise klammern Kernighan und Co. vorne, waehrend alle anderen hinten klammern.)
Um aber auch noch was ganz Abgefahrenes aus dem alten Unix-Umfeld zu bieten, hier ein Stueck Code aus Heirloom cal(1):
Code: Alles auswählen
switch((jan1(y+1)+7-d)%7) {
/*
* non-leap year
*/
case 1:
mon[2] = 28;
break;
/*
* 1752
*/
default:
mon[9] = 19;
break;
/*
* leap year
*/
case 2:
;
}
Da war jemand super-clever und wollte das auch zeigen. Solchen Code will man nicht bearbeiten muessen.
(Ich sollte wohl mal zurueck verfolgen wo diese konkrete Implementierung herkommt ... wuerde auf Kalifornien tippen
denn in der Codebasis von mmh, meinem Softwareprojekt, gab es auch so Zeugs, und der Code stammt auch aus Kalifornien.
)