შესვლა

პროგრამირების საფუძვლები › დამწყები › ფუნქციები

ამოცანის დაშლა ფუნქციებად

საშუალო⏱ 7 წთ+20 XP👑 Pro#ფუნქციები#დეკომპოზიცია#სუფთა კოდი

რას ისწავლი

  • რა არის დეკომპოზიცია (decomposition) და რატომ ამარტივებს ის პროგრამირებას
  • როგორ დაშალო ამოცანა პატარა ფუნქციებად
  • როგორ ცნობ კარგ ფუნქციას

სპილოს ჭამა ნაწილ-ნაწილ

ძველი ხუმრობა ამბობს: „როგორ შეჭამო სპილო? ნაჭერ-ნაჭერ“. დიდი პროგრამა ერთბაშად ძნელი დასაწერია, მაგრამ ის ყოველთვის პატარა ამოცანებისგან შედგება. ამოცანის პატარა, დამოუკიდებელ ნაწილებად დაყოფას დეკომპოზიცია (decomposition) ჰქვია. პროგრამირებაში თითოეული ნაწილი ხშირად ცალკე ფუნქცია ხდება.

მაგალითი: მოსწავლის ტაბელი

ამოცანა: სამი ნიშნიდან დაითვალე საშუალო, მიანიჭე შეფასება და დაბეჭდე ტაბელი. შეიძლება ყველაფერი ერთ გრძელ კოდად დაიწეროს, მაგრამ ჯობს, ჯერ ნაწილები დაინახო:

  1. საშუალოს დათვლა.
  2. საშუალოდან შეფასების არჩევა.
  3. ტაბელის დაბეჭდვა.

თითო ნაწილი, თითო ფუნქცია:

JavaScript
function average(a, b, c) {
  return (a + b + c) / 3;
}

function gradeFor(avg) {
  if (avg >= 9) {
    return "ფრიადი";
  }
  if (avg >= 7) {
    return "კარგი";
  }
  return "საშუალო";
}

function printReport(name, a, b, c) {
  let avg = average(a, b, c);
  console.log("მოსწავლე:", name);
  console.log("საშუალო:", avg);
  console.log("შეფასება:", gradeFor(avg));
}

printReport("ნინო", 9, 10, 8);
printReport("გიო", 7, 6, 8);

ნახე, როგორ იკითხება printReport: „დაითვალე საშუალო, დაბეჭდე სახელი, საშუალო და შეფასება“. დეტალები, როგორ ითვლება საშუალო ან როგორ ირჩევა შეფასება, თავ-თავის ფუნქციაშია დამალული. ნინოსთვის დაიბეჭდება საშუალო 9 და „ფრიადი“, გიოსთვის 7 და „კარგი“.

რატომ ჯობს ასე

  • თითოეულ ნაწილს ცალკე ამოწმებ. gradeFor(9.5), gradeFor(7), gradeFor(3): სამი გამოძახებით დარწმუნდები, რომ შეფასება სწორად ირჩევა, მთელი პროგრამის გაშვების გარეშე.
  • ცვლილება ერთ ადგილასაა. თუ სკოლამ შეფასების საზღვრები შეცვალა, მხოლოდ gradeFor იცვლება.
  • ხელახლა იყენებ. average შეიძლება სხვა პროგრამაშიც გამოგადგეს.
  • შეცდომა ადვილად იძებნება. თუ საშუალო არასწორია, იცი, რომელ ფუნქციაში უნდა ეძებო.

როგორია კარგი ფუნქცია

  1. ერთ საქმეს აკეთებს. თუ ფუნქციის აღწერაში სიტყვა „და“ ორჯერ გჭირდება, ის, სავარაუდოდ, ორად უნდა გაიყოს.
  2. სახელი ამბობს, რას აკეთებს. average, gradeFor, printReport და არა doStuff ან f2.
  3. მოკლეა. თუ ფუნქცია ეკრანზე აღარ ეტევა, დაშალე.
  4. რაც სჭირდება, პარამეტრებით იღებს, შედეგს return-ით აბრუნებს. ასეთი ფუნქცია გლობალურ ცვლადებზე არ არის დამოკიდებული და ყველგან იმუშავებს.

ზოგი ფუნქცია ითვლის და აბრუნებს (average, gradeFor), ზოგი ბეჭდავს (printReport). კარგია, როცა ეს ორი საქმე სხვადასხვა ფუნქციაშია.

სცადე თავად

გაუშვი. მერე gradeFor-ს დაამატე ახალი საზღვარი: 5-ზე ნაკლები საშუალოსთვის „გასაუმჯობესებელი“. ნახე, რომ printReport შეცვლა არ დაგჭირდა.

JavaScript · სცადე თავად

ხშირი შეცდომები

  • ერთი უზარმაზარი ფუნქცია. ასი ხაზი ერთ ფუნქციაში ისევე ძნელი გასაგებია, როგორც ასი ხაზი ფუნქციის გარეშე.
  • ზედმეტად წვრილი დაშლა. ფუნქცია addOne(n), რომელიც n + 1-ს აბრუნებს, კოდს არ ამარტივებს. დაშალე იქ, სადაც ნაწილს საკუთარი აზრი აქვს.
  • ფუნქცია, რომელიც ითვლის და ბეჭდავს. თუ average თვითონ ბეჭდავს შედეგს, მას სხვა გამოთვლაში ვეღარ გამოიყენებ.

სავარჯიშო

დაწერე სამი ფუნქცია მართკუთხედისთვის: area(w, h) აბრუნებს ფართობს, perimeter(w, h) აბრუნებს პერიმეტრს, describe(w, h) კი პირველი ორის გამოყენებით ბეჭდავს 5x3: ფართობი 15, პერიმეტრი 16. გამოიძახე describe(5, 3).

JavaScript · სცადე თავად
💡 მინიშნება

describe-ის შიგნით გამოიძახე area(w, h) და perimeter(w, h) და შედეგები შაბლონურ სტრიქონში ჩასვი.

✅ ამოხსნის ნახვა
JavaScript
function area(w, h) {
  return w * h;
}

function perimeter(w, h) {
  return 2 * (w + h);
}

function describe(w, h) {
  console.log(`${w}x${h}: ფართობი ${area(w, h)}, პერიმეტრი ${perimeter(w, h)}`);
}

describe(5, 3);

მინი-ქვიზი

1რა არის დეკომპოზიცია?

2რომელი სახელია ყველაზე კარგი ფუნქციისთვის, რომელიც კალათის ჯამს ითვლის?

3რატომ ჯობს, რომ average შედეგს აბრუნებდეს და არ ბეჭდავდეს?

შეჯამება

  • დეკომპოზიცია: დიდი ამოცანა პატარა ნაწილებად, თითო ნაწილი თითო ფუნქციაში.
  • კარგი ფუნქცია ერთ საქმეს აკეთებს, აქვს გასაგები სახელი და მოკლეა.
  • გამოთვლა და ბეჭდვა სხვადასხვა ფუნქციაში ჯობს.
  • პატარა ფუნქციები ცალ-ცალკე მოწმდება და ადვილად იცვლება.
📝 ჩემი შენიშვნა