Skrivet av SexMachine:
Nu kom nästa feedback in.
*använd konstanter(inte variabler/värden) för i förväg fasta kända värden som inte beräknas/ ändras, namnsätts med versaler.
Kodraden som refererades till är följande
while (length < 1 || length > 26);
med en pil över siffran 26. användaren ska mata in ett tal mellan 1 & 26.
Detta var ju mer vettig feedback! Att använda namngivna konstanter istället för magiska nummer är väldigt bra för att öka läsbarhet och göra koden mer refaktoreringsvänlig.
Tänk dig till exempel att vi skriver en lösenordsvaliderare. Om vi använder magiska nummer skulle det kunna se ut såhär:
if (length(pw) > 3 && length(pw) < 16) {
return; // Ok!
} else if (length(pw) < 16) {
throw new Exception("Password too short!");
} else {
throw new Exception("Password too long!");
}
Ovan kod validerar alltså att lösenordet är 3 till 16 tecken långt. Tänk nu att våra krav uppdateras, och lösenord får nu vara upptill 20 tecken långa. Vi uppdaterar koden:
if (length(pw) > 3 && length(pw) < 20) { // <------ uppdaterat till 20
return; // Ok!
} else if (length(pw) < 16) { // <--------- missade att uppdatera från 16
throw new Exception("Password too short!");
} else {
throw new Exception("Password too long!");
}
Men oj, nu uppdaterade vi bara maxgränsen i det första villkoret, men råkade missa det andra, så vi har en bugg! Här hade en namngiven konstant hjälpt, eftersom vi då bara behövt ändra maxgränsen på ett enda ställe, men det skulle reflekteras i hela kodbasen, i.e. i båda villkoren.
Ett annat problem med magiska nummer är att det kan vara oklart vad de betyder. I just detta fallet kanske det är uppenbart att det handlar om undre och övre gräns för lösenordslängd, men det finns absolut scenarier där det inte alls är lika klart, och ett namn hade hjälpt betydligt.
Slutligen, ett exempel på hur lösenordsvalideringen hade förbättrats med konstanter:
final unsigned PASSWORD_MIN_LENGTH = 3;
final unsigned PASSWORD_MAX_LENGTH = 16;
void validatePassword(String pw) {
if (length(pw) > PASSWORD_MIN_LENGTH && length(pw) < PASSWORD_MAX_LENGTH) {
return;
} else if (length(pw) < PASSWORD_MAX_LENGTH) {
throw new Exception("Password too short!");
} else {
throw new Exception("Password too long!");
}
}
Edit: Obs: Jag uppmuntrar inte maxlängdskrav på lösenord -- det var bara ett exempel