Перейти к содержанию

KTB-10 Протестировать функционал и пофиксить баги

📝 Описание

Ознакомься с видео о тестировании и багфиксах.

// видео

🗒 Задание

  1. Провести тестирование приложения.
  2. Исправить найденные баги.

❌ Ошибки

  • не фиксят по видео баг, когда невыученных слов осталось меньше 4
  • не выносят магические числа в константы

✏️ Комментарии

Давай дополнять список уже выученными словами, если невыученных слов осталось мало (меньше `NUMBER_OF_ANSWERS`).
Передаваемые в конструктор параметры `learnedAnswerCount` и `countOfQuestionWords`, а именно магические числа, стоит вынести в константы. 
`APPROVED_LEARN_WORDS` давай теперь сделаем полем класса `LearnWordsTrainer`, тогда можно передавать эти значения в конструктор `LearnWordsTrainer`, а в будущем можно было бы брать их из конфиг-файла, и менять без перекомпиляции приложения.
Поле лучше сделать приватным. Это называется инкапсуляция — когда ты скрываешь детали реализации.
Вопрос должен формироваться в `LearnWordsTrainer`. Посмотри еще раз видео про рефакторинг, там эта тема поднимается.
Давай в конструкторах на каждой новой строке располагать параметры. Так легче читать.

⌨️ Решение

Index: src/main/kotlin/LearnWordsTrainer.kt

     val correctAnswer: Word,
 )

-class LearnWordsTrainer {
+class LearnWordsTrainer(private val learnedAnswerCount: Int, private val countOfQuestionWords: Int) {

     private var question: Question? = null
     private val dictionary = loadDictionary()

     fun getStatistics(): Statistics {
         val totalCount = dictionary.size
-        val learnedCount = dictionary.filter { it.correctAnswersCount >= 3 }.size
+        val learnedCount = dictionary.filter { it.correctAnswersCount >= learnedAnswerCount }.size
         val percent = learnedCount * 100 / totalCount
         return Statistics(totalCount, learnedCount, percent)
     }

     fun getNextQuestion(): Question? {
-        val notLearnedList = dictionary.filter { it.correctAnswersCount < 3 }
+        val notLearnedList = dictionary.filter { it.correctAnswersCount < learnedAnswerCount }
         if (notLearnedList.isEmpty()) return null
-        val questionWords = notLearnedList.shuffled().take(4)
+
+        // RA-10 bug fix
+        val questionWords = if (notLearnedList.size < countOfQuestionWords) {
+            val learnedList = dictionary.filter { it.correctAnswersCount >= learnedAnswerCount }.shuffled()
+            notLearnedList.shuffled()
+                .take(countOfQuestionWords) + learnedList
+                .take(countOfQuestionWords - notLearnedList.size)
+        } else {
+            notLearnedList.shuffled().take(countOfQuestionWords)
+        }.shuffled()
+
+        /* Перенесено выше в RA-10
+        val questionWords = notLearnedList.shuffled().take(countOfQuestionWords)
+        */
+
         val correctAnswer = questionWords.random()
         question = Question(
             variants = questionWords,
@@ -64,7 +78,7 @@
                 dictionary.add(word)
             }
             return dictionary
-        } catch (e: Exception) {
+        } catch (e: IndexOutOfBoundsException) {
             throw IllegalStateException("Некорректный файл: $e")
         }
     }
Index: src/main/kotlin/Main.kt

 fun main() {

-    val trainer = LearnWordsTrainer()
+    val trainer = try {
+        LearnWordsTrainer(3, 4)
+    } catch (e: Exception) {
+        println("Невозможно загрузить словарь")
+        return
+    }

     while (true) {
         println(
@@ -38,7 +43,7 @@
    */
    if (question == null) { // if (notLearnedList.isEmpty()) {
        println("Все слова в словаре выучены")
-       continue
+       break
    } else {

        /* Перенесено в RA-09 в getNextQuestion()