Timkor

ATMLongRead

Feb 16th, 2021 (edited)
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //Створимо масив карт користувача, який заповнимо нулями, бо поки в них ничого немає
  2. let cards = [];
  3. for (let i = 0; i < 10; i++) {
  4.     cards[i] = 0;
  5.     console.put(cards [i] + ' ')
  6. }
  7. console.log()
  8. //Тепер у визначену комірку цього масиву будемо класти визначене число "грошей"
  9. let numCard = +prompt('Введіть, будь ласка, номер картки від 0 до 9?'); // краще створювати та ініціалізувати змінну поближче до місця її застосування
  10. let userAmount;
  11. let totalAmount = 0; // Змінна для підрахунку загальної суми чисел на усіх картках користувача
  12.  
  13. // Далі завдаємо умови для визначення комірки масиву і покладання туди конкретного числа користувачем
  14.  
  15. if (numCard >= 0 && numCard <= 9) {
  16.     userAmount = +prompt('Яке число Ви покладете на цю картку? Будь ласка, від -1000 до 1000!');
  17.     if (userAmount >= -1000 && userAmount <= 1000) {
  18.         cards[numCard] = userAmount
  19.         for (let k = 0; k < cards.length; k++) {
  20.             totalAmount = totalAmount + cards [k] // можна записати скорочено, приклад t = t + c; скорочено те саме: t += c;
  21.             console.put(cards[k] + ' ')
  22.         }
  23.         console.log()
  24.         console.log('У підсумку на всіх картках лежить: ' + totalAmount)
  25.     } else if (userAmount < -1000 || userAmount > 1000) { // тут умова зайва, буде завжди тру, бо ми опинимося
  26.         // в елсе тільки якщо не виконалася первісна умова if (userAmount >= -1000 && userAmount <= 1000)
  27.         alert('Введіть, будь ласка, КОРЕКТНЕ число!!!');
  28.     }
  29. } else if (numCard < 0 || numCard > 9) { // тут умова теж зайва, бо в елсе опинимось коли первісна умова не виконалася,
  30.     // тобто тут завжди буде НЕ (первісна умова) ===  !(numCard >= 0 && numCard <= 9) === (numCard < 0 || numCard > 9)
  31.     alert('Введіть, будь ласка, КОРЕКТНИЙ номер карти!!!');
  32. }
  33.  
  34. /* код відпрацює вірно, але що можно сказати про легкість його сприйняття - заважає глибина вкладенності, тобто одні
  35. * блоки вкладені в інші і при читання треба тримати у голові де ми є і чому ми тут - тобто контекст . А коли ми
  36. * опинимось на рядку з елсом є шанс не згадати що було в умові бо вона вже далеченько . Є декілька прийомів для
  37. * запобігання зростаючої вкладенності та складності кода взагалі. Перший має назву - ранній вихід. Суть проста -
  38. * перш за все перевіряємо коректність даних, і якщо вони не коректні - робимо вихід, ранній томущо він буде до
  39. * основної логіки обробки даних. Дивіться як змінеться код: */
  40.  
  41.  
  42. let numCard = +prompt('Введіть, будь ласка, номер картки від 0 до 9?');
  43. if (numCard < 0 || numCard > 9) { //  теж саме що if (!(numCard >= 0 && numCard <= 9))
  44.     alert('Введіть, будь ласка, КОРЕКТНИЙ номер карти!!!');
  45.     // ось тут треба робити раній вихід номер один
  46. } else {
  47.     userAmount = +prompt('Яке число Ви покладете на цю картку? Будь ласка, від -1000 до 1000!');
  48.     if (userAmount < -1000 || userAmount > 1000) { // теж саме (!(userAmount >= -1000 && userAmount <= 1000))
  49.         alert('Введіть, будь ласка, КОРЕКТНЕ число!!!');
  50.         // ось тут треба робити раній вихід номер два, а якщо ми пройдемо далі, то некоректних даних бути не може
  51.         // (бо ми б вийшли), і логіка їх обробки може бути вільною від перевірок.
  52.     } else {
  53.         // з цього моменту ми впевнені, що дані коректні
  54.         cards[numCard] = userAmount
  55.         for (let k = 0; k < cards.length; k++) {
  56.             totalAmount = totalAmount + cards [k]
  57.             console.put(cards[k] + ' ')
  58.         }
  59.         console.log()
  60.         console.log('У підсумку на всіх картках лежить: ' + totalAmount)
  61.     }
  62. }
  63.  
  64. /* код став трохи трохи легший для розуміння, бо ми скоротили відстань між if та else, що дозволяє не втрачати контекст,
  65. * але .. ранній вихід - має бути вихідом, тобто ми маємо прекратити виконання функції (програми) якщо дані некоректні, для цього є
  66. * правильна і класна команда return , тобто повернутися із фунції , але вона спрацює тільки в функції, а так як ми поки
  67. * не використовуємо функцію (функція - це така підпрограма в основній програмі, все просто), а пишемо код в основній програмі,
  68. * то можемо використати команду throw new Error(тут опишемо помилку); ця команда викидає помилку і це ми робимо свідомо, бо
  69. * дані введені некоректні та їх подальша обробка може привести до гірших наслідків - fail fast. Окрім того що ця команда
  70. * викидає помилку, або кажуть викидає виключення (exception - це різновид помилок, вони вам стануть у пригоді у подальшому)
  71. * вона ще може прийняти строку, та вивести її разом із повідомленням про помилку, тобто можна передати їй те, що кажуть
  72. * ваші алерти. Ось так: */
  73.  
  74. let numCard = +prompt('Введіть, будь ласка, номер картки від 0 до 9?');
  75. if (numCard < 0 || numCard > 9) {
  76.     throw new Error('Введіть, будь ласка, КОРЕКТНИЙ номер карти!!!');// ось тут тепер ранній вихід номер один
  77. } else {
  78.     userAmount = +prompt('Яке число Ви покладете на цю картку? Будь ласка, від -1000 до 1000!');
  79.     if (userAmount < -1000 || userAmount > 1000) {
  80.         throw new Error('Введіть, будь ласка, КОРЕКТНЕ число!!!');// ось тут тепер ранній вихід номер два
  81.     } else {
  82.         // з цього моменту ми впевнені, що дані коректні
  83.         cards[numCard] = userAmount
  84.         for (let k = 0; k < cards.length; k++) {
  85.             totalAmount = totalAmount + cards [k]
  86.             console.put(cards[k] + ' ')
  87.         }
  88.         console.log()
  89.         console.log('У підсумку на всіх картках лежить: ' + totalAmount)
  90.     }
  91. }
  92.  
  93. /* знаєте для чого це все? тепер ми можемо позбавитися вкладеності. поміркуйте, чи потрібен зараз став  елсе?
  94. * поміркували? вірно, - тепер не потрібен, бо якщо ми зайдемо в if то програма закінчиться  (подбає команда return , або у
  95. * нас її заміняє викидання виключення) і до елсе не потрапимо. А якщо до if не зайдемо - тобто умова не виконується, тоді
  96. * введені дані валідні (так, час перейти з терміну коректні на більш програмістський - валідні)  то просто йдемо далі і без
  97. * елсу, ось що вийде: */
  98.  
  99. let numCard = +prompt('Введіть, будь ласка, номер картки від 0 до 9?');
  100. if (numCard < 0 || numCard > 9) {
  101.     throw new Error('Введіть, будь ласка, КОРЕКТНИЙ номер карти!!!');// ранній вихід номер один
  102. }
  103.  
  104. userAmount = +prompt('Яке число Ви покладете на цю картку? Будь ласка, від -1000 до 1000!');
  105. if (userAmount < -1000 || userAmount > 1000) {
  106.     throw new Error('Введіть, будь ласка, КОРЕКТНЕ число!!!');// ранній вихід номер два
  107. }
  108.  
  109. /* з цього моменту ми впевнені, що всі введені дані валідні (бо інакше програма скінчилась би раніше з помилкою, що ми
  110.  закодили), та можемо спокійно присвоювати та обробляти дані */
  111. cards[numCard] = userAmount
  112. for (let k = 0; k < cards.length; k++) {
  113.     totalAmount = totalAmount + cards [k]
  114.     console.put(cards[k] + ' ')
  115. }
  116. console.log()
  117. console.log('У підсумку на всіх картках лежить: ' + totalAmount)
  118.  
  119. /* нам вдалося позбавитися вкладенності, - тепер є окремі блоки, що йдуть один за одним, і якщо введені дані валідні
  120. * програма продовжує виконання, тобто йдемо до наступного блоку, а якщо ні - то програма завершуєтся. Та можна ще трохи
  121. * змінити наш програмний flow . Можна продовжувати пропонувати користувачеві ввести дані поки він не введе коректні.
  122. * при цьому нам не потрібно буде викидати помилку, бо помилок не буде, а буде замість них поввторний запит на введення
  123. * даних, знов і знов, поки не буде введено валідні дані. Це ви може закодити самостійно, я лише підскажу, що
  124. * саме для такої послідовності подій може підійти цикл do .. while. Його особливістю є те, що він завжди виконається
  125. * принаймі один раз */
  126. let дані;
  127. do {
  128.     дані = введіть дані;
  129. } while (дані не валідні)
  130. // тепер цикл можна пройти тільки ввевши валідні дані.) а взагалі в подальшому звичайний while зустрічатимеся значно частіше
  131.  
  132. /* якщо інформація тут була нудною або складною для розуміння - то так і є, це все стане простіше з часом, і тоді ж стане
  133. цікавішим.) */
  134. // Гарного коду.
Add Comment
Please, Sign In to add comment