პენსია NaN
სულ ცოტა ხნის წინ ალბათ ყველამ იხილეთ ვებსაიტი, სადაც შესაძლებელია მიახლოეიბითი პენსიის გამოთვლა. ეს ვებსაიტი წარმოდგენილი იყო გადაცემაში ტელეკომპანია იმედში, სადაც მოხდა ამ საპენსიო კალკულატორის დემონსტრირება. გადაცემის დროს შეგეძლოთ გეხილათ მომენტი როდესაც კალკულატორმა აჩვენა რეზულტატი: NaN. აქ აშკარად გვაქვს სახეზე პროგრამისტის საკმაოდ მარტივი და არც ისე მნიშვნელოვანი შეცდომა (ზოგიერთ შემთხვევებში). მაგრამ ყველაზე მნიშვნელოვანია თუ რა იწვევს ასეთ შეცდომებს. მოცემულ შემთხვევაში განვიხილოთ კონკრეტული ფუნქცია რომელიც გამოითვლის პენსიას.
function PensionCalculate(B1, B3, B4, B6) {
var result = {B1: B1, B3: B3, B4: B4, B6: B6,};
result.B1_1 = result.B1 / 0.8;
result.B2 = result.B1_1 * 0.06;
result.B5 = 0.03;
result.B7 = 12;
result.B8 = -FV(result.B6 / result.B7, result.B3 * result.B7, result.B2, 0);
result.B9 = result.B8 / ((1 - 1 / Math.pow((1 + result.B6 / 12), (result.B4 * 12))) / (result.B6 / 12));
result.B10 = -FV((result.B6 - result.B5) / result.B7, result.B3 * result.B7, result.B2, 0) / ((1 - 1 / Math.pow((1 + (result.B6 - result.B5) / 12), (result.B4 * 12))) / ((result.B6 - result.B5) / 12));
for (var key in result) {
switch (key) {
case'B6':
case'B5':
result[key] = result[key] * 100;
$('#' + key).val(Math.round(result[key]).toLocaleString('en'));
break;
case'B8':
case'B9':
case'B10':
$('#' + key).text(Math.round(result[key]).toLocaleString('en'));
break;
default:
$('#' + key).val(Math.round(result[key]).toLocaleString('en'));
}
$('#' + key).val(Math.round(result[key]).toLocaleString('en'));
}
}
ერთი შეხედვითაც აშკარაა რომ ადგილი გვაქვს პროგრამისტის მიერ საქმის ფეხებზე დაკიდებასთან ან უბრალოდ ჯავასკრიპტის კონვენციის და ზოგადად პროგრამირების საწყისების არ ცოდნასთან. პირველივე შეცდომა, რაც თვალში გვხვდება არის ფუნქციის სახელი, რომლის პირველი სიმბოლოც დაწერილია მაღალ რეგისტრში და არ შეესაბამება ჯავასკრიპტის კონვენციას. საკამათოა ასევე თვით ფუნქციის სახელი გრამატიკულ ჭრილში. შემდეგ მოდის ყველაზე აშკარა შეცდომა, პარამეტრები: B1, B3, B4, B6, რომლებიც საერთოდ გაუგებარია რას აკეთებენ. ეს პარამეტრები გადაეცემა ფუნქციას სათითაოდ და ფუნქციის პირველივე ხაზში იკრიბება ერთ ობიექტში, რაც აშკარად შეიძლებოდა გაცილებით კარგად კაგეთებულიყო. პარამეტრების ბოლოს არის ასევე ზედმეტი მძიმე. ამის შემდეგ ხდება საკმაოდ გაურკვეველი ფუნქციის გამოძახება რომლის სახელია FV, რაც ასევე ძნელად ჯდება კონვენციაში. შემდეგ გვხვდება for ციკლი, რომლის დასაწყისამდე და დასასრულის შემდეგაც არაა გამოტოვებული ხაზი რაც ცუდი პრაქტიკაა (ჩემი აზრით). და ამ ციკლში გვხვდება jquery, რომელიც გაუგებარია რატომაა საჭირო მარტივი კალკულატორის ასაწყობად. ასევე უნდა აღინიშნოს რომ ამ ფუნქციის გარდა სხვა ფაილები არის მინიმიზირებული და ობფუსკირებული, რაც ალბათ ლოგიკის დამალვის გარკვეული მცდელობა იყო, მაგრამ ამ ფუნქციის ასე დატოვება და ლოგიკის ჯავასკრიპტში დაწერა ამას კითხვის ნიშნის ქვეშ აყენებს.
და ბოლოს რა იყო ამ სტატიის დაწერის მიზანი. ეს არ ყოფილა ვინმესთვის შეურაცხყოფის მიყენება ან დაცინვა. ამ სტატის მიზანი უბრალოდ შეცდომებზე მითითება და რჩევის მიცემა: ვწეროთ კარგი და სუფთა კოდი, და ნუ მივცემთ სხვებს ჩვენზე დაცინვის საშუალებას და ასევე დავახვედროთ კარგი სამუშაო პირობები ადამიანებს რომლებიც მოვლენ ჩვენ შემდეგ პროექტზე სამუშაოდ, თუნდაც იმიტომ რომ არ გვაგინონ.
p.s. სტატიაში დასახელებული შეცდომები მხოლოდ მცირე ჩამონათვალია იმათგან რაც მოცემულ კოდში გვხვდება.