├── CICD.md ├── COLLECTIONS.md ├── CYCLES1.md ├── CYCLES2.md ├── EXC.md ├── GENERICS.md ├── INH.md ├── JAVA_INTRO.md ├── MAVEN.md ├── MOCKITO.md ├── OOP1.md ├── OOP_CONST.md ├── OOP_PRINCIPLES.md ├── PRIMITIVES.md ├── README.md ├── TESTABILITY.md ├── _CHECKLIST.md └── files ├── bonus-service.zip ├── checkstyle.xml └── javaintro └── Main.java /CICD.md: -------------------------------------------------------------------------------- 1 | # Домашнее задание к занятию «Выстраивание процесса непрерывной интеграции» 2 | 3 | ## Инструкция к выполнению домашнего задания 4 | 5 | Перед тем как отправить своё решение на проверку преподавателю, сверьтесь с чеклистом. 6 | 7 |
8 | 1. В решении выполнены все требования задания 9 | 10 | Убедитесь, что все требования задания выполнены. Для этого перед отправкой внимательно прочтите весь текст условия задания и соотнесите сказанное в нём с вашим решением. Навык самопроверки работы перед ревью пригодится вам как при обучении, так и на работе. 11 | 12 | --- 13 | 14 |
15 |
16 | 2. Правильно настроен Maven-проект, тесты проходят 17 | 18 | Репозиторий должен быть папкой вашего Мавен-проекта. Обратите внимание, что репозиторием не должна быть папка, в которой лежит папка Мавен-проекта, он сам должен быть папкой проекта. В нём должны быть соответствующие файлы и папки — `pom.xml`, `src` и другие. 19 | 20 | Не забудьте создать .gitignore-файл в корне проекта и добавить туда в игнорирование автогенерируемую папку `target`. 21 | 22 | Общая схема вашего `pom.xml`-файла: 23 | 24 | ```xml 25 | 26 | 29 | 4.0.0 30 | 31 | ru.netology 32 | НАЗВАНИЕ-ВАШЕГО-ПРОЕКТА-БЕЗ-ПРОБЕЛОВ 33 | 1.0-SNAPSHOT 34 | 35 | 36 | 11 37 | 11 38 | UTF-8 39 | 40 | 41 | 42 | 43 | 44 | ... 45 | 46 | ... 47 | 48 | 49 | 50 | 51 | 52 | 53 | ... 54 | 55 | 56 | 57 | ... 58 | 59 | 60 | ... 61 | 62 | ... 63 | 64 | 65 | ... 66 | 67 | 68 | 69 | 70 | ``` 71 | 72 | #### JUnit 73 | Обратите внимание, что у артефакта нет `-api` на конце. Если у вас автоматически добавилась зависимость вида `junit-jupiter-api`, то лучше поменять артефакт на тот, что ниже, иначе будут сюрпризы в работе. 74 | 75 | ```xml 76 | 77 | org.junit.jupiter 78 | junit-jupiter 79 | 5.7.0 80 | test 81 | 82 | ``` 83 | 84 | #### Surefire 85 | Без этого плагина тесты могут Мавеном не запускаться, хоть в идее через кнопки они и будут проходить. Чтобы лишний раз убедиться, что всё работает, нажмите `Ctrl+Ctrl` и затем `mvn clean test`. 86 | 87 | ```xml 88 | 89 | org.apache.maven.plugins 90 | maven-surefire-plugin 91 | 2.22.2 92 | 93 | true 94 | 95 | 96 | ``` 97 | 98 | --- 99 | 100 |
101 | 102 |
103 | 3. Что делать, если возникли сложности 104 | 105 | Это здорово. Если их преодолевать правильно, то можно получить большую образовательную пользу для себя. Периодическое возникновение вопросов, недопонимание пройденного материала — нормальная и неотъемлемая часть обучения. А мы здесь, чтобы помочь вам пройти этот путь. 106 | 107 | ### Что делать, если непонятна теория 108 | 1. Если подобный вопрос разбирался на лекции, посмотрите ещё раз раздел с этой темой в видеозаписи. 109 | 1. Если вопрос не решился, попробуйте поискать ответ самостоятельно в интернете, этот навык пригодится вам в работе. 110 | 1. Если самостоятельно разобраться не удалось, задайте вопрос в общем чате, мы обязательно поможем. 111 | 112 | ### Что делать, если непонятно условие задания 113 | 1. Прежде чем задать вопрос по условию задачи, перечитайте его ещё раз и убедитесь, что в тексте условия нет прямого ответа на этот вопрос. Умение работать с текстом — важный навык работы с информацией. 114 | 1. Если ответа на свой вопрос в тексте условия не увидели, задайте его в общем чате, мы раскроем детали условия. 115 | 116 | ### Что делать, если не получается задача 117 | Если ваша проблема — это **ошибка компиляции** — подчёркивает красным, не даёт запустить программу, сборки проекта, CI и прочие подобные ошибки, то: 118 | 1. Найдите и прочитайте текст ошибки, который вам подсвечивает идея или логи. «Подчёркивает красным» — это не описание ошибки. 119 | 1. Попробуйте понять текст ошибки, при необходимости воспользуйтесь переводчиком. Не страшно, если вы переведёте неточно, тут главное — сам процесс: со временем и с нашей помощью вы будете это делать лучше и лучше, но, пропуская этот этап, вы не сможете научиться это делать. 120 | 1. Если не получилось понять ошибку по её тексту, попробуйте её загуглить и изучить подобную ошибку у других людей. Попробуйте примерить решения их проблем на свой код. Соотнесите найденные описания ошибки с пройденной теорией. 121 | 1. Если всё равно ваши трудности не разрешились, напишите в общий чат, обязательно указав: 122 | 1. название задачи и ссылку на условие; 123 | 1. ссылку на вашу работу; 124 | 1. текст и скриншот, не фотографию, ошибки; 125 | 1. ваши размышления и описание шагов, которые вы совершили для решения. 126 | 127 | Если ваша проблема — это **ошибка исполнения**, программа умирает уже после запуска, или она **отрабатывает неправильно**, из-за чего ваши тесты не проходят, то: 128 | 1. Воспользуйтесь отладчиком для пошагового анализа работы вашей программы. Так вы или убедитесь в неправильности придуманного вами алгоритма, или найдёте конкретное место, где ожидаемое поведение программы разошлось с фактическим. 129 | 1. Если проблему найти не получилось, напишите в общий чат, обязательно указав: 130 | 1. название задачи и ссылку на условие; 131 | 1. ссылку на вашу работу; 132 | 1. конкретное и подробное описание проблемы или затруднения при решении задачи. «Помогите, что-то не так» — это не описание; 133 | 1. подробное описание вашего анализа программы с помощью отладчика вместе со скринами; 134 | 1. ваши размышления и описание шагов, которые вы совершили для решения. 135 | --- 136 | 137 |
138 | 139 |
140 | 4. Отформатирован код [:warning:: в этом задании форматировать нужно только код тестов] 141 | 142 | Кроме правил, нарушение которых приводит к ошибкам компиляции, есть ещё и [правила форматирования кода](https://google.github.io/styleguide/javaguide.html), соблюдение которых обязательно при написании программ. 143 | 144 | С большинством проблем может справиться автоформатирование в идее. Для этого выберите `Code -> Reformat code` в меню или используйте горячие сочетания клавиш. В меню будет показано актуальное сочетание для вашей операционной системы. Так, идея поправит неправильные отступы, пробелы и некоторые другие ошибки. Следите, чтобы у `if-else`, `for`, `while` всегда были `{}`. 145 | 146 | Проблемы с именованием сущностей нужно решать самим. Так, все ячейки, кроме `final`-констант, и методы должны писаться [камелкейсом](https://ru.wikipedia.org/wiki/CamelCase) с **маленькой** буквы, а классы и интерфейсы — камелкейсом с **большой** буквы. 147 | 148 | Мы вам настоятельно советуем всегда держать код в отформатированном виде во время разработки, со временем глаз привыкнет, и вы почувствуете, насколько это облегчает поиск ошибок в коде и его анализ. В любом случае перед отправкой кода на проверку его обязательно нужно отформатировать, иначе он может быть отправлен на доработку без более глубокой проверки на этой итерации. 149 |
150 | 151 |
152 | 5. Настроен Github CI с verify-сборкой Maven и JaCoCo :new: 153 | 154 | #### CI 155 | После связывания локального репозитория с удалённым и первого пуша в заготовки проекта, время настроить CI на основе GitHub Actions. Шаблон вашего maven.yml должен выглядеть вот так, убедитесь, что всё совпадает с вашим шаблоном, например, что вы указали фазу `verify`, а не `package`: 156 | ```yml 157 | name: Java CI with Maven 158 | 159 | on: [push, pull_request] 160 | 161 | jobs: 162 | build: 163 | 164 | runs-on: ubuntu-latest 165 | 166 | steps: 167 | - uses: actions/checkout@v2 168 | - name: Set up JDK 11 169 | uses: actions/setup-java@v2 170 | with: 171 | java-version: '11' 172 | distribution: 'adopt' 173 | - name: Build with Maven 174 | run: mvn -B -e verify 175 | ``` 176 | 177 | #### JaCoCo 178 | 179 | ```xml 180 | 181 | org.jacoco 182 | jacoco-maven-plugin 183 | 0.8.5 184 | ... 185 | ``` 186 | 187 | Инициализация: 188 | ```xml 189 | 190 | prepare-agent 191 | 192 | prepare-agent 193 | 194 | 195 | ``` 196 | 197 | В режиме генерации отчётов: 198 | ```xml 199 | 200 | report 201 | verify 202 | 203 | report 204 | 205 | 206 | ``` 207 | 208 | В режиме проверки и обрушения сборки по уровню покрытия: 209 | ```xml 210 | 211 | check 212 | 213 | check 214 | 215 | 216 | 217 | 218 | 219 | 220 | LINE 221 | COVEREDRATIO 222 | 100% 223 | 224 | 225 | 226 | 227 | 228 | 229 | ``` 230 | 231 |
232 | 233 | # Задание 1. Синдром 100% (обязательное к выполнению) 234 | 235 | Вы попали в команду максималистов, которые хотят, чтобы те автотесты, которые вы пишете, покрывали код на 100%. 236 | 237 | Но вот незадача: 238 | * непонятно, что такое 100%; 239 | * непонятно, как это сделать. 240 | 241 | Вспоминаем: покрытием кода у нас занимается JaCoCo, но он просто сигнализирует о том, что конкретно пошло не так. 242 | 243 | Большинство подобных плагинов, помимо целей отчётности (`report`), содержат ещё цель `check`, которая обрушает сборку, если не выполнены определённые проверки. 244 | 245 | Что вам нужно 246 | 1. Создать Мавен-проект с тестируемым кодом из листинга кода, он указан ниже по условию. 247 | 1. Изучить [документацию на плагин](https://www.eclemma.org/jacoco/trunk/doc/maven.html), а конкретно — на цель `check`. 248 | 1. Внедрить эту цель во фазу `verify`. Обратите внимание, что эта цель и так публикуется в эту фазу. 249 | 1. Настроить правила по покрытию на 100%. При этом нужно изучить разницу между счётчиками `INSTRUCTION`, `LINE`, `BRANCH`, `COMPLEXITY`. 250 | 1. Вникнуть в тестируемый код. 251 | 1. Выбрать один из счётчиков и добиться 100% покрытия через добавление новых тестов. 252 | 253 | **Важно**: использовать можно только один из следующих: 254 | 1. `INSTRUCTION` 255 | 1. `LINE` 256 | 1. `BRANCH` 257 | 258 | Обратите внимание на чеклист в начале условия, он содержит подсказки по внедрению JaCoCo в ваш Мавен-проект. 259 | 260 | Тестируемый код, его как-либо редактировать **нельзя**: 261 | ```java 262 | package ru.netology.statistic; 263 | 264 | public class StatisticsService { 265 | /** 266 | * Calculate index of max income 267 | * 268 | * @param incomes - array of incomes 269 | * @return - index of first max value 270 | */ 271 | public long findMax(long[] incomes) { 272 | long current_max_index = 0; 273 | long current_max = incomes[0]; 274 | for (long income : incomes) 275 | if (current_max < income) 276 | current_max = income; 277 | return current_max; 278 | } 279 | } 280 | ``` 281 | 282 | Класс с тестами, его надо будет расширить новыми тестами: 283 | ```java 284 | package ru.netology.statistic; 285 | 286 | import org.junit.jupiter.api.Test; 287 | 288 | import static org.junit.jupiter.api.Assertions.*; 289 | 290 | public class StatisticsServiceTest { 291 | 292 | @Test 293 | void findMax() { 294 | StatisticsService service = new StatisticsService(); 295 | 296 | long[] incomesInBillions = {12, 5, 8, 4, 5, 3, 8, 6, 11, 11, 12}; 297 | long expected = 12; 298 | 299 | long actual = service.findMax(incomesInBillions); 300 | 301 | assertEquals(expected, actual); 302 | } 303 | } 304 | ``` 305 | 306 | Итого: отправьте на проверку ссылку на репозиторий GitHub с вашим проектом. 307 | 308 | # Задание 2*. Пусть плагин ищет баги (необязательная задача) 309 | 310 | [SpotBugs](https://spotbugs.github.io) и [Maven Plugin для него](https://spotbugs.readthedocs.io/en/latest/maven.html) предоставляют возможность производить статический анализ, то есть анализ кода без его запуска, для выявления наиболее часто встречающихся багов. 311 | 312 | [Список багов, которые ищет SpotBugs](https://spotbugs.readthedocs.io/en/latest/bugDescriptions.html). 313 | 314 | Ваша задача 315 | 1. Подключить плагин к вашему проекту. Возьмите проект из первой задачи или создайте новый на его базе. 316 | 1. Настроить goal `check` в фазу `verify`. 317 | 1. Удостовериться, что код проходит проверки SpotBugs, если не проходит, то пофиксить. 318 | 1. Сделать push в GitHub и удостовериться, что сборка проходит. 319 | 320 | Итого: отправьте на проверку ссылку на репозиторий GitHub с вашим проектом. 321 | -------------------------------------------------------------------------------- /COLLECTIONS.md: -------------------------------------------------------------------------------- 1 | # Домашнее задание к занятию «Collections Framework. CRUD и тестирование систем, управляющих набором объектов» 2 | 3 | ## Инструкция к выполнению домашнего задания 4 | 5 | Перед тем как отправить своё решение на проверку преподавателю, сверьтесь с чеклистом. 6 | 7 |
8 | 1. В решении выполнены все требования задания 9 | 10 | Убедитесь, что все требования задания выполнены. Для этого перед отправкой внимательно прочтите весь текст условия задания и соотнесите сказанное в нём с вашим решением. Навык самопроверки работы перед ревью пригодится вам как при обучении, так и на работе. 11 | 12 | --- 13 | 14 |
15 |
16 | 2. Правильно настроен Maven-проект, тесты проходят 17 | 18 | Репозиторий должен быть папкой вашего Мавен-проекта. Обратите внимание, что репозиторием не должна быть папка, в которой лежит папка Мавен-проекта, он сам должен быть папкой проекта. В нём должны быть соответствующие файлы и папки — `pom.xml`, `src` и другие. 19 | 20 | Не забудьте создать .gitignore-файл в корне проекта и добавить туда в игнорирование автогенерируемую папку `target`. 21 | 22 | Общая схема вашего `pom.xml`-файла: 23 | 24 | ```xml 25 | 26 | 29 | 4.0.0 30 | 31 | ru.netology 32 | НАЗВАНИЕ-ВАШЕГО-ПРОЕКТА-БЕЗ-ПРОБЕЛОВ 33 | 1.0-SNAPSHOT 34 | 35 | 36 | 11 37 | 11 38 | UTF-8 39 | 40 | 41 | 42 | 43 | 44 | ... 45 | 46 | ... 47 | 48 | 49 | 50 | 51 | 52 | 53 | ... 54 | 55 | 56 | 57 | ... 58 | 59 | 60 | ... 61 | 62 | ... 63 | 64 | 65 | ... 66 | 67 | 68 | 69 | 70 | ``` 71 | 72 | #### JUnit 73 | Обратите внимание, что у артефакта нет `-api` на конце. Если у вас автоматически добавилась зависимость вида `junit-jupiter-api`, то лучше поменять артефакт на тот, что ниже, иначе будут сюрпризы в работе. 74 | 75 | ```xml 76 | 77 | org.junit.jupiter 78 | junit-jupiter 79 | 5.7.0 80 | test 81 | 82 | ``` 83 | 84 | #### Surefire 85 | Без этого плагина тесты могут Мавеном не запускаться, хоть в идее через кнопки они и будут проходить. Чтобы лишний раз убедиться, что всё работает, нажмите `Ctrl+Ctrl` и затем `mvn clean test`. 86 | 87 | ```xml 88 | 89 | org.apache.maven.plugins 90 | maven-surefire-plugin 91 | 2.22.2 92 | 93 | true 94 | 95 | 96 | ``` 97 | 98 | --- 99 | 100 |
101 | 102 |
103 | 3. Что делать, если возникли сложности 104 | 105 | Это здорово. Если их преодолевать правильно, то можно получить большую образовательную пользу для себя. Периодическое возникновение вопросов, недопонимание пройденного материала — нормальная и неотъемлемая часть обучения. А мы здесь, чтобы помочь вам пройти этот путь. 106 | 107 | ### Что делать, если непонятна теория 108 | 1. Если подобный вопрос разбирался на лекции, посмотрите ещё раз раздел с этой темой в видеозаписи. 109 | 1. Если вопрос не решился, попробуйте поискать ответ самостоятельно в интернете, этот навык пригодится вам в работе. 110 | 1. Если самостоятельно разобраться не удалось, задайте вопрос в общем чате, мы обязательно поможем. 111 | 112 | ### Что делать, если непонятно условие задания 113 | 1. Прежде чем задать вопрос по условию задачи, перечитайте его ещё раз и убедитесь, что в тексте условия нет прямого ответа на этот вопрос. Умение работать с текстом — важный навык работы с информацией. 114 | 1. Если ответа на свой вопрос в тексте условия не увидели, задайте его в общем чате, мы раскроем детали условия. 115 | 116 | ### Что делать, если не получается задача 117 | Если ваша проблема — это **ошибка компиляции** — подчёркивает красным, не даёт запустить программу, сборки проекта, CI и прочие подобные ошибки, то: 118 | 1. Найдите и прочитайте текст ошибки, который вам подсвечивает идея или логи. «Подчёркивает красным» — это не описание ошибки. 119 | 1. Попробуйте понять текст ошибки, при необходимости воспользуйтесь переводчиком. Не страшно, если вы переведёте неточно, тут главное — сам процесс: со временем и с нашей помощью вы будете это делать лучше и лучше, но, пропуская этот этап, вы не сможете научиться это делать. 120 | 1. Если не получилось понять ошибку по её тексту, попробуйте её загуглить и изучить подобную ошибку у других людей. Попробуйте примерить решения их проблем на свой код. Соотнесите найденные описания ошибки с пройденной теорией. 121 | 1. Если всё равно ваши трудности не разрешились, напишите в общий чат, обязательно указав: 122 | 1. название задачи и ссылку на условие; 123 | 1. ссылку на вашу работу; 124 | 1. текст и скриншот, не фотографию, ошибки; 125 | 1. ваши размышления и описание шагов, которые вы совершили для решения. 126 | 127 | Если ваша проблема — это **ошибка исполнения**, программа умирает уже после запуска, или она **отрабатывает неправильно**, из-за чего ваши тесты не проходят, то: 128 | 1. Воспользуйтесь отладчиком для пошагового анализа работы вашей программы. Так вы или убедитесь в неправильности придуманного вами алгоритма, или найдёте конкретное место, где ожидаемое поведение программы разошлось с фактическим. 129 | 1. Если проблему найти не получилось, напишите в общий чат, обязательно указав: 130 | 1. название задачи и ссылку на условие; 131 | 1. ссылку на вашу работу; 132 | 1. конкретное и подробное описание проблемы или затруднения при решении задачи. «Помогите, что-то не так» — это не описание; 133 | 1. подробное описание вашего анализа программы с помощью отладчика вместе со скринами; 134 | 1. ваши размышления и описание шагов, которые вы совершили для решения. 135 | --- 136 | 137 |
138 | 139 | 140 |
141 | 4. Отформатирован код 142 | 143 | Кроме правил, нарушение которых приводит к ошибкам компиляции, есть ещё и [правила форматирования кода](https://google.github.io/styleguide/javaguide.html), соблюдение которых обязательно при написании программ. 144 | 145 | С большинством проблем может справиться автоформатирование в идее. Для этого выберите `Code -> Reformat code` в меню или используйте горячие сочетания клавиш. В меню будет показано актуальное сочетание для вашей операционной системы. Так, идея поправит неправильные отступы, пробелы и некоторые другие ошибки. Следите, чтобы у `if-else`, `for`, `while` всегда были `{}`. 146 | 147 | Проблемы с именованием сущностей нужно решать самим. Так, все ячейки, кроме `final`-констант, и методы должны писаться [камелкейсом](https://ru.wikipedia.org/wiki/CamelCase) с **маленькой** буквы, а классы и интерфейсы — камелкейсом с **большой** буквы. 148 | 149 | Мы вам настоятельно советуем всегда держать код в отформатированном виде во время разработки, со временем глаз привыкнет, и вы почувствуете, насколько это облегчает поиск ошибок в коде и его анализ. В любом случае перед отправкой кода на проверку его обязательно нужно отформатировать, иначе он может быть отправлен на доработку без более глубокой проверки на этой итерации. 150 |
151 | 152 | 153 |
154 | 5. Настроен GitHub CI с verify-сборкой Maven и JaCoCo в режиме генерации отчётов с покрытием на 100% по бранчам методов с логикой 155 | 156 | #### CI 157 | После связывания локального репозитория с удалённым и первого пуша в заготовки проекта, время настроить CI на основе GitHub Actions. Шаблон вашего maven.yml должен выглядеть вот так, убедитесь, что всё совпадает с вашим шаблоном, например, что вы указали фазу `verify`, а не `package`: 158 | ```yml 159 | name: Java CI with Maven 160 | 161 | on: [push, pull_request] 162 | 163 | jobs: 164 | build: 165 | 166 | runs-on: ubuntu-latest 167 | 168 | steps: 169 | - uses: actions/checkout@v2 170 | - name: Set up JDK 11 171 | uses: actions/setup-java@v2 172 | with: 173 | java-version: '11' 174 | distribution: 'adopt' 175 | - name: Build with Maven 176 | run: mvn -B -e verify 177 | ``` 178 | 179 | #### JaCoCo 180 | 181 | ```xml 182 | 183 | org.jacoco 184 | jacoco-maven-plugin 185 | 0.8.5 186 | ... 187 | ``` 188 | 189 | Инициализация: 190 | ```xml 191 | 192 | prepare-agent 193 | 194 | prepare-agent 195 | 196 | 197 | ``` 198 | 199 | В режиме генерации отчётов: 200 | ```xml 201 | 202 | report 203 | verify 204 | 205 | report 206 | 207 | 208 | ``` 209 | 210 | В режиме проверки и обрушения сборки по уровню покрытия: 211 | ```xml 212 | 213 | check 214 | 215 | check 216 | 217 | 218 | 219 | 220 | 221 | 222 | LINE 223 | COVEREDRATIO 224 | 100% 225 | 226 | 227 | 228 | 229 | 230 | 231 | ``` 232 | 233 |
234 | 235 | # Задание 1. Турнир (обязательное к выполнению) 236 | Ваша задача — разработать класс, управляющий турниром игроков. Каждый игрок описывается дата-классом `Player` с полями `id`, `name`, `strength` (сила). 237 | 238 | Сам же турнир описывается классом `Game` с методами: 239 | * `register (Player player)` — метод регистрации игрока, если игрок не зарегистрирован, то он не сможет играть в турнире. Вам нужно хранить всех зарегистрированных игроков в поле класса `Game` в виде списка. 240 | * `round (String playerName1, String playerName2)` — метод соревнования между двумя игроками. Если хотя бы один из игроков не зарегистрирован, должно выкинуться исключение `NotRegisteredException` — сами создайте его класс. Обратите внимание, что игроки передаются методу через имя — полную информацию об игроке нужно будет найти в коллекции зарегистрированных игроков (см. аналог в виде `findById` из прошлых домашних заданий). Выигрывает тот игрок, у которого больше `strength` (сила), если сила одинаковая, то будет ничья. Метод должен возвращать одно число — `0` в случае ничьи, `1` в случае победы первого игрока и `2` в случае победы второго игрока. 241 | 242 | Напишите на класс `Game` тесты, покрыв по бранчам на 100%. 243 | 244 | Итого: отправьте на проверку ссылку на репозиторий GitHub с вашим проектом. 245 | 246 | # Задание 2*. Турнир: ускорение (необязательная задача) 247 | 248 | Отведите ветку `fast` в репозитории прошлой задачи и выполняйте эту задачу в ней. 249 | Доработайте прошлую задачу, заменив коллекцию списка игроков на мапу (`HashMap`) для быстрого поиска информации об игроке по его имени. 250 | Создайте Pull Request этой ветки к основной, но не применяйте его. 251 | Убедитесь, что все тесты проходят, CI работает на вашей ветке. 252 | 253 | ### Результат 254 | При отправке решения в личном кабинете прикрепите ссылку на репозиторий GitHub с вашим проектом, в котором будет Pull Request. 255 | -------------------------------------------------------------------------------- /CYCLES1.md: -------------------------------------------------------------------------------- 1 | # Домашнее задание к занятию «Пакеты и циклы» 2 | 3 | ## Инструкция к выполнению домашнего задания 4 | 5 | Перед тем как отправить своё решение на проверку преподавателю, сверьтесь с чеклистом. 6 | 7 |
8 | 1. В решении выполнены все требования задания 9 | 10 | Убедитесь, что все требования задания выполнены. Для этого перед отправкой внимательно прочтите весь текст условия задания и соотнесите сказанное в нём с вашим решением. Навык самопроверки работы перед ревью пригодится вам как при обучении, так и на работе. 11 | 12 | --- 13 | 14 |
15 |
16 | 2. Правильно настроен Maven-проект, тесты проходят 17 | 18 | Репозиторий должен быть папкой вашего Мавен-проекта. Обратите внимание, что репозиторием не должна быть папка, в которой лежит папка Мавен-проекта, он сам должен быть папкой проекта. В нём должны быть соответствующие файлы и папки — `pom.xml`, `src` и другие. 19 | 20 | Не забудьте создать .gitignore-файл в корне проекта и добавить туда в игнорирование автогенерируемую папку `target`. 21 | 22 | Общая схема вашего `pom.xml`-файла: 23 | 24 | ```xml 25 | 26 | 29 | 4.0.0 30 | 31 | ru.netology 32 | НАЗВАНИЕ-ВАШЕГО-ПРОЕКТА-БЕЗ-ПРОБЕЛОВ 33 | 1.0-SNAPSHOT 34 | 35 | 36 | 11 37 | 11 38 | UTF-8 39 | 40 | 41 | 42 | 43 | 44 | ... 45 | 46 | ... 47 | 48 | 49 | 50 | 51 | 52 | 53 | ... 54 | 55 | 56 | 57 | ... 58 | 59 | 60 | ... 61 | 62 | ... 63 | 64 | 65 | ... 66 | 67 | 68 | 69 | 70 | ``` 71 | 72 | #### JUnit 73 | Обратите внимание, что у артефакта нет `-api` на конце. Если у вас автоматически добавилась зависимость вида `junit-jupiter-api`, то лучше поменять артефакт на тот, что ниже, иначе будут сюрпризы в работе. 74 | 75 | ```xml 76 | 77 | org.junit.jupiter 78 | junit-jupiter 79 | 5.7.0 80 | test 81 | 82 | ``` 83 | 84 | #### Surefire 85 | Без этого плагина тесты могут Мавеном не запускаться, хоть в идее через кнопки они и будут проходить. Чтобы лишний раз убедиться, что всё работает, нажмите `Ctrl+Ctrl` и затем `mvn clean test`. 86 | 87 | ```xml 88 | 89 | org.apache.maven.plugins 90 | maven-surefire-plugin 91 | 2.22.2 92 | 93 | true 94 | 95 | 96 | ``` 97 | 98 | --- 99 | 100 |
101 | 102 |
103 | 3. Что делать, если возникли сложности 104 | 105 | Это здорово. Если их преодолевать правильно, то можно получить большую образовательную пользу для себя. Периодическое возникновение вопросов, недопонимание пройденного материала — нормальная и неотъемлемая часть обучения. А мы здесь, чтобы помочь вам пройти этот путь. 106 | 107 | ### Что делать, если непонятна теория 108 | 1. Если подобный вопрос разбирался на лекции, посмотрите ещё раз раздел с этой темой в видеозаписи. 109 | 1. Если вопрос не решился, попробуйте поискать ответ самостоятельно в интернете, этот навык пригодится вам в работе. 110 | 1. Если самостоятельно разобраться не удалось, задайте вопрос в общем чате, мы обязательно поможем. 111 | 112 | ### Что делать, если непонятно условие задания 113 | 1. Прежде чем задать вопрос по условию задачи, перечитайте его ещё раз и убедитесь, что в тексте условия нет прямого ответа на этот вопрос. Умение работать с текстом — важный навык работы с информацией. 114 | 1. Если ответа на свой вопрос в тексте условия не увидели, задайте его в общем чате, мы раскроем детали условия. 115 | 116 | ### Что делать, если не получается задача 117 | Если ваша проблема — это **ошибка компиляции** — подчёркивает красным, не даёт запустить программу, сборки проекта, CI и прочие подобные ошибки, то: 118 | 1. Найдите и прочитайте текст ошибки, который вам подсвечивает идея или логи. «Подчёркивает красным» — это не описание ошибки. 119 | 1. Попробуйте понять текст ошибки, при необходимости воспользуйтесь переводчиком. Не страшно, если вы переведёте неточно, тут главное — сам процесс: со временем и с нашей помощью вы будете это делать лучше и лучше, но, пропуская этот этап, вы не сможете научиться это делать. 120 | 1. Если не получилось понять ошибку по её тексту, попробуйте её загуглить и изучить подобную ошибку у других людей. Попробуйте примерить решения их проблем на свой код. Соотнесите найденные описания ошибки с пройденной теорией. 121 | 1. Если всё равно ваши трудности не разрешились, напишите в общий чат, обязательно указав: 122 | 1. название задачи и ссылку на условие; 123 | 1. ссылку на вашу работу; 124 | 1. текст и скриншот, не фотографию, ошибки; 125 | 1. ваши размышления и описание шагов, которые вы совершили для решения. 126 | 127 | Если ваша проблема — это **ошибка исполнения**, программа умирает уже после запуска, или она **отрабатывает неправильно**, из-за чего ваши тесты не проходят, то: 128 | 1. Воспользуйтесь отладчиком для пошагового анализа работы вашей программы. Так вы или убедитесь в неправильности придуманного вами алгоритма, или найдёте конкретное место, где ожидаемое поведение программы разошлось с фактическим. 129 | 1. Если проблему найти не получилось, напишите в общий чат, обязательно указав: 130 | 1. название задачи и ссылку на условие; 131 | 1. ссылку на вашу работу; 132 | 1. конкретное и подробное описание проблемы или затруднения при решении задачи. «Помогите, что-то не так» — это не описание; 133 | 1. подробное описание вашего анализа программы с помощью отладчика вместе со скринами; 134 | 1. ваши размышления и описание шагов, которые вы совершили для решения. 135 | --- 136 | 137 |
138 | 139 | 140 |
141 | 4. Отформатирован код 142 | 143 | Кроме правил, нарушение которых приводит к ошибкам компиляции, есть ещё и [правила форматирования кода](https://google.github.io/styleguide/javaguide.html), соблюдение которых обязательно при написании программ. 144 | 145 | С большинством проблем может справиться автоформатирование в идее. Для этого выберите `Code -> Reformat code` в меню или используйте горячие сочетания клавиш. В меню будет показано актуальное сочетание для вашей операционной системы. Так, идея поправит неправильные отступы, пробелы и некоторые другие ошибки. Следите, чтобы у `if-else`, `for`, `while` всегда были `{}`. 146 | 147 | Проблемы с именованием сущностей нужно решать самим. Так, все ячейки, кроме `final`-констант, и методы должны писаться [камелкейсом](https://ru.wikipedia.org/wiki/CamelCase) с **маленькой** буквы, а классы и интерфейсы — камелкейсом с **большой** буквы. 148 | 149 | Мы вам настоятельно советуем всегда держать код в отформатированном виде во время разработки, со временем глаз привыкнет, и вы почувствуете, насколько это облегчает поиск ошибок в коде и его анализ. В любом случае перед отправкой кода на проверку его обязательно нужно отформатировать, иначе он может быть отправлен на доработку без более глубокой проверки на этой итерации. 150 |
151 | 152 | 153 | # Задание 1. Количество квадратов (обязательное к выполнению) 154 | 155 | Вам предстоит разработать сервисный класс, метод которого перебирает числа от **10** до **99** и считает, сколько из их квадратов попали в определённый диапазон чисел, границы которого заданы параметрами этого метода. Границы считать входящими в диапазон. 156 | 157 | Например, если границы заданы диапазоном от 200 до 300, то квадраты лишь трёх чисел — 15, 16 и 17 — попадают в диапазон от 200 до 300, и на таких данных метод должен вернуть число 3. 158 | 159 | Вам необходимо: 160 | 1. Создать Maven-проект, в котором в пакете `ru.netology.sqr` будет класс `SQRService` с необходимым методом. Сами придумайте ему говорящее название. 161 | 2. Метод должен принимать два целых числа в параметрах — границы диапазона. 162 | 3. Написать на метод автотесты, которые проверяют правильность работы на тестовых данных, подберите их сами. 163 | 4. Убедитесь, что ваши автотесты работают и проходят. Для этого пробуйте ронять каждый свой тест и удостоверяйтесь, что он действительно падает, затем верните, чтобы все тесты проходили. 164 | 165 | ### Результат 166 | При отправке решения в личном кабинете прикрепите ссылку на ваш публичный репозиторий GitHub с вашим проектом. 167 | -------------------------------------------------------------------------------- /CYCLES2.md: -------------------------------------------------------------------------------- 1 | # Домашнее задание к занятию «Строки и массивы» 2 | 3 | ## Инструкция к выполнению домашнего задания 4 | 5 | Перед тем как отправить своё решение на проверку преподавателю, сверьтесь с чеклистом. 6 | 7 |
8 | 1. В решении выполнены все требования задания 9 | 10 | Убедитесь, что все требования задания выполнены. Для этого перед отправкой внимательно прочтите весь текст условия задания и соотнесите сказанное в нём с вашим решением. Навык самопроверки работы перед ревью пригодится вам как при обучении, так и на работе. 11 | 12 | --- 13 | 14 |
15 |
16 | 2. Правильно настроен Maven-проект, тесты проходят 17 | 18 | Репозиторий должен быть папкой вашего Мавен-проекта. Обратите внимание, что репозиторием не должна быть папка, в которой лежит папка Мавен-проекта, он сам должен быть папкой проекта. В нём должны быть соответствующие файлы и папки — `pom.xml`, `src` и другие. 19 | 20 | Не забудьте создать .gitignore-файл в корне проекта и добавить туда в игнорирование автогенерируемую папку `target`. 21 | 22 | Общая схема вашего `pom.xml`-файла: 23 | 24 | ```xml 25 | 26 | 29 | 4.0.0 30 | 31 | ru.netology 32 | НАЗВАНИЕ-ВАШЕГО-ПРОЕКТА-БЕЗ-ПРОБЕЛОВ 33 | 1.0-SNAPSHOT 34 | 35 | 36 | 11 37 | 11 38 | UTF-8 39 | 40 | 41 | 42 | 43 | 44 | ... 45 | 46 | ... 47 | 48 | 49 | 50 | 51 | 52 | 53 | ... 54 | 55 | 56 | 57 | ... 58 | 59 | 60 | ... 61 | 62 | ... 63 | 64 | 65 | ... 66 | 67 | 68 | 69 | 70 | ``` 71 | 72 | #### JUnit 73 | Обратите внимание, что у артефакта нет `-api` на конце. Если у вас автоматически добавилась зависимость вида `junit-jupiter-api`, то лучше поменять артефакт на тот, что ниже, иначе будут сюрпризы в работе. 74 | 75 | ```xml 76 | 77 | org.junit.jupiter 78 | junit-jupiter 79 | 5.7.0 80 | test 81 | 82 | ``` 83 | 84 | #### Surefire 85 | Без этого плагина тесты могут Мавеном не запускаться, хоть в идее через кнопки они и будут проходить. Чтобы лишний раз убедиться, что всё работает, нажмите `Ctrl+Ctrl` и затем `mvn clean test`. 86 | 87 | ```xml 88 | 89 | org.apache.maven.plugins 90 | maven-surefire-plugin 91 | 2.22.2 92 | 93 | true 94 | 95 | 96 | ``` 97 | 98 | --- 99 | 100 |
101 | 102 |
103 | 3. Что делать, если возникли сложности 104 | 105 | Это здорово. Если их преодолевать правильно, то можно получить большую образовательную пользу для себя. Периодическое возникновение вопросов, недопонимание пройденного материала — нормальная и неотъемлемая часть обучения. А мы здесь, чтобы помочь вам пройти этот путь. 106 | 107 | ### Что делать, если непонятна теория 108 | 1. Если подобный вопрос разбирался на лекции, посмотрите ещё раз раздел с этой темой в видеозаписи. 109 | 1. Если вопрос не решился, попробуйте поискать ответ самостоятельно в интернете, этот навык пригодится вам в работе. 110 | 1. Если самостоятельно разобраться не удалось, задайте вопрос в общем чате, мы обязательно поможем. 111 | 112 | ### Что делать, если непонятно условие задания 113 | 1. Прежде чем задать вопрос по условию задачи, перечитайте его ещё раз и убедитесь, что в тексте условия нет прямого ответа на этот вопрос. Умение работать с текстом — важный навык работы с информацией. 114 | 1. Если ответа на свой вопрос в тексте условия не увидели, задайте его в общем чате, мы раскроем детали условия. 115 | 116 | ### Что делать, если не получается задача 117 | Если ваша проблема — это **ошибка компиляции** — подчёркивает красным, не даёт запустить программу, сборки проекта, CI и прочие подобные ошибки, то: 118 | 1. Найдите и прочитайте текст ошибки, который вам подсвечивает идея или логи. «Подчёркивает красным» — это не описание ошибки. 119 | 1. Попробуйте понять текст ошибки, при необходимости воспользуйтесь переводчиком. Не страшно, если вы переведёте неточно, тут главное — сам процесс: со временем и с нашей помощью вы будете это делать лучше и лучше, но, пропуская этот этап, вы не сможете научиться это делать. 120 | 1. Если не получилось понять ошибку по её тексту, попробуйте её загуглить и изучить подобную ошибку у других людей. Попробуйте примерить решения их проблем на свой код. Соотнесите найденные описания ошибки с пройденной теорией. 121 | 1. Если всё равно ваши трудности не разрешились, напишите в общий чат, обязательно указав: 122 | 1. название задачи и ссылку на условие; 123 | 1. ссылку на вашу работу; 124 | 1. текст и скриншот, не фотографию, ошибки; 125 | 1. ваши размышления и описание шагов, которые вы совершили для решения. 126 | 127 | Если ваша проблема — это **ошибка исполнения**, программа умирает уже после запуска, или она **отрабатывает неправильно**, из-за чего ваши тесты не проходят, то: 128 | 1. Воспользуйтесь отладчиком для пошагового анализа работы вашей программы. Так вы или убедитесь в неправильности придуманного вами алгоритма, или найдёте конкретное место, где ожидаемое поведение программы разошлось с фактическим. 129 | 1. Если проблему найти не получилось, напишите в общий чат, обязательно указав: 130 | 1. название задачи и ссылку на условие; 131 | 1. ссылку на вашу работу; 132 | 1. конкретное и подробное описание проблемы или затруднения при решении задачи. «Помогите, что-то не так» — это не описание; 133 | 1. подробное описание вашего анализа программы с помощью отладчика вместе со скринами; 134 | 1. ваши размышления и описание шагов, которые вы совершили для решения. 135 | --- 136 | 137 |
138 | 139 | 140 |
141 | 4. Отформатирован код 142 | 143 | Кроме правил, нарушение которых приводит к ошибкам компиляции, есть ещё и [правила форматирования кода](https://google.github.io/styleguide/javaguide.html), соблюдение которых обязательно при написании программ. 144 | 145 | С большинством проблем может справиться автоформатирование в идее. Для этого выберите `Code -> Reformat code` в меню или используйте горячие сочетания клавиш. В меню будет показано актуальное сочетание для вашей операционной системы. Так, идея поправит неправильные отступы, пробелы и некоторые другие ошибки. Следите, чтобы у `if-else`, `for`, `while` всегда были `{}`. 146 | 147 | Проблемы с именованием сущностей нужно решать самим. Так, все ячейки, кроме `final`-констант, и методы должны писаться [камелкейсом](https://ru.wikipedia.org/wiki/CamelCase) с **маленькой** буквы, а классы и интерфейсы — камелкейсом с **большой** буквы. 148 | 149 | Мы вам настоятельно советуем всегда держать код в отформатированном виде во время разработки, со временем глаз привыкнет, и вы почувствуете, насколько это облегчает поиск ошибок в коде и его анализ. В любом случае перед отправкой кода на проверку его обязательно нужно отформатировать, иначе он может быть отправлен на доработку без более глубокой проверки на этой итерации. 150 |
151 | 152 | # Задание 1. Статистика (обязательное к выполнению) 153 | 154 | Статистика — очень важный компонент любого бизнеса. У вас есть набор данных о продажах конкретного предприятия по месяцам: `[8, 15, 13, 15, 17, 20, 19, 20, 7, 14, 14, 18]`. 155 | 156 | Программисты все заняты, и вам поручили написать небольшой сервис, который умеет по предоставленному ему массиву месячных продаж рассчитывать: 157 | 1. Сумму всех продаж. 158 | 2. Среднюю сумму продаж в месяц. 159 | 3. Номер месяца, в котором был пик продаж, то есть осуществлены продажи на максимальную сумму*. 160 | 4. Номер месяца, в котором был минимум продаж, то есть осуществлены продажи на минимальную сумму*. 161 | 5. Количество месяцев, в которых продажи были ниже среднего (см. п.2). 162 | 6. Количество месяцев, в которых продажи были выше среднего (см. п.2). 163 | 164 | Примечание:* в вашем задании нужно найти последний месяц, соответствующий условиям. 165 | 166 | Сервис должен представлять собой один класс с шестью методами — по методу на пункт. Входные данные для расчёта сервис должен принимать в параметрах своих методов. Обратите внимание, что написанный класс должен уметь работать с любыми значениями в массиве продаж, а приведённый выше набор — это лишь пример данных для ваших тестов на методы создаваемого класса. 167 | 168 | Метод ниже считает номер месяца минимальных продаж. Логика его такова: заводим переменную `minMonth` для хранения номера ячейки в массиве того месяца, в котором были минимальные продажи среди всех уже просмотренных. Изначально мы никакие ещё не просмотрели, потому запишем туда номер 0. Будем циклом поочерёдно смотреть месяцы продаж: на каждой итерации у нас в `sale` будет количество продаж в рассматриваемом месяце, в `month` — номер этого рассматриваемого месяца. Если мы смотрим на месяц, в котором продажи меньше, чем в минимальном из просмотренных ранее, чей номер запомнен в `minMonth`, то считаем теперь этот рассматриваемый месяц минимальным и присваиваем в `minMonth` значение `month`. И так до конца массива продаж, тогда после цикла в `minMonth` у нас будет лежать номер месяца минимальных продаж. Останется только один момент: мы нумеровали месяцы с нуля, так как в массивах ячейки нумеруются с нуля, потому, отдавая ответ, нам надо прибавить 1. 169 | 170 | ```java 171 | public int minSales(long[] sales) { 172 | int minMonth = 0; 173 | int month = 0; // переменная для индекса рассматриваемого месяца в массиве 174 | for (long sale : sales) { 175 | // sales[minMonth] - продажи в месяце minMonth 176 | // sale - продажи в рассматриваемом месяце 177 | if (sale <= sales[minMonth]) { 178 | minMonth = month; 179 | } 180 | month = month + 1; // следующий рассматриваемый месяц имеет номер на 1 больше 181 | } 182 | return minMonth + 1; 183 | } 184 | ``` 185 | 186 | Вам необходимо 187 | 1. Создать Maven-проект, в котором в package `ru.netology.stats` будет класс `StatsService` с необходимыми методами, сами придумайте им говорящие названия. 188 | 1. Написать на каждый метод по одному автотесту, который проверяет правильность работы на тестовых данных. 189 | 1. Убедиться, что ваши автотесты работают и проходят. Для этого пробуйте ронять каждый свой тест и удостоверяйтесь, что он действительно падает. 190 | 191 | Итого: отправьте на проверку ссылку на репозиторий GitHub с вашим проектом. 192 | 193 | # Задание 2*. @CsvFileSource (необязательная задача повышенной сложности) 194 | 195 | Мы с вами на лекции разобрали аннотацию `@CsvSource`, внутри которой можно писать строки в формате CSV. 196 | 197 | Писать значения прямо в аннотации не плохо, но если их будет штук 50, то, наверное, ничего хорошего из этого не выйдет. 198 | 199 | Поэтому хорошо бы воспользоваться возможностями JUnit и аннотации `@CsvFileSource`. 200 | 201 | Вам необходимо взять проект с калькулятором бонусов и переписать сценарии таким образом, чтобы данные читались из файла формата CSV. 202 | 203 | Сам файл необходимо положить в каталог `resources`, который тоже нужно создать, следующим образом: 204 | 205 | ![image](https://user-images.githubusercontent.com/53707586/149668473-da63281c-4243-4071-a6cf-89e45036b9d1.png) 206 | 207 | Быстро это сделать можно вот так: `Alt + Insert` на каталоге `test` выбираете `New File` и дальше вводите имя файла вместе с именем каталога: 208 | 209 | ![image](https://user-images.githubusercontent.com/53707586/149668489-54c14f68-9c83-4290-b700-5d2b5def114f.png) 210 | 211 | IDEA сама за вас создаст и каталог, и файл. 212 | 213 | После чего в боковой панельке следует сделать reimport Maven-проекта: 214 | 215 | ![image](https://user-images.githubusercontent.com/53707586/149668495-8ceb5cd7-eee0-41d5-96ac-e2b555f9d206.png) 216 | 217 | И IDEA поставит вам красивую иконочку на ресурсы для тестов: 218 | 219 | ![image](https://user-images.githubusercontent.com/53707586/149668513-62555f95-f0f2-440f-927c-4feb0e337f42.png) 220 | 221 | Сам файл вы можете редактировать прямо в IDEA, это обычный текстовый файл, но подчиняющийся правилам CSV. 222 | 223 | При этом обратите внимание, что кодировка файла UTF8: 224 | 225 | ![image](https://user-images.githubusercontent.com/53707586/149668544-fd8fc7a2-dd46-4811-800e-51094f0d04d8.png) 226 | 227 | Если это не так, кликните на указанном поле и выберите UTF8: 228 | 229 | ![image](https://user-images.githubusercontent.com/53707586/149668575-749f377d-ec5b-4a06-a3ae-51a19dacd0bc.png) 230 | 231 | Например, на лекции было (`value` требовал массив): 232 | ```java 233 | @CsvSource( 234 | value={ 235 | "'registered user, bonus under limit',100060,true,30", 236 | "'registered user, bonus over limit',100000060,true,500" 237 | } 238 | ) 239 | ``` 240 | 241 | Если элемент в массиве только один, то полная запись: 242 | ```java 243 | @CsvSource( 244 | value={ 245 | "'registered user, bonus under limit',100060,true,30" 246 | } 247 | ) 248 | ``` 249 | 250 | Сокращённая — работает только с одним элементом: 251 | ```java 252 | @CsvSource(value="'registered user, bonus under limit',100060,true,30") 253 | ``` 254 | 255 | А если вы везунчик, и элемент ещё и называется `value`, то: 256 | ```java 257 | @CsvSource("'registered user, bonus under limit',100060,true,30") 258 | ``` 259 | 260 | Использованная аннотация должна выглядеть следующим образом: 261 | ```java 262 | @CsvFileSource(resources = "/data.csv") 263 | ``` 264 | 265 | ### Решение 266 | 267 | При отправке решения в личном кабинете прикрепите ссылку на ваш публичный репозиторий GitHub с вашим проектом. 268 | -------------------------------------------------------------------------------- /EXC.md: -------------------------------------------------------------------------------- 1 | # Домашнее задание к занятию «Исключительные ситуации и их обработка. Тестирование исключений» 2 | 3 | ## Инструкция к выполнению домашнего задания 4 | 5 | Перед тем как отправить своё решение на проверку преподавателю, сверьтесь с чеклистом. 6 | 7 |
8 | 1. В решении выполнены все требования задания 9 | 10 | Убедитесь, что все требования задания выполнены. Для этого перед отправкой внимательно прочтите весь текст условия задания и соотнесите сказанное в нём с вашим решением. Навык самопроверки работы перед ревью пригодится вам как при обучении, так и на работе. 11 | 12 | --- 13 | 14 |
15 |
16 | 2. Правильно настроен Maven-проект, тесты проходят 17 | 18 | Репозиторий должен быть папкой вашего Мавен-проекта. Обратите внимание, что репозиторием не должна быть папка, в которой лежит папка Мавен-проекта, он сам должен быть папкой проекта. В нём должны быть соответствующие файлы и папки — `pom.xml`, `src` и другие. 19 | 20 | Не забудьте создать .gitignore-файл в корне проекта и добавить туда в игнорирование автогенерируемую папку `target`. 21 | 22 | Общая схема вашего `pom.xml`-файла: 23 | 24 | ```xml 25 | 26 | 29 | 4.0.0 30 | 31 | ru.netology 32 | НАЗВАНИЕ-ВАШЕГО-ПРОЕКТА-БЕЗ-ПРОБЕЛОВ 33 | 1.0-SNAPSHOT 34 | 35 | 36 | 11 37 | 11 38 | UTF-8 39 | 40 | 41 | 42 | 43 | 44 | ... 45 | 46 | ... 47 | 48 | 49 | 50 | 51 | 52 | 53 | ... 54 | 55 | 56 | 57 | ... 58 | 59 | 60 | ... 61 | 62 | ... 63 | 64 | 65 | ... 66 | 67 | 68 | 69 | 70 | ``` 71 | 72 | #### JUnit 73 | Обратите внимание, что у артефакта нет `-api` на конце. Если у вас автоматически добавилась зависимость вида `junit-jupiter-api`, то лучше поменять артефакт на тот, что ниже, иначе будут сюрпризы в работе. 74 | 75 | ```xml 76 | 77 | org.junit.jupiter 78 | junit-jupiter 79 | 5.7.0 80 | test 81 | 82 | ``` 83 | 84 | #### Surefire 85 | Без этого плагина тесты могут Мавеном не запускаться, хоть в идее через кнопки они и будут проходить. Чтобы лишний раз убедиться, что всё работает, нажмите `Ctrl+Ctrl` и затем `mvn clean test`. 86 | 87 | ```xml 88 | 89 | org.apache.maven.plugins 90 | maven-surefire-plugin 91 | 2.22.2 92 | 93 | true 94 | 95 | 96 | ``` 97 | 98 | --- 99 | 100 |
101 | 102 |
103 | 3. Что делать, если возникли сложности 104 | 105 | Это здорово. Если их преодолевать правильно, то можно получить большую образовательную пользу для себя. Периодическое возникновение вопросов, недопонимание пройденного материала — нормальная и неотъемлемая часть обучения. А мы здесь, чтобы помочь вам пройти этот путь. 106 | 107 | ### Что делать, если непонятна теория 108 | 1. Если подобный вопрос разбирался на лекции, посмотрите ещё раз раздел с этой темой в видеозаписи. 109 | 1. Если вопрос не решился, попробуйте поискать ответ самостоятельно в интернете, этот навык пригодится вам в работе. 110 | 1. Если самостоятельно разобраться не удалось, задайте вопрос в общем чате, мы обязательно поможем. 111 | 112 | ### Что делать, если непонятно условие задания 113 | 1. Прежде чем задать вопрос по условию задачи, перечитайте его ещё раз и убедитесь, что в тексте условия нет прямого ответа на этот вопрос. Умение работать с текстом — важный навык работы с информацией. 114 | 1. Если ответа на свой вопрос в тексте условия не увидели, задайте его в общем чате, мы раскроем детали условия. 115 | 116 | ### Что делать, если не получается задача 117 | Если ваша проблема — это **ошибка компиляции** — подчёркивает красным, не даёт запустить программу, сборки проекта, CI и прочие подобные ошибки, то: 118 | 1. Найдите и прочитайте текст ошибки, который вам подсвечивает идея или логи. «Подчёркивает красным» — это не описание ошибки. 119 | 1. Попробуйте понять текст ошибки, при необходимости воспользуйтесь переводчиком. Не страшно, если вы переведёте неточно, тут главное — сам процесс: со временем и с нашей помощью вы будете это делать лучше и лучше, но, пропуская этот этап, вы не сможете научиться это делать. 120 | 1. Если не получилось понять ошибку по её тексту, попробуйте её загуглить и изучить подобную ошибку у других людей. Попробуйте примерить решения их проблем на свой код. Соотнесите найденные описания ошибки с пройденной теорией. 121 | 1. Если всё равно ваши трудности не разрешились, напишите в общий чат, обязательно указав: 122 | 1. название задачи и ссылку на условие; 123 | 1. ссылку на вашу работу; 124 | 1. текст и скриншот, не фотографию, ошибки; 125 | 1. ваши размышления и описание шагов, которые вы совершили для решения. 126 | 127 | Если ваша проблема — это **ошибка исполнения**, программа умирает уже после запуска, или она **отрабатывает неправильно**, из-за чего ваши тесты не проходят, то: 128 | 1. Воспользуйтесь отладчиком для пошагового анализа работы вашей программы. Так вы или убедитесь в неправильности придуманного вами алгоритма, или найдёте конкретное место, где ожидаемое поведение программы разошлось с фактическим. 129 | 1. Если проблему найти не получилось, напишите в общий чат, обязательно указав: 130 | 1. название задачи и ссылку на условие; 131 | 1. ссылку на вашу работу; 132 | 1. конкретное и подробное описание проблемы или затруднения при решении задачи. «Помогите, что-то не так» — это не описание; 133 | 1. подробное описание вашего анализа программы с помощью отладчика вместе со скринами; 134 | 1. ваши размышления и описание шагов, которые вы совершили для решения. 135 | --- 136 | 137 |
138 | 139 |
140 | 4. Отформатирован код 141 | 142 | Кроме правил, нарушение которых приводит к ошибкам компиляции, есть ещё и [правила форматирования кода](https://google.github.io/styleguide/javaguide.html), соблюдение которых обязательно при написании программ. 143 | 144 | С большинством проблем может справиться автоформатирование в идее. Для этого выберите `Code -> Reformat code` в меню или используйте горячие сочетания клавиш. В меню будет показано актуальное сочетание для вашей операционной системы. Так, идея поправит неправильные отступы, пробелы и некоторые другие ошибки. Следите, чтобы у `if-else`, `for`, `while` всегда были `{}`. 145 | 146 | Проблемы с именованием сущностей нужно решать самим. Так, все ячейки, кроме `final`-констант, и методы должны писаться [камелкейсом](https://ru.wikipedia.org/wiki/CamelCase) с **маленькой** буквы, а классы и интерфейсы — камелкейсом с **большой** буквы. 147 | 148 | Мы вам настоятельно советуем всегда держать код в отформатированном виде во время разработки, со временем глаз привыкнет, и вы почувствуете, насколько это облегчает поиск ошибок в коде и его анализ. В любом случае перед отправкой кода на проверку его обязательно нужно отформатировать, иначе он может быть отправлен на доработку без более глубокой проверки на этой итерации. 149 |
150 | 151 | 152 |
153 | 5. Настроен Github CI с verify-сборкой Maven и JaCoCo в режиме генерации отчётов с покрытием на 100% по бранчам методов с логикой 154 | 155 | #### CI 156 | После связывания локального репозитория с удалённым и первого пуша в заготовки проекта, время настроить CI на основе GitHub Actions. Шаблон вашего maven.yml должен выглядеть вот так, убедитесь, что всё совпадает с вашим шаблоном, например, что вы указали фазу `verify`, а не `package`: 157 | ```yml 158 | name: Java CI with Maven 159 | 160 | on: [push, pull_request] 161 | 162 | jobs: 163 | build: 164 | 165 | runs-on: ubuntu-latest 166 | 167 | steps: 168 | - uses: actions/checkout@v2 169 | - name: Set up JDK 11 170 | uses: actions/setup-java@v2 171 | with: 172 | java-version: '11' 173 | distribution: 'adopt' 174 | - name: Build with Maven 175 | run: mvn -B -e verify 176 | ``` 177 | 178 | #### JaCoCo 179 | 180 | ```xml 181 | 182 | org.jacoco 183 | jacoco-maven-plugin 184 | 0.8.5 185 | ... 186 | ``` 187 | 188 | Инициализация: 189 | ```xml 190 | 191 | prepare-agent 192 | 193 | prepare-agent 194 | 195 | 196 | ``` 197 | 198 | В режиме генерации отчётов: 199 | ```xml 200 | 201 | report 202 | verify 203 | 204 | report 205 | 206 | 207 | ``` 208 | 209 | В режиме проверки и обрушения сборки по уровню покрытия: 210 | ```xml 211 | 212 | check 213 | 214 | check 215 | 216 | 217 | 218 | 219 | 220 | 221 | LINE 222 | COVEREDRATIO 223 | 100% 224 | 225 | 226 | 227 | 228 | 229 | 230 | ``` 231 | 232 |
233 | 234 | # Задание 1. NotFoundException (обязательное к выполнению) 235 | 236 | Вы развиваете приложение с менеджером товаров, который мы рассматривали на лекции, и решили сделать так, чтобы при попытке удаления несуществующего объекта из репозитория генерировалось ваше исключение, а не `ArrayIndexOfBoundsException`. 237 | 238 | Обратите внимание: это правильный подход, поскольку таким образом вы сообщаете через генерацию исключения, что это исключение, вписывающееся в вашу логику, а не ошибка программиста. 239 | 240 | Что нужно сделать: 241 | 1. Возьмите проект с менеджером, репозиторием и товарами, мы его писали в рамках ДЗ про наследование. 242 | 1. Создайте класс исключения `NotFoundException`, отнаследовавшись от `RuntimeException`, и реализуйте как минимум конструктор с параметром-сообщением. Он будет просто вызывать суперконструктор предка, см. подсказку. 243 | 1. В методе удаления `removeById` сначала проверяйте, есть ли элемент. Для этого прямо из метода `removeById` вызывайте метод `findById`: если результат `null`, тогда выкидывайте исключение `NotFoundException`. 244 | 1. Напишите два автотеста на репозиторий: первый должен проверять успешность удаления существующего элемента, второй — генерации `NotFoundException` при попытке удаления несуществующего элемента. 245 | 246 |
247 | Подсказка 248 | Конструктор вашего исключения должен выглядеть как-то так: 249 | 250 | ```java 251 | public NotFoundException(String s) { 252 | super(s); 253 | } 254 | ``` 255 |
256 | 257 | Для реализации этой логики вам понадобится добавить метод `findById`, предназначенный для поиска товара в репозитории по его ID. Так, он должен принимать параметр `ID` искомого товара, пробегаться по всем товарам репозитория и сверять их `ID` с искомым, в случае совпадения делать `return` этого товара. Если же, пробежав все товары репозитория, ни один подходящий найден не был, то есть цикл закончился без вызова `return` внутри него, то следует сделать `return null`. Общая схема этого метода будет такой: 258 | ```java 259 | public Product findById(???) { 260 | for (???) { 261 | if (???) { 262 | return product; 263 | } 264 | } 265 | return null; 266 | } 267 | ``` 268 | 269 | Убедитесь, что ваши автотесты проходят. Напоминаем, что проект должен быть на базе Maven, с подключёнными зависимостями и необходимыми плагинами. 270 | 271 | Итого: у вас должен быть репозиторий на GitHub, в котором расположен ваш Java-код и автотесты к нему. 272 | 273 | Мы рекомендуем вам указывать в сообщении исключения: при удалении по какому конкретно ID было сгенерировано ваше исключение. 274 | Простейший способ, как это можно сделать: ```"Element with id: " + id + " not found"```. 275 | 276 | Итого: отправьте на проверку ссылку на репозиторий GitHub с вашим проектом. 277 | 278 | # Задание 2*. AlreadyExistsException (необязательная задача) 279 | 280 | В том же самом проекте и в той же самой ветке добавьте следующую новую функциональность. В методе добавления нового товара в репозиторий должна осуществляться проверка на то, что в нём уже нет товара, у которого бы совпадал `ID` с `ID` добавляемого товара. Если же такой есть, то должно выкидываться ваше исключение — 281 | `AlreadyExistsException`. 282 | 283 | Напишите два автотеста на репозиторий: первый должен проверять успешность добавления элемента, второй — генерации `AlreadyExistsException` при попытке добавить элемент с повторяющимся `ID`. 284 | 285 | ### Результат 286 | При отправке решения в личном кабинете прикрепите ссылку на ваш публичный репозиторий GitHub с проектом. 287 | -------------------------------------------------------------------------------- /GENERICS.md: -------------------------------------------------------------------------------- 1 | # Домашнее задание к занятию «Интерфейсы для организации малой связности. Обобщённое программирование (Generics)» 2 | 3 | ## Инструкция к выполнению домашнего задания 4 | 5 | Перед тем как отправить своё решение на проверку преподавателю, сверьтесь с чеклистом. 6 | 7 |
8 | 1. В решении выполнены все требования задания 9 | 10 | Убедитесь, что все требования задания выполнены. Для этого перед отправкой внимательно прочтите весь текст условия задания и соотнесите сказанное в нём с вашим решением. Навык самопроверки работы перед ревью пригодится вам как при обучении, так и на работе. 11 | 12 | --- 13 | 14 |
15 |
16 | 2. Правильно настроен Maven-проект, тесты проходят 17 | 18 | Репозиторий должен быть папкой вашего Мавен-проекта. Обратите внимание, что репозиторием не должна быть папка, в которой лежит папка Мавен-проекта, он сам должен быть папкой проекта. В нём должны быть соответствующие файлы и папки — `pom.xml`, `src` и другие. 19 | 20 | Не забудьте создать .gitignore-файл в корне проекта и добавить туда в игнорирование автогенерируемую папку `target`. 21 | 22 | Общая схема вашего `pom.xml`-файла: 23 | 24 | ```xml 25 | 26 | 29 | 4.0.0 30 | 31 | ru.netology 32 | НАЗВАНИЕ-ВАШЕГО-ПРОЕКТА-БЕЗ-ПРОБЕЛОВ 33 | 1.0-SNAPSHOT 34 | 35 | 36 | 11 37 | 11 38 | UTF-8 39 | 40 | 41 | 42 | 43 | 44 | ... 45 | 46 | ... 47 | 48 | 49 | 50 | 51 | 52 | 53 | ... 54 | 55 | 56 | 57 | ... 58 | 59 | 60 | ... 61 | 62 | ... 63 | 64 | 65 | ... 66 | 67 | 68 | 69 | 70 | ``` 71 | 72 | #### JUnit 73 | Обратите внимание, что у артефакта нет `-api` на конце. Если у вас автоматически добавилась зависимость вида `junit-jupiter-api`, то лучше поменять артефакт на тот, что ниже, иначе будут сюрпризы в работе. 74 | 75 | ```xml 76 | 77 | org.junit.jupiter 78 | junit-jupiter 79 | 5.7.0 80 | test 81 | 82 | ``` 83 | 84 | #### Surefire 85 | Без этого плагина тесты могут Мавеном не запускаться, хоть в идее через кнопки они и будут проходить. Чтобы лишний раз убедиться, что всё работает, нажмите `Ctrl+Ctrl` и затем `mvn clean test`. 86 | 87 | ```xml 88 | 89 | org.apache.maven.plugins 90 | maven-surefire-plugin 91 | 2.22.2 92 | 93 | true 94 | 95 | 96 | ``` 97 | 98 | --- 99 | 100 |
101 | 102 |
103 | 3. Что делать, если возникли сложности 104 | 105 | Это здорово. Если их преодолевать правильно, то можно получить большую образовательную пользу для себя. Периодическое возникновение вопросов, недопонимание пройденного материала — нормальная и неотъемлемая часть обучения. А мы здесь, чтобы помочь вам пройти этот путь. 106 | 107 | ### Что делать, если непонятна теория 108 | 1. Если подобный вопрос разбирался на лекции, посмотрите ещё раз раздел с этой темой в видеозаписи. 109 | 1. Если вопрос не решился, попробуйте поискать ответ самостоятельно в интернете, этот навык пригодится вам в работе. 110 | 1. Если самостоятельно разобраться не удалось, задайте вопрос в общем чате, мы обязательно поможем. 111 | 112 | ### Что делать, если непонятно условие задания 113 | 1. Прежде чем задать вопрос по условию задачи, перечитайте его ещё раз и убедитесь, что в тексте условия нет прямого ответа на этот вопрос. Умение работать с текстом — важный навык работы с информацией. 114 | 1. Если ответа на свой вопрос в тексте условия не увидели, задайте его в общем чате, мы раскроем детали условия. 115 | 116 | ### Что делать, если не получается задача 117 | Если ваша проблема — это **ошибка компиляции** — подчёркивает красным, не даёт запустить программу, сборки проекта, CI и прочие подобные ошибки, то: 118 | 1. Найдите и прочитайте текст ошибки, который вам подсвечивает идея или логи. «Подчёркивает красным» — это не описание ошибки. 119 | 1. Попробуйте понять текст ошибки, при необходимости воспользуйтесь переводчиком. Не страшно, если вы переведёте неточно, тут главное — сам процесс: со временем и с нашей помощью вы будете это делать лучше и лучше, но, пропуская этот этап, вы не сможете научиться это делать. 120 | 1. Если не получилось понять ошибку по её тексту, попробуйте её загуглить и изучить подобную ошибку у других людей. Попробуйте примерить решения их проблем на свой код. Соотнесите найденные описания ошибки с пройденной теорией. 121 | 1. Если всё равно ваши трудности не разрешились, напишите в общий чат, обязательно указав: 122 | 1. название задачи и ссылку на условие; 123 | 1. ссылку на вашу работу; 124 | 1. текст и скриншот, не фотографию, ошибки; 125 | 1. ваши размышления и описание шагов, которые вы совершили для решения. 126 | 127 | Если ваша проблема — это **ошибка исполнения**, программа умирает уже после запуска, или она **отрабатывает неправильно**, из-за чего ваши тесты не проходят, то: 128 | 1. Воспользуйтесь отладчиком для пошагового анализа работы вашей программы. Так вы или убедитесь в неправильности придуманного вами алгоритма, или найдёте конкретное место, где ожидаемое поведение программы разошлось с фактическим. 129 | 1. Если проблему найти не получилось, напишите в общий чат, обязательно указав: 130 | 1. название задачи и ссылку на условие; 131 | 1. ссылку на вашу работу; 132 | 1. конкретное и подробное описание проблемы или затруднения при решении задачи. «Помогите, что-то не так» — это не описание; 133 | 1. подробное описание вашего анализа программы с помощью отладчика вместе со скринами; 134 | 1. ваши размышления и описание шагов, которые вы совершили для решения. 135 | --- 136 | 137 |
138 | 139 |
140 | 4. Отформатирован код 141 | 142 | Кроме правил, нарушение которых приводит к ошибкам компиляции, есть ещё и [правила форматирования кода](https://google.github.io/styleguide/javaguide.html), соблюдение которых обязательно при написании программ. 143 | 144 | С большинством проблем может справиться автоформатирование в идее. Для этого выберите `Code -> Reformat code` в меню или используйте горячие сочетания клавиш. В меню будет показано актуальное сочетание для вашей операционной системы. Так, идея поправит неправильные отступы, пробелы и некоторые другие ошибки. Следите, чтобы у `if-else`, `for`, `while` всегда были `{}`. 145 | 146 | Проблемы с именованием сущностей нужно решать самим. Так, все ячейки, кроме `final`-констант, и методы должны писаться [камелкейсом](https://ru.wikipedia.org/wiki/CamelCase) с **маленькой** буквы, а классы и интерфейсы — камелкейсом с **большой** буквы. 147 | 148 | Мы вам настоятельно советуем всегда держать код в отформатированном виде во время разработки, со временем глаз привыкнет, и вы почувствуете, насколько это облегчает поиск ошибок в коде и его анализ. В любом случае перед отправкой кода на проверку его обязательно нужно отформатировать, иначе он может быть отправлен на доработку без более глубокой проверки на этой итерации. 149 |
150 | 151 |
152 | 5. Настроен Github CI с verify-сборкой Maven и JaCoCo в режиме генерации отчётов с покрытием на 100% по бранчам методов с логикой [:warning:: в этом задании можно не покрывать на 100%] 153 | 154 | #### CI 155 | После связывания локального репозитория с удалённым и первого пуша в заготовки проекта, время настроить CI на основе GitHub Actions. Шаблон вашего maven.yml должен выглядеть вот так, убедитесь, что всё совпадает с вашим шаблоном, например, что вы указали фазу `verify`, а не `package`: 156 | ```yml 157 | name: Java CI with Maven 158 | 159 | on: [push, pull_request] 160 | 161 | jobs: 162 | build: 163 | 164 | runs-on: ubuntu-latest 165 | 166 | steps: 167 | - uses: actions/checkout@v2 168 | - name: Set up JDK 11 169 | uses: actions/setup-java@v2 170 | with: 171 | java-version: '11' 172 | distribution: 'adopt' 173 | - name: Build with Maven 174 | run: mvn -B -e verify 175 | ``` 176 | 177 | #### JaCoCo 178 | 179 | ```xml 180 | 181 | org.jacoco 182 | jacoco-maven-plugin 183 | 0.8.5 184 | ... 185 | ``` 186 | 187 | Инициализация: 188 | ```xml 189 | 190 | prepare-agent 191 | 192 | prepare-agent 193 | 194 | 195 | ``` 196 | 197 | В режиме генерации отчётов: 198 | ```xml 199 | 200 | report 201 | verify 202 | 203 | report 204 | 205 | 206 | ``` 207 | 208 | В режиме проверки и обрушения сборки по уровню покрытия: 209 | ```xml 210 | 211 | check 212 | 213 | check 214 | 215 | 216 | 217 | 218 | 219 | 220 | LINE 221 | COVEREDRATIO 222 | 100% 223 | 224 | 225 | 226 | 227 | 228 | 229 | ``` 230 | 231 |
232 | 233 | 234 | # Задание 1. Поиск билетов (обязательное к выполнению) 235 | 236 | Вы работаете в сервисе по продаже авиабилетов онлайн. 237 | 238 | ![image](https://user-images.githubusercontent.com/53707586/154491051-0bc17b53-cf07-4502-80c0-6379e1a89b92.png) 239 | 240 | Что вам нужно сделать: 241 | 1. Спроектируйте класс для информации о билете. 242 | 1. Реализуйте репозиторий для хранения информации о билетах: добавить, удалить, получить набор билетов. 243 | 1. Реализуйте менеджера поиска по аэропорту вылета и аэропорту прилёта, даты не учитывайте. 244 | 245 | #### Информация о билете 246 | 247 | Класс информации о билете — это data-класс, который должен содержать: 248 | 1. ID. 249 | 1. Стоимость, для упрощения будем считать стоимость единой для всех продавцов. 250 | 1. Аэропорт вылета, вы можете использовать [IATA-коды](https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%B4_%D0%B0%D1%8D%D1%80%D0%BE%D0%BF%D0%BE%D1%80%D1%82%D0%B0_%D0%98%D0%90%D0%A2%D0%90). 251 | 1. Аэропорт прилёта, вы можете использовать [IATA-коды](https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%B4_%D0%B0%D1%8D%D1%80%D0%BE%D0%BF%D0%BE%D1%80%D1%82%D0%B0_%D0%98%D0%90%D0%A2%D0%90). 252 | 1. Время в пути в минутах. 253 | 254 | Других данных не нужно. 255 | 256 | Этот класс должен реализовывать интерфейс `Comparable<...>` так, чтобы по умолчанию сортировка происходила по цене, самый дешёвый — самый первый. Для этого шапка вашего дата-класса должна выглядеть как-то так: 257 | ```java 258 | public class Ticket implements Comparable { 259 | ``` 260 | 261 | После чего идея подсветит вам её красным, нажмите на подсказку и выберите «Implement methods» — «Реализовать методы». Идея сама сгенерирует заглушку для нужного метода из этого интерфейса, которая всегда возвращает `0`. Вам надо переписать тело сгенерированного метода, чтобы если билет, у которого вызвали метод `compareTo`, стоит дешевле, чем тот, который передали через параметр, то возвращалось бы число меньше нуля. Если же билет, наоборот, дороже, то число больше нуля, а если стоимость одинакова, то `0`. Дав верную реализацию этому методу, вы научите Java сравнивать объекты этого класса. 262 | 263 | #### Репозиторий 264 | 265 | Репозиторий для хранения билетов ничем не отличается от тех репозиториев, что мы проходили раньше. 266 | 267 | ### Менеджер 268 | 269 | В менеджере методов `findAll` должен претерпеть некоторые изменения — он должен принимать два параметра: 270 | * `from` — аэропорта вылета, 271 | * `to` — аэропорт прилёта. 272 | 273 | Значит, в результате поиска возвращается массив только с теми билетами, что соответствуют условиям поиска. Методы поиска вы уже делать умеете. 274 | 275 | Кроме того, результаты должны быть отсортированы по цене от меньшей к большей. 276 | 277 | ### Автотесты 278 | 279 | Напишите автотесты на поиск, удостоверившись, что он удовлетворяет условиям задачи. Количество тестов и тестируемые сценарии мы оставляем на ваше усмотрение. 280 | 281 | Итого: у вас должен быть репозиторий на GitHub, в котором расположен ваш Java-код и автотесты к нему, GitHub Actions и т. д. — всё как обычно. 282 | 283 | Отправьте на проверку ссылку на репозиторий GitHub с вашим проектом. 284 | 285 | # Задание 2*. Самый быстрый (необязательная задача) 286 | 287 | Иногда необходима сортировка не только по цене, но и, например, по времени — люди хотят найти самый быстрый перелёт. 288 | 289 | Естественно, ваш сервис идёт навстречу пожеланиям клиентов и решает добавить такую возможность. 290 | 291 | Но как мы это сделаем, ведь наши билеты уже сортируются по цене. 292 | 293 | ### `Comparator` 294 | 295 | Помимо интерфейса `Comparable`, который определяет порядок сортировки объектов данного класса по умолчанию, у нас есть интерфейс `Comparator`, который позволяет создавать объекты, определяющие порядок сортировки других объектов. 296 | 297 | Как это выглядит, мы покажем на примере сортировки по цене по возрастанию — аналог, который реализован вами в первой задаче: 298 | 299 | ```java 300 | public class TicketByPriceAscComparator implements Comparator { 301 | public int compare(Ticket o1, Ticket o2) { 302 | return o1.getPrice() - o2.getPrice(); 303 | } 304 | } 305 | ``` 306 | 307 | Обратите внимание: это отдельный специальный класс, который умеет сравнивать два объекта типа «Билет». 308 | 309 | Логика интерпретации возвращаемого из метода `compare` значения аналогична логике `compareTo`. 310 | 311 | В отдельной ветке `fast` того же репозитория улучшите сервис, создав метод `findAll(String from, String to, Comparator comparator)`. 312 | 313 | Этот метод делает всё то же самое, что и обычный `findAll` из первой задачи, но сортирует не методом `Arrays.sort(result)`, а `Arrays.sort(result, comparator)`. 314 | 315 | Таким образом, вы сможете передавать в этот метод объект любого класса, реализующего интерфейс `Comparator`. 316 | 317 | Итого: у вас должен быть репозиторий на GitHub, в котором в отдельной ветке расположен ваш компаратор, сервис с новыми методами и автотесты к сервису. 318 | 319 | Если автотесты в ветке проходят — делаете Pull Request на слияние в основную ветку. Сливать не нужно. 320 | 321 | ### Результат 322 | При отправке решения в личном кабинете прикрепите ссылку на ваш публичный репозиторий GitHub с вашим проектом. 323 | -------------------------------------------------------------------------------- /INH.md: -------------------------------------------------------------------------------- 1 | # Домашнее задание к занятию «Наследование и расширяемость систем. Проблемы наследования» 2 | 3 | ## Инструкция к выполнению домашнего задания 4 | 5 | Перед тем как отправить своё решение на проверку преподавателю, сверьтесь с чеклистом. 6 | 7 |
8 | 1. В решении выполнены все требования задания 9 | 10 | Убедитесь, что все требования задания выполнены. Для этого перед отправкой внимательно прочтите весь текст условия задания и соотнесите сказанное в нём с вашим решением. Навык самопроверки работы перед ревью пригодится вам как при обучении, так и на работе. 11 | 12 | --- 13 | 14 |
15 |
16 | 2. Правильно настроен Maven-проект, тесты проходят 17 | 18 | Репозиторий должен быть папкой вашего Мавен-проекта. Обратите внимание, что репозиторием не должна быть папка, в которой лежит папка Мавен-проекта, он сам должен быть папкой проекта. В нём должны быть соответствующие файлы и папки — `pom.xml`, `src` и другие. 19 | 20 | Не забудьте создать .gitignore-файл в корне проекта и добавить туда в игнорирование автогенерируемую папку `target`. 21 | 22 | Общая схема вашего `pom.xml`-файла: 23 | 24 | ```xml 25 | 26 | 29 | 4.0.0 30 | 31 | ru.netology 32 | НАЗВАНИЕ-ВАШЕГО-ПРОЕКТА-БЕЗ-ПРОБЕЛОВ 33 | 1.0-SNAPSHOT 34 | 35 | 36 | 11 37 | 11 38 | UTF-8 39 | 40 | 41 | 42 | 43 | 44 | ... 45 | 46 | ... 47 | 48 | 49 | 50 | 51 | 52 | 53 | ... 54 | 55 | 56 | 57 | ... 58 | 59 | 60 | ... 61 | 62 | ... 63 | 64 | 65 | ... 66 | 67 | 68 | 69 | 70 | ``` 71 | 72 | #### JUnit 73 | Обратите внимание, что у артефакта нет `-api` на конце. Если у вас автоматически добавилась зависимость вида `junit-jupiter-api`, то лучше поменять артефакт на тот, что ниже, иначе будут сюрпризы в работе. 74 | 75 | ```xml 76 | 77 | org.junit.jupiter 78 | junit-jupiter 79 | 5.7.0 80 | test 81 | 82 | ``` 83 | 84 | #### Surefire 85 | Без этого плагина тесты могут Мавеном не запускаться, хоть в идее через кнопки они и будут проходить. Чтобы лишний раз убедиться, что всё работает, нажмите `Ctrl+Ctrl` и затем `mvn clean test`. 86 | 87 | ```xml 88 | 89 | org.apache.maven.plugins 90 | maven-surefire-plugin 91 | 2.22.2 92 | 93 | true 94 | 95 | 96 | ``` 97 | 98 | --- 99 | 100 |
101 | 102 |
103 | 3. Что делать, если возникли сложности 104 | 105 | Это здорово. Если их преодолевать правильно, то можно получить большую образовательную пользу для себя. Периодическое возникновение вопросов, недопонимание пройденного материала — нормальная и неотъемлемая часть обучения. А мы здесь, чтобы помочь вам пройти этот путь. 106 | 107 | ### Что делать, если непонятна теория 108 | 1. Если подобный вопрос разбирался на лекции, посмотрите ещё раз раздел с этой темой в видеозаписи. 109 | 1. Если вопрос не решился, попробуйте поискать ответ самостоятельно в интернете, этот навык пригодится вам в работе. 110 | 1. Если самостоятельно разобраться не удалось, задайте вопрос в общем чате, мы обязательно поможем. 111 | 112 | ### Что делать, если непонятно условие задания 113 | 1. Прежде чем задать вопрос по условию задачи, перечитайте его ещё раз и убедитесь, что в тексте условия нет прямого ответа на этот вопрос. Умение работать с текстом — важный навык работы с информацией. 114 | 1. Если ответа на свой вопрос в тексте условия не увидели, задайте его в общем чате, мы раскроем детали условия. 115 | 116 | ### Что делать, если не получается задача 117 | Если ваша проблема — это **ошибка компиляции** — подчёркивает красным, не даёт запустить программу, сборки проекта, CI и прочие подобные ошибки, то: 118 | 1. Найдите и прочитайте текст ошибки, который вам подсвечивает идея или логи. «Подчёркивает красным» — это не описание ошибки. 119 | 1. Попробуйте понять текст ошибки, при необходимости воспользуйтесь переводчиком. Не страшно, если вы переведёте неточно, тут главное — сам процесс: со временем и с нашей помощью вы будете это делать лучше и лучше, но, пропуская этот этап, вы не сможете научиться это делать. 120 | 1. Если не получилось понять ошибку по её тексту, попробуйте её загуглить и изучить подобную ошибку у других людей. Попробуйте примерить решения их проблем на свой код. Соотнесите найденные описания ошибки с пройденной теорией. 121 | 1. Если всё равно ваши трудности не разрешились, напишите в общий чат, обязательно указав: 122 | 1. название задачи и ссылку на условие; 123 | 1. ссылку на вашу работу; 124 | 1. текст и скриншот, не фотографию, ошибки; 125 | 1. ваши размышления и описание шагов, которые вы совершили для решения. 126 | 127 | Если ваша проблема — это **ошибка исполнения**, программа умирает уже после запуска, или она **отрабатывает неправильно**, из-за чего ваши тесты не проходят, то: 128 | 1. Воспользуйтесь отладчиком для пошагового анализа работы вашей программы. Так вы или убедитесь в неправильности придуманного вами алгоритма, или найдёте конкретное место, где ожидаемое поведение программы разошлось с фактическим. 129 | 1. Если проблему найти не получилось, напишите в общий чат, обязательно указав: 130 | 1. название задачи и ссылку на условие; 131 | 1. ссылку на вашу работу; 132 | 1. конкретное и подробное описание проблемы или затруднения при решении задачи. «Помогите, что-то не так» — это не описание; 133 | 1. подробное описание вашего анализа программы с помощью отладчика вместе со скринами; 134 | 1. ваши размышления и описание шагов, которые вы совершили для решения. 135 | --- 136 | 137 |
138 | 139 |
140 | 4. Отформатирован код 141 | 142 | Кроме правил, нарушение которых приводит к ошибкам компиляции, есть ещё и [правила форматирования кода](https://google.github.io/styleguide/javaguide.html), соблюдение которых обязательно при написании программ. 143 | 144 | С большинством проблем может справиться автоформатирование в идее. Для этого выберите `Code -> Reformat code` в меню или используйте горячие сочетания клавиш. В меню будет показано актуальное сочетание для вашей операционной системы. Так, идея поправит неправильные отступы, пробелы и некоторые другие ошибки. Следите, чтобы у `if-else`, `for`, `while` всегда были `{}`. 145 | 146 | Проблемы с именованием сущностей нужно решать самим. Так, все ячейки, кроме `final`-констант, и методы должны писаться [камелкейсом](https://ru.wikipedia.org/wiki/CamelCase) с **маленькой** буквы, а классы и интерфейсы — камелкейсом с **большой** буквы. 147 | 148 | Мы вам настоятельно советуем всегда держать код в отформатированном виде во время разработки, со временем глаз привыкнет, и вы почувствуете, насколько это облегчает поиск ошибок в коде и его анализ. В любом случае перед отправкой кода на проверку его обязательно нужно отформатировать, иначе он может быть отправлен на доработку без более глубокой проверки на этой итерации. 149 |
150 | 151 | 152 |
153 | 5. Настроен Github CI с verify-сборкой Maven и JaCoCo в режиме генерации отчётов с покрытием на 100% по бранчам методов с логикой 154 | 155 | #### CI 156 | После связывания локального репозитория с удалённым и первого пуша в заготовки проекта, время настроить CI на основе GitHub Actions. Шаблон вашего maven.yml должен выглядеть вот так, убедитесь, что всё совпадает с вашим шаблоном, например, что вы указали фазу `verify`, а не `package`: 157 | ```yml 158 | name: Java CI with Maven 159 | 160 | on: [push, pull_request] 161 | 162 | jobs: 163 | build: 164 | 165 | runs-on: ubuntu-latest 166 | 167 | steps: 168 | - uses: actions/checkout@v2 169 | - name: Set up JDK 11 170 | uses: actions/setup-java@v2 171 | with: 172 | java-version: '11' 173 | distribution: 'adopt' 174 | - name: Build with Maven 175 | run: mvn -B -e verify 176 | ``` 177 | 178 | #### JaCoCo 179 | 180 | ```xml 181 | 182 | org.jacoco 183 | jacoco-maven-plugin 184 | 0.8.5 185 | ... 186 | ``` 187 | 188 | Инициализация: 189 | ```xml 190 | 191 | prepare-agent 192 | 193 | prepare-agent 194 | 195 | 196 | ``` 197 | 198 | В режиме генерации отчётов: 199 | ```xml 200 | 201 | report 202 | verify 203 | 204 | report 205 | 206 | 207 | ``` 208 | 209 | В режиме проверки и обрушения сборки по уровню покрытия: 210 | ```xml 211 | 212 | check 213 | 214 | check 215 | 216 | 217 | 218 | 219 | 220 | 221 | LINE 222 | COVEREDRATIO 223 | 100% 224 | 225 | 226 | 227 | 228 | 229 | 230 | ``` 231 | 232 |
233 | 234 | 235 | # Задание 1. Менеджер товаров (обязательное к выполнению) 236 | 237 | Вам необходимо реализовать менеджер товаров, который умеет: 238 | 239 | * добавлять товары в репозиторий, 240 | * искать товары. 241 | 242 | Что нужно сделать: 243 | 1. Разработайте базовый класс `Product`, содержащий `ID`, название, стоимость. 244 | 1. Разработайте два унаследованных от `Product` класса: `Book` с текстовыми полями «название» и «автор» и `Smartphone` с текстовыми полями «название» и «производитель»; общие поля вынесите в родителя. 245 | 1. Разработайте репозиторий, позволяющий сохранять `Product`, получать все сохранённые `Product` и удалять по `ID`. Для этого репозиторий будет хранить у себя поле с типом `Product[]` (массив товаров). 246 | 1. Разработайте менеджера, который умеет добавлять `Product` в репозиторий и осуществлять поиск по ним. Для этого вам нужно создать класс, конструктор которого будет принимать параметром репозиторий, а также с методом `publiс void add(Product product)` и методом поиска (см. ниже). 247 | 248 | #### Как осуществлять поиск 249 | 250 | У менеджера должен быть метод `searchBy(String text)`, который возвращает массив найденных товаров. 251 | 252 | ```java 253 | public class ProductManager { 254 | // добавьте необходимые поля, конструкторы и методы 255 | 256 | public Product[] searchBy(String text) { 257 | Product[] result = new Product[0]; // тут будем хранить подошедшие запросу продукты 258 | for (Product product: repository.findAll()) { 259 | if (matches(product, text)) { 260 | // "добавляем в конец" массива result продукт product 261 | } 262 | } 263 | return result; 264 | } 265 | 266 | // метод определения соответствия товара product запросу search 267 | public boolean matches(Product product, String search) { 268 | if (product.getName().contains(search)) { 269 | return true; 270 | } else { 271 | return false; 272 | } 273 | // или в одну строку: 274 | // return product.getName().contains(search); 275 | } 276 | } 277 | ``` 278 | 279 | Менеджер при переборе всех продуктов, хранящихся в репозитории, должен для каждого продукта вызывать определённый в классе менеджера же метод `matches`, который проверяет, соответствует ли продукт поисковому запросу. 280 | 281 | При проверке на соответствие запросу товара мы проверяем вхождение запроса в текст названия товара. 282 | 283 | Напишите тесты на менеджер и репозиторий, добившись 100% покрытия по бранчам методов с логикой. 284 | 285 | Итого: отправьте на проверку ссылку на репозиторий GitHub с вашим проектом. 286 | 287 | # Задание 2*. Менеджер товаров: rich model (необязательная задача) 288 | 289 | Достаточно часто объекты, моделирующие предметную область, называют моделями. Часто модели делают глупыми, то есть не содержащими никакой логики. 290 | 291 | Но есть и другой подход, который позволяет делать умные или богатые модели (rich model), которые могут уже содержать определённую логику. 292 | 293 | Что нужно сделать: 294 | 1. Создайте в том же, что и первое задание, репозитории новую ветку `rich` на базе ветки первого задания. 295 | 1. Реализуйте в классе `Product` метод `public boolean matches(String search)`, который определяет, подходит ли продукт поисковому запросу исходя из названия. 296 | 1. Переопределите этот метод в дочерних классах, чтобы они сначала вызывали родительский метод, и только если родительский метод вернул `false`, тогда проводили дополнительные проверки: `Book` — по автору, `Smartphone` — по производителю. 297 | 1. Замените в менеджере вызов метода `matches` из класса самого менеджера на вызов метода `matches` у самих продуктов: `if (product.matches(search)) {`. 298 | 1. Теперь вам нужны unit-тесты на методы ваших умных моделей, напишите их. 299 | 1. Удостоверьтесь, что ранее написанные тесты на менеджера из решения задачи 1 проходят. 300 | 1. Добейтесь 100% покрытия по бранчам методов с логикой. 301 | 302 | Заготовка для метода `matches` у класса `Book`: 303 | ```java 304 | public class Book extends Product { 305 | // ваши поля, конструкторы, методы 306 | public boolean matches(String search) { 307 | if (super.matches(search)) { // вызов метода matches в версии описанной в Product 308 | return true; 309 | } 310 | if ...; 311 | } 312 | } 313 | ``` 314 | ### Результат 315 | При отправке решения в личном кабинете прикрепите ссылку на Pull Request ветки `rich` с вашим проектом. 316 | -------------------------------------------------------------------------------- /JAVA_INTRO.md: -------------------------------------------------------------------------------- 1 | # Домашнее задание к занятию «Введение в Java» 2 | 3 | ## Инструкция к выполнению домашнего задания 4 | 5 | Перед тем как отправить своё решение на проверку преподавателю, сверьтесь с чеклистом. 6 | 7 |
8 | 1. В решении выполнены все требования задания :new: 9 | 10 | Убедитесь, что все требования задания выполнены. Для этого перед отправкой внимательно прочтите весь текст условия задания и соотнесите сказанное в нём с вашим решением. Навык самопроверки работы перед ревью пригодится вам как при обучении, так и на работе. 11 | 12 | --- 13 | 14 |
15 | 16 |
17 | 2. Проект и репозиторий настроены правильно :new: 18 | 19 | Репозиторий должен быть папкой вашего idea-проекта. Обратите внимание, что репозиторием не должна быть папка, в которой лежит папка проекта, он сам должен быть папкой проекта. В нём должны быть соответствующие файлы и папки — `src` и другие. 20 | 21 | Не забудьте создать .gitignore-файл в корне проекта и добавить туда в игнорирование автогенерируемую папку `out` и папку настроек идеи `.idea`. 22 | 23 | --- 24 |
25 | 26 |
27 | 3. Что делать, если возникли сложности :new: 28 | 29 | Это здорово. Если их преодолевать правильно, то можно получить большую образовательную пользу для себя. Периодическое возникновение вопросов, недопонимание пройденного материала — нормальная и неотъемлемая часть обучения. А мы здесь, чтобы помочь вам пройти этот путь. 30 | 31 | ### Что делать, если непонятна теория 32 | 1. Если подобный вопрос разбирался на лекции, посмотрите ещё раз раздел с этой темой в видеозаписи. 33 | 1. Если вопрос не решился, попробуйте поискать ответ самостоятельно в интернете, этот навык пригодится вам в работе. 34 | 1. Если самостоятельно разобраться не удалось, задайте вопрос в общем чате, мы обязательно поможем. 35 | 36 | ### Что делать, если непонятно условие задания 37 | 1. Прежде чем задать вопрос по условию задачи, перечитайте его ещё раз и убедитесь, что в тексте условия нет прямого ответа на этот вопрос. Умение работать с текстом — важный навык работы с информацией. 38 | 1. Если ответа на свой вопрос в тексте условия не увидели, задайте его в общем чате, мы раскроем детали условия. 39 | 40 | ### Что делать, если не получается задача 41 | Если ваша проблема — это **ошибка компиляции** — подчёркивает красным, не даёт запустить программу сборки проекта, CI и прочие подобные ошибки, то: 42 | 1. Найдите и прочитайте текст ошибки, который вам подсвечивает идея или логи. «Подчёркивает красным» — это не описание ошибки. 43 | 1. Попробуйте понять текст ошибки, при необходимости воспользуйтесь переводчиком. Не страшно, если вы переведёте неточно, тут главное — сам процесс: со временем и с нашей помощью вы будете это делать лучше и лучше, но, пропуская этот этап, вы не сможете научиться это делать. 44 | 1. Если не получилось понять ошибку по её тексту, попробуйте её загуглить и изучить подобную ошибку у других людей. Попробуйте примерить решения их проблем на свой код. Соотнесите найденные описания ошибки с пройденной теорией. 45 | 1. Если всё равно ваши трудности не разрешились, напишите в общий чат, обязательно указав: 46 | 1. название задачи и ссылку на условие; 47 | 1. ссылку на вашу работу; 48 | 1. текст и скриншот, не фотографию, ошибки; 49 | 1. ваши размышления и описание шагов, которые вы совершили для решения. 50 | 51 | Если ваша проблема — это **ошибка исполнения**, программа умирает уже после запуска, или она **отрабатывает неправильно**, из-за чего ваши тесты не проходят, то: 52 | 1. Воспользуйтесь отладчиком для пошагового анализа работы вашей программы. Так вы или убедитесь в неправильности придуманного вами алгоритма, или найдёте конкретное место, где ожидаемое поведение программы разошлось с фактическим. 53 | 1. Если проблему найти не получилось, напишите в общий чат, обязательно указав: 54 | 1. название задачи и ссылку на условие; 55 | 1. ссылку на вашу работу; 56 | 1. конкретное и подробное описание проблемы или затруднения при решении задачи. «Помогите, что-то не так» — это не описание; 57 | 1. подробное описание вашего анализа программы с помощью отладчика вместе со скринами; 58 | 1. ваши размышления и описание шагов, которые вы совершили для решения. 59 | --- 60 | 61 |
62 | 63 | ## Задание. Рецепт 64 | 65 | Ваша задача — проанализировать программу расчёта распределения ингредиентов на порцию. Программе на вход даётся рецепт со всеми граммовками каждого ингредиента, а также количество человек, которые будут в одинаковых порциях его есть. На выходе программа указывает без округлений, какое точное количество каждого ингредиента пришлось на одну порцию еды. 66 | 67 | ```java 68 | public class Main { 69 | public static void main(String[] args) { 70 | 71 | int eaters = 5; // сколько людей будут есть 72 | 73 | int water = 3000; // миллилитров воды 74 | int potatoes = 5; // картофелин 75 | int chicken = 6; // куриных бёдер 76 | int spices = 10; // ложек специй 77 | 78 | System.out.println("Сварили суп. На одного человека вышло:"); 79 | System.out.println((water / eaters) + " миллилитров воды"); 80 | System.out.println((potatoes / eaters) + " картофелин(а)"); 81 | System.out.println((chicken / eaters) + " куриных(ое) бёдер(ро)"); 82 | System.out.println((spices / eaters) + " ложек(ка) специй"); 83 | 84 | } 85 | } 86 | ``` 87 | 88 | Для анализа этой программы 89 | 90 | 1. Установите бесплатную версию идеи (**Community version**) с [официальной страницы](https://www.jetbrains.com/idea/download). 91 | 2. Создайте новый проект на основе **Java 11**, идея может скачать её сама, если вы в меню выбора Java выберите `Download JDK`. Обратите внимание, что в левой части меню следует выбирать `New Project`, а не что-либо другое. 92 | 93 | image 94 | 95 | 4. Создайте класс `Main` с содержимым из кода выше. 96 | 5. Нажмите на кнопку запуска программы. Она должна запуститься, вывести информацию на экран и завершиться. 97 | 6. Закоммитьте и запушьте ваш проект в публичный репозиторий на GitHub. 98 | 7. Проанализируйте код и вывод программы. Найдите в них дефекты. Менять код программы не нужно. 99 | 8. Оформите баг-репорт с помощью GitHub Issues, описывающий найденный дефект по шаблону из примера ниже. 100 | 101 | ### Формат оформления баг-репорта 102 | Наша цель — получить такой баг-репорт: 103 | 104 | ![image](https://user-images.githubusercontent.com/53707586/161832746-1c6c42d0-4d64-4d1d-9b05-47b80a3f4a25.png) 105 | 106 | Это можно сделать, написав следующее: 107 | 108 | ![image](https://user-images.githubusercontent.com/53707586/145558346-22631529-597a-4332-951f-ec1cf550c701.png) 109 | 110 | Комментарии к формату: 111 | * И в .md-файлах, и внутри описания баг-репортов используется [формат Markdown](https://www.markdownguide.org/basic-syntax/). 112 | * Исходный код Issue специально вставлен картинкой, чтобы вы вчитывались и перепечатывали, а не копировали. 113 | * Чтобы красиво сослаться на нужное место в коде на GitHub (в нашем случае для отображения локации), откройте этот файл на GitHub, нажмите на номер или номера соответствующей строки, удерживая `Shift`, и рядом слева нажмите на троеточие, в выпавшем меню нажмите `Copy permalink`. В буфер обмена скопируется прямая ссылка на эту строку этого коммита. Теперь вы её можете просто вставить в текст Issue как в шаблоне: 114 | 115 | ![image](https://user-images.githubusercontent.com/53707586/145559373-0173b0af-f0dc-455e-ac0a-f7b6da85ae8a.png) 116 | 117 | * Для загрузки изображений вы можете воспользоваться кнопкой, находящейся сразу под полем редактирования текста. Также возможна автозагрузка скриншотов прямо из буфера обмена через `Ctrl+V` с автовставкой в место нахождения курсора: 118 | 119 | ![image](https://user-images.githubusercontent.com/53707586/145559790-cf4b1254-ceb8-4931-92dd-031575450583.png) 120 | 121 | ### Результат 122 | При отправке решения в личном кабинете прикрепите ссылку на ваш публичный репозиторий GitHub. 123 | -------------------------------------------------------------------------------- /MAVEN.md: -------------------------------------------------------------------------------- 1 | # Домашнее задание к занятию «Система сборки Maven, управление зависимостями, автотесты на JUnit5» 2 | 3 | ## Инструкция к выполнению домашнего задания 4 | 5 | Перед тем как отправить своё решение на проверку преподавателю, сверьтесь с чеклистом. 6 | 7 |
8 | 1. В решении выполнены все требования задания 9 | 10 | Убедитесь, что все требования задания выполнены. Для этого перед отправкой внимательно прочтите весь текст условия задания и соотнесите сказанное в нём с вашим решением. Навык самопроверки работы перед ревью пригодится вам как при обучении, так и на работе. 11 | 12 | --- 13 | 14 |
15 |
16 | 2. Правильно настроен Maven-проект, тесты проходят :new: 17 | 18 | Репозиторий должен быть папкой вашего Мавен-проекта. Обратите внимание, что репозиторием не должна быть папка, в которой лежит папка Мавен-проекта, он сам должен быть папкой проекта. В нём должны быть соответствующие файлы и папки — `pom.xml`, `src` и другие. 19 | 20 | Не забудьте создать .gitignore-файл в корне проекта и добавить туда в игнорирование автогенерируемую папку `target`. 21 | 22 | Общая схема вашего `pom.xml`-файла: 23 | 24 | ```xml 25 | 26 | 29 | 4.0.0 30 | 31 | ru.netology 32 | НАЗВАНИЕ-ВАШЕГО-ПРОЕКТА-БЕЗ-ПРОБЕЛОВ 33 | 1.0-SNAPSHOT 34 | 35 | 36 | 11 37 | 11 38 | UTF-8 39 | 40 | 41 | 42 | 43 | 44 | ... 45 | 46 | ... 47 | 48 | 49 | 50 | 51 | 52 | 53 | ... 54 | 55 | 56 | 57 | ... 58 | 59 | 60 | ... 61 | 62 | ... 63 | 64 | 65 | ... 66 | 67 | 68 | 69 | 70 | ``` 71 | 72 | #### JUnit 73 | Обратите внимание, что у артефакта нет `-api` на конце. Если у вас автоматически добавилась зависимость вида `junit-jupiter-api`, то лучше поменять артефакт на тот, что ниже, иначе будут сюрпризы в работе. 74 | 75 | ```xml 76 | 77 | org.junit.jupiter 78 | junit-jupiter 79 | 5.7.0 80 | test 81 | 82 | ``` 83 | 84 | #### Surefire 85 | Без этого плагина тесты могут Мавеном не запускаться, хоть в идее через кнопки они и будут проходить. Чтобы лишний раз убедиться, что всё работает, нажмите `Ctrl+Ctrl` и затем `mvn clean test`. 86 | 87 | ```xml 88 | 89 | org.apache.maven.plugins 90 | maven-surefire-plugin 91 | 2.22.2 92 | 93 | true 94 | 95 | 96 | ``` 97 | 98 | --- 99 | 100 |
101 | 102 |
103 | 3. Что делать, если возникли сложности 104 | 105 | Это здорово. Если их преодолевать правильно, то можно получить большую образовательную пользу для себя. Периодическое возникновение вопросов, недопонимание пройденного материала — нормальная и неотъемлемая часть обучения. А мы здесь, чтобы помочь вам пройти этот путь. 106 | 107 | ### Что делать, если непонятна теория 108 | 1. Если подобный вопрос разбирался на лекции, посмотрите ещё раз раздел с этой темой в видеозаписи. 109 | 1. Если вопрос не решился, попробуйте поискать ответ самостоятельно в интернете, этот навык пригодится вам в работе. 110 | 1. Если самостоятельно разобраться не удалось, задайте вопрос в общем чате, мы обязательно поможем. 111 | 112 | ### Что делать, если непонятно условие задания 113 | 1. Прежде чем задать вопрос по условию задачи, перечитайте его ещё раз и убедитесь, что в тексте условия нет прямого ответа на этот вопрос. Умение работать с текстом — важный навык работы с информацией. 114 | 1. Если ответа на свой вопрос в тексте условия не увидели, задайте его в общем чате, мы раскроем детали условия. 115 | 116 | ### Что делать, если не получается задача 117 | Если ваша проблема — это **ошибка компиляции** — подчёркивает красным, не даёт запустить программу, сборки проекта, CI и прочие подобные ошибки, то: 118 | 1. Найдите и прочитайте текст ошибки, который вам подсвечивает идея или логи. «Подчёркивает красным» — это не описание ошибки. 119 | 1. Попробуйте понять текст ошибки, при необходимости воспользуйтесь переводчиком. Не страшно, если вы переведёте неточно, тут главное — сам процесс: со временем и с нашей помощью вы будете это делать лучше и лучше, но, пропуская этот этап, вы не сможете научиться это делать. 120 | 1. Если не получилось понять ошибку по её тексту, попробуйте её загуглить и изучить подобную ошибку у других людей. Попробуйте примерить решения их проблем на свой код. Соотнесите найденные описания ошибки с пройденной теорией. 121 | 1. Если всё равно ваши трудности не разрешились, напишите в общий чат, обязательно указав: 122 | 1. название задачи и ссылку на условие; 123 | 1. ссылку на вашу работу; 124 | 1. текст и скриншот, не фотографию, ошибки; 125 | 1. ваши размышления и описание шагов, которые вы совершили для решения. 126 | 127 | Если ваша проблема — это **ошибка исполнения**, программа умирает уже после запуска, или она **отрабатывает неправильно**, из-за чего ваши тесты не проходят, то: 128 | 1. Воспользуйтесь отладчиком для пошагового анализа работы вашей программы. Так вы или убедитесь в неправильности придуманного вами алгоритма, или найдёте конкретное место, где ожидаемое поведение программы разошлось с фактическим. 129 | 1. Если проблему найти не получилось, напишите в общий чат, обязательно указав: 130 | 1. название задачи и ссылку на условие; 131 | 1. ссылку на вашу работу; 132 | 1. конкретное и подробное описание проблемы или затруднения при решении задачи. «Помогите, что-то не так» — это не описание; 133 | 1. подробное описание вашего анализа программы с помощью отладчика вместе со скринами; 134 | 1. ваши размышления и описание шагов, которые вы совершили для решения. 135 | --- 136 | 137 |
138 | 139 | 140 |
141 | 4. Отформатирован код 142 | 143 | Кроме правил, нарушение которых приводит к ошибкам компиляции, есть ещё и [правила форматирования кода](https://google.github.io/styleguide/javaguide.html), соблюдение которых обязательно при написании программ. 144 | 145 | С большинством проблем может справиться автоформатирование в идее. Для этого выберите `Code -> Reformat code` в меню или используйте горячие сочетания клавиш. В меню будет показано актуальное сочетание для вашей операционной системы. Так, идея поправит неправильные отступы, пробелы и некоторые другие ошибки. Следите, чтобы у `if-else`, `for`, `while` всегда были `{}`. 146 | 147 | Проблемы с именованием сущностей нужно решать самим. Так, все ячейки, кроме `final`-констант, и методы должны писаться [камелкейсом](https://ru.wikipedia.org/wiki/CamelCase) с **маленькой** буквы, а классы и интерфейсы — камелкейсом с **большой** буквы. 148 | 149 | Мы вам настоятельно советуем всегда держать код в отформатированном виде во время разработки, со временем глаз привыкнет, и вы почувствуете, насколько это облегчает поиск ошибок в коде и его анализ. В любом случае перед отправкой кода на проверку его обязательно нужно отформатировать, иначе он может быть отправлен на доработку без более глубокой проверки на этой итерации. 150 |
151 | 152 | # Задание 1. Дописываем тесты (обязательное к выполнению) 153 | Нашей целью будет переделать проект с приложением про бонус с покупки на Мавен и хорошо его протестировать. 154 | 155 | **Шаг 1.** Создайте проект на базе Maven. 156 | 157 | **Шаг 2.** Добавьте в проект JUnit Jupiter & Surefire Plugin 158 | 159 | **Шаг 3.** Создайте сервисный класс со следующим исходным кодом: 160 | ```java 161 | public class BonusService { 162 | public long calculate(long amount, boolean registered) { 163 | int percent = registered ? 3 : 1; 164 | long bonus = amount * percent / 100; 165 | long limit = 500; 166 | if (bonus > limit) { 167 | bonus = limit; 168 | } 169 | return bonus; 170 | } 171 | } 172 | ``` 173 | 174 | **Шаг 4.** Создайте тестовый класс со следующим исходным кодом: 175 | ```java 176 | import static org.junit.jupiter.api.Assertions.*; 177 | 178 | public class BonusServiceTest { 179 | 180 | @org.junit.jupiter.api.Test 181 | void shouldCalculateForRegisteredAndUnderLimit() { 182 | BonusService service = new BonusService(); 183 | 184 | // подготавливаем данные: 185 | long amount = 1000; 186 | boolean registered = true; 187 | long expected = 30; 188 | 189 | // вызываем целевой метод: 190 | long actual = service.calculate(amount, registered); 191 | 192 | // производим проверку (сравниваем ожидаемый и фактический): 193 | assertEquals(expected, actual); 194 | } 195 | 196 | @org.junit.jupiter.api.Test 197 | void shouldCalculateForRegisteredAndOverLimit() { 198 | BonusService service = new BonusService(); 199 | 200 | // подготавливаем данные: 201 | long amount = 1_000_000; 202 | boolean registered = true; 203 | long expected = 500; 204 | 205 | // вызываем целевой метод: 206 | long actual = service.calculate(amount, registered); 207 | 208 | // производим проверку (сравниваем ожидаемый и фактический): 209 | assertEquals(expected, actual); 210 | } 211 | } 212 | ``` 213 | 214 | **Шаг 5.** Запустите тесты через `mvn clean test`, убедитесь, что они запускаются и проходят. 215 | 216 | **Шаг 6.** Проведите тест-дизайн сервисного класса, очень глубоко его можно не проводить, допишите недостающие тесты. 217 | 218 | **Шаг 7.** Убедитесь, что тесты запускаются и проходят. 219 | 220 | Итого: отправьте на проверку ссылку на репозиторий GitHub с вашим проектом. 221 | 222 | # Задание 2. Читаем логи (необязательная задача повышенной сложности) 223 | 224 | Ваш коллега — очень любознательный товарищ. Узнав про то, что Maven может использовать плагины, он сразу начал искать, какие плагины есть. 225 | 226 | И нашёл один, с его точки зрения, достаточно замечательный плагин, который ищет ошибки в коде. 227 | 228 | Представляете? Сам ищет ошибки в коде! 229 | 230 | Естественно, он не преминул этим воспользоваться, загуглил, как подключить этот плагин и даже смог его запустить на одном из наших проектов. 231 | 232 | Но поскольку он не совсем разобрался, как работать с логами, он не совсем понимает, что и где не так и куда смотреть. 233 | 234 | Поэтому он обратился к вам. 235 | 236 | Ваша задача: 237 | 1. Взять проект, который прикреплён в архиве [`bonus-service.zip`](https://github.com/netology-code/javaqa2-homeworks/blob/main/files/bonus-service.zip?raw=true). 238 | 1. Открыть его как Maven проект в IDEA. 239 | 1. Запустить следующую команду Maven*: `mvn clean compile spotbugs:check`. Ваш коллега не может объяснить, что это значит, но говорит, что запускать нужно именно так. 240 | 1. Проанализировать логи, выяснить в чём ошибка. Воспользуйтесь гуглом по типу ошибки и чтением документации. 241 | 1. Исправить ошибку так, чтобы повторный вызов `mvn clean compile spotbugs:check` завершался успешно, менять `pom.xml` нельзя. 242 | 243 | Как выкладывать проект на GitHub: 244 | 1. Заливаете исходную версию. 245 | 1. Создаёте issue* с описанием того, что не так, и прикладываете кусок лога, из которого это видно, плюс ссылку на проблемный участок кода. 246 | 1. Фиксите всё с сообщением коммита `fixed #1`, где 1 — это id issue. 247 | 1. Заливаете на GitHub, удостоверяетесь, что после пуша issue автоматически закроется. 248 | 249 | Примечание*: как работать с issue, описано в третьей лекции курса по Git и в первом домашнем задании блока по Java. 250 | 251 | ### Результат 252 | При отправке решения в личном кабинете прикрепите ссылку на ваш публичный репозиторий GitHub с вашим проектом. 253 | 254 | -------------------------------------------------------------------------------- /MOCKITO.md: -------------------------------------------------------------------------------- 1 | 2 | # Домашнее задание к занятию «Композиция и зависимость объектов. Mockito при создании автотестов» 3 | 4 | ## Инструкция к выполнению домашнего задания 5 | 6 | Перед тем как отправить своё решение на проверку преподавателю, сверьтесь с чеклистом. 7 | 8 |
9 | 1. В решении выполнены все требования задания 10 | 11 | Убедитесь, что все требования задания выполнены. Для этого перед отправкой внимательно прочтите весь текст условия задания и соотнесите сказанное в нём с вашим решением. Навык самопроверки работы перед ревью пригодится вам как при обучении, так и на работе. 12 | 13 | --- 14 | 15 |
16 |
17 | 2. Правильно настроен Maven-проект, тесты проходят 18 | 19 | Репозиторий должен быть папкой вашего Мавен-проекта. Обратите внимание, что репозиторием не должна быть папка, в которой лежит папка Мавен-проекта, он сам должен быть папкой проекта. В нём должны быть соответствующие файлы и папки — `pom.xml`, `src` и другие. 20 | 21 | Не забудьте создать .gitignore-файл в корне проекта и добавить туда в игнорирование автогенерируемую папку `target`. 22 | 23 | Общая схема вашего `pom.xml`-файла: 24 | 25 | ```xml 26 | 27 | 30 | 4.0.0 31 | 32 | ru.netology 33 | НАЗВАНИЕ-ВАШЕГО-ПРОЕКТА-БЕЗ-ПРОБЕЛОВ 34 | 1.0-SNAPSHOT 35 | 36 | 37 | 11 38 | 11 39 | UTF-8 40 | 41 | 42 | 43 | 44 | 45 | ... 46 | 47 | ... 48 | 49 | 50 | 51 | 52 | 53 | 54 | ... 55 | 56 | 57 | 58 | ... 59 | 60 | 61 | ... 62 | 63 | ... 64 | 65 | 66 | ... 67 | 68 | 69 | 70 | 71 | ``` 72 | 73 | #### JUnit 74 | Обратите внимание, что у артефакта нет `-api` на конце. Если у вас автоматически добавилась зависимость вида `junit-jupiter-api`, то лучше поменять артефакт на тот, что ниже, иначе будут сюрпризы в работе. 75 | 76 | ```xml 77 | 78 | org.junit.jupiter 79 | junit-jupiter 80 | 5.7.0 81 | test 82 | 83 | ``` 84 | 85 | #### Surefire 86 | Без этого плагина тесты могут Мавеном не запускаться, хоть в идее через кнопки они и будут проходить. Чтобы лишний раз убедиться, что всё работает, нажмите `Ctrl+Ctrl` и затем `mvn clean test`. 87 | 88 | ```xml 89 | 90 | org.apache.maven.plugins 91 | maven-surefire-plugin 92 | 2.22.2 93 | 94 | true 95 | 96 | 97 | ``` 98 | 99 | --- 100 | 101 |
102 | 103 |
104 | 3. Что делать, если возникли сложности 105 | 106 | Это здорово. Если их преодолевать правильно, то можно получить большую образовательную пользу для себя. Периодическое возникновение вопросов, недопонимание пройденного материала — нормальная и неотъемлемая часть обучения. А мы здесь, чтобы помочь вам пройти этот путь. 107 | 108 | ### Что делать, если непонятна теория 109 | 1. Если подобный вопрос разбирался на лекции, посмотрите ещё раз раздел с этой темой в видеозаписи. 110 | 1. Если вопрос не решился, попробуйте поискать ответ самостоятельно в интернете, этот навык пригодится вам в работе. 111 | 1. Если самостоятельно разобраться не удалось, задайте вопрос в общем чате, мы обязательно поможем. 112 | 113 | ### Что делать, если непонятно условие задания 114 | 1. Прежде чем задать вопрос по условию задачи, перечитайте его ещё раз и убедитесь, что в тексте условия нет прямого ответа на этот вопрос. Умение работать с текстом — важный навык работы с информацией. 115 | 1. Если ответа на свой вопрос в тексте условия не увидели, задайте его в общем чате, мы раскроем детали условия. 116 | 117 | ### Что делать, если не получается задача 118 | Если ваша проблема — это **ошибка компиляции** — подчёркивает красным, не даёт запустить программу, сборки проекта, CI и прочие подобные ошибки, то: 119 | 1. Найдите и прочитайте текст ошибки, который вам подсвечивает идея или логи. «Подчёркивает красным» — это не описание ошибки. 120 | 1. Попробуйте понять текст ошибки, при необходимости воспользуйтесь переводчиком. Не страшно, если вы переведёте неточно, тут главное — сам процесс: со временем и с нашей помощью вы будете это делать лучше и лучше, но, пропуская этот этап, вы не сможете научиться это делать. 121 | 1. Если не получилось понять ошибку по её тексту, попробуйте её загуглить и изучить подобную ошибку у других людей. Попробуйте примерить решения их проблем на свой код. Соотнесите найденные описания ошибки с пройденной теорией. 122 | 1. Если всё равно ваши трудности не разрешились, напишите в общий чат, обязательно указав: 123 | 1. название задачи и ссылку на условие; 124 | 1. ссылку на вашу работу; 125 | 1. текст и скриншот, не фотографию, ошибки; 126 | 1. ваши размышления и описание шагов, которые вы совершили для решения. 127 | 128 | Если ваша проблема — это **ошибка исполнения**, программа умирает уже после запуска, или она **отрабатывает неправильно**, из-за чего ваши тесты не проходят, то: 129 | 1. Воспользуйтесь отладчиком для пошагового анализа работы вашей программы. Так вы или убедитесь в неправильности придуманного вами алгоритма, или найдёте конкретное место, где ожидаемое поведение программы разошлось с фактическим. 130 | 1. Если проблему найти не получилось, напишите в общий чат, обязательно указав: 131 | 1. название задачи и ссылку на условие; 132 | 1. ссылку на вашу работу; 133 | 1. конкретное и подробное описание проблемы или затруднения при решении задачи. «Помогите, что-то не так» — это не описание; 134 | 1. подробное описание вашего анализа программы с помощью отладчика вместе со скринами; 135 | 1. ваши размышления и описание шагов, которые вы совершили для решения. 136 | --- 137 | 138 |
139 | 140 |
141 | 4. Отформатирован код 142 | 143 | Кроме правил, нарушение которых приводит к ошибкам компиляции, есть ещё и [правила форматирования кода](https://google.github.io/styleguide/javaguide.html), соблюдение которых обязательно при написании программ. 144 | 145 | С большинством проблем может справиться автоформатирование в идее. Для этого выберите `Code -> Reformat code` в меню или используйте горячие сочетания клавиш. В меню будет показано актуальное сочетание для вашей операционной системы. Так, идея поправит неправильные отступы, пробелы и некоторые другие ошибки. Следите, чтобы у `if-else`, `for`, `while` всегда были `{}`. 146 | 147 | Проблемы с именованием сущностей нужно решать самим. Так, все ячейки, кроме `final`-констант, и методы должны писаться [камелкейсом](https://ru.wikipedia.org/wiki/CamelCase) с **маленькой** буквы, а классы и интерфейсы — камелкейсом с **большой** буквы. 148 | 149 | Мы вам настоятельно советуем всегда держать код в отформатированном виде во время разработки, со временем глаз привыкнет, и вы почувствуете, насколько это облегчает поиск ошибок в коде и его анализ. В любом случае перед отправкой кода на проверку его обязательно нужно отформатировать, иначе он может быть отправлен на доработку без более глубокой проверки на этой итерации. 150 |
151 | 152 | 153 |
154 | 5. Настроен Github CI с verify-сборкой Maven и JaCoCo в режиме генерации отчётов с покрытием на 100% по бранчам методов с логикой [:warning:: в этом задании можно не покрывать на 100%] 155 | 156 | #### CI 157 | После связывания локального репозитория с удалённым и первого пуша в заготовки проекта, время настроить CI на основе GitHub Actions. Шаблон вашего maven.yml должен выглядеть вот так, убедитесь, что всё совпадает с вашим шаблоном, например, что вы указали фазу `verify`, а не `package`: 158 | ```yml 159 | name: Java CI with Maven 160 | 161 | on: [push, pull_request] 162 | 163 | jobs: 164 | build: 165 | 166 | runs-on: ubuntu-latest 167 | 168 | steps: 169 | - uses: actions/checkout@v2 170 | - name: Set up JDK 11 171 | uses: actions/setup-java@v2 172 | with: 173 | java-version: '11' 174 | distribution: 'adopt' 175 | - name: Build with Maven 176 | run: mvn -B -e verify 177 | ``` 178 | 179 | #### JaCoCo 180 | 181 | ```xml 182 | 183 | org.jacoco 184 | jacoco-maven-plugin 185 | 0.8.5 186 | ... 187 | ``` 188 | 189 | Инициализация: 190 | ```xml 191 | 192 | prepare-agent 193 | 194 | prepare-agent 195 | 196 | 197 | ``` 198 | 199 | В режиме генерации отчётов: 200 | ```xml 201 | 202 | report 203 | verify 204 | 205 | report 206 | 207 | 208 | ``` 209 | 210 | В режиме проверки и обрушения сборки по уровню покрытия: 211 | ```xml 212 | 213 | check 214 | 215 | check 216 | 217 | 218 | 219 | 220 | 221 | 222 | LINE 223 | COVEREDRATIO 224 | 100% 225 | 226 | 227 | 228 | 229 | 230 | 231 | ``` 232 | 233 |
234 | 235 | 236 | # Задание 1. Менеджер афиши (обязательное к выполнению) 237 | 238 | Вам необходимо реализовать менеджер афиши для фильмов. В качестве объекта фильма можно взять объект строки — название фильма — или создать свой дата-класс. 239 | 240 | ![image](https://user-images.githubusercontent.com/53707586/152697921-e71d853c-aa2e-482b-be61-39e6c2cfb0b1.png) 241 | 242 | В этой задаче не нужно разделять менеджер и репозиторий — все фильмы должны храниться внутри массива в поле самого менеджера. Изначально, сразу после создания, менеджер не должен содержать фильмов. 243 | 244 | Менеджер должен уметь выполнять следующие операции: 245 | 1. Добавление нового фильма. 246 | 2. Вывод всех фильмов в порядке добавления (`findAll`). 247 | 3. Вывод максимального лимита* последних добавленных фильмов в обратном от добавления порядке (`findLast`). 248 | 249 | *Сделайте так, чтобы по умолчанию выводилось последние 10 добавленных фильмов, но при создании менеджера можно было указать другое число, чтобы, например, выдавать 5, а не 10. То есть у менеджера должно быть два конструктора: один без параметров, выставляющий лимит менеджера в 10, а другой с параметром, берущий значение лимита для менеджера из параметра конструктора. 250 | 251 | Метод получения последних фильмов будет очень похож на тот, что был в лекции. Основное отличие в том, что вам в его начале надо будет вычислить правильный ожидаемый размер результирующего массива-ответа, а не просто брать длину массива, что лежит в поле. Сделать это можно, заведя целочисленную переменную, в которую вы сохраните желаемый размер создаваемого массива, вычислите с помощью условных операторов для неё значение, а затем только создадите массив, указав эту переменную как требуемый для него размер, например: 252 | 253 | ```java 254 | ... 255 | ??? resultLength; 256 | if ??? { 257 | resultLength = ??? 258 | } else { 259 | resultLength = ??? 260 | } 261 | ??? result = new ???[resultLength]; 262 | for (???) { 263 | // заполняем result из массива, что лежит в поле 264 | // в обратном порядке 265 | } 266 | ... 267 | ``` 268 | 269 | Не забывайте про использование отладчика для поиска проблем вашей реализации, если тесты проходить не будут. 270 | 271 | Напишите необходимые, с вашей точки зрения, автотесты на различные состояния менеджера. Можно делать их не в одном файле. 272 | 273 | Итого: отправьте на проверку ссылку на репозиторий GitHub с вашим проектом. 274 | 275 | # Задание 2*. Менеджер афиши: divide and conquer (необязательная задача) 276 | 277 | В первой задаче создайте новую ветку `layers`, в которой разделите менеджера на менеджера и репозиторий. 278 | В репозитории должны быть следующие методы: 279 | 1. `findAll` — возвращает массив всех хранящихся в массиве объектов. 280 | 1. `save` — добавляет объект в массив. 281 | 1. `findById` — возвращает объект по идентификатору, либо `null`, если такого объекта нет. 282 | 1. `removeById` — удаляет объект по идентификатору, если объекта нет, то пусть будет исключение, как на лекции. 283 | 1. `removeAll`* — полностью вычищает репозиторий, для удаления всех элементов достаточно в поле `items` положить пустой массив. 284 | 285 | Обеспечьте использование менеджером созданного вами репозитория. Новых функций в менеджер по сравнению с первым заданием добавлять не нужно. Репозиторий должен быть зависимостью для менеджера, то есть задаваться через конструктор и храниться в приватном поле. 286 | 287 | Напишите 1–2 автотеста, используя Mockito для организации моков репозитория. 288 | 289 | ### Результат 290 | При отправке решения в личном кабинете прикрепите ссылку на Pull Request ветки `layers` с вашим проектом. 291 | -------------------------------------------------------------------------------- /OOP1.md: -------------------------------------------------------------------------------- 1 | # Домашнее задание к занятию «Объектно-ориентированное программирование и проектирование» 2 | 3 | ## Инструкция к выполнению домашнего задания 4 | 5 | Перед тем как отправить своё решение на проверку преподавателю, сверьтесь с чеклистом. 6 | 7 |
8 | 1. В решении выполнены все требования задания 9 | 10 | Убедитесь, что все требования задания выполнены. Для этого перед отправкой внимательно прочтите весь текст условия задания и соотнесите сказанное в нём с вашим решением. Навык самопроверки работы перед ревью пригодится вам как при обучении, так и на работе. 11 | 12 | --- 13 | 14 |
15 |
16 | 2. Правильно настроен Maven-проект, тесты проходят 17 | 18 | Репозиторий должен быть папкой вашего Мавен-проекта. Обратите внимание, что репозиторием не должна быть папка, в которой лежит папка Мавен-проекта, он сам должен быть папкой проекта. В нём должны быть соответствующие файлы и папки — `pom.xml`, `src` и другие. 19 | 20 | Не забудьте создать .gitignore-файл в корне проекта и добавить туда в игнорирование автогенерируемую папку `target`. 21 | 22 | Общая схема вашего `pom.xml`-файла: 23 | 24 | ```xml 25 | 26 | 29 | 4.0.0 30 | 31 | ru.netology 32 | НАЗВАНИЕ-ВАШЕГО-ПРОЕКТА-БЕЗ-ПРОБЕЛОВ 33 | 1.0-SNAPSHOT 34 | 35 | 36 | 11 37 | 11 38 | UTF-8 39 | 40 | 41 | 42 | 43 | 44 | ... 45 | 46 | ... 47 | 48 | 49 | 50 | 51 | 52 | 53 | ... 54 | 55 | 56 | 57 | ... 58 | 59 | 60 | ... 61 | 62 | ... 63 | 64 | 65 | ... 66 | 67 | 68 | 69 | 70 | ``` 71 | 72 | #### JUnit 73 | Обратите внимание, что у артефакта нет `-api` на конце. Если у вас автоматически добавилась зависимость вида `junit-jupiter-api`, то лучше поменять артефакт на тот, что ниже, иначе будут сюрпризы в работе. 74 | 75 | ```xml 76 | 77 | org.junit.jupiter 78 | junit-jupiter 79 | 5.7.0 80 | test 81 | 82 | ``` 83 | 84 | #### Surefire 85 | Без этого плагина тесты могут Мавеном не запускаться, хоть в идее через кнопки они и будут проходить. Чтобы лишний раз убедиться, что всё работает, нажмите `Ctrl+Ctrl` и затем `mvn clean test`. 86 | 87 | ```xml 88 | 89 | org.apache.maven.plugins 90 | maven-surefire-plugin 91 | 2.22.2 92 | 93 | true 94 | 95 | 96 | ``` 97 | 98 | --- 99 | 100 |
101 | 102 |
103 | 3. Что делать, если возникли сложности 104 | 105 | Это здорово. Если их преодолевать правильно, то можно получить большую образовательную пользу для себя. Периодическое возникновение вопросов, недопонимание пройденного материала — нормальная и неотъемлемая часть обучения. А мы здесь, чтобы помочь вам пройти этот путь. 106 | 107 | ### Что делать, если непонятна теория 108 | 1. Если подобный вопрос разбирался на лекции, посмотрите ещё раз раздел с этой темой в видеозаписи. 109 | 1. Если вопрос не решился, попробуйте поискать ответ самостоятельно в интернете, этот навык пригодится вам в работе. 110 | 1. Если самостоятельно разобраться не удалось, задайте вопрос в общем чате, мы обязательно поможем. 111 | 112 | ### Что делать, если непонятно условие задания 113 | 1. Прежде чем задать вопрос по условию задачи, перечитайте его ещё раз и убедитесь, что в тексте условия нет прямого ответа на этот вопрос. Умение работать с текстом — важный навык работы с информацией. 114 | 1. Если ответа на свой вопрос в тексте условия не увидели, задайте его в общем чате, мы раскроем детали условия. 115 | 116 | ### Что делать, если не получается задача 117 | Если ваша проблема — это **ошибка компиляции** — подчёркивает красным, не даёт запустить программу, сборки проекта, CI и прочие подобные ошибки, то: 118 | 1. Найдите и прочитайте текст ошибки, который вам подсвечивает идея или логи. «Подчёркивает красным» — это не описание ошибки. 119 | 1. Попробуйте понять текст ошибки, при необходимости воспользуйтесь переводчиком. Не страшно, если вы переведёте неточно, тут главное — сам процесс: со временем и с нашей помощью вы будете это делать лучше и лучше, но, пропуская этот этап, вы не сможете научиться это делать. 120 | 1. Если не получилось понять ошибку по её тексту, попробуйте её загуглить и изучить подобную ошибку у других людей. Попробуйте примерить решения их проблем на свой код. Соотнесите найденные описания ошибки с пройденной теорией. 121 | 1. Если всё равно ваши трудности не разрешились, напишите в общий чат, обязательно указав: 122 | 1. название задачи и ссылку на условие; 123 | 1. ссылку на вашу работу; 124 | 1. текст и скриншот, не фотографию, ошибки; 125 | 1. ваши размышления и описание шагов, которые вы совершили для решения. 126 | 127 | Если ваша проблема — это **ошибка исполнения**, программа умирает уже после запуска, или она **отрабатывает неправильно**, из-за чего ваши тесты не проходят, то: 128 | 1. Воспользуйтесь отладчиком для пошагового анализа работы вашей программы. Так вы или убедитесь в неправильности придуманного вами алгоритма, или найдёте конкретное место, где ожидаемое поведение программы разошлось с фактическим. 129 | 1. Если проблему найти не получилось, напишите в общий чат, обязательно указав: 130 | 1. название задачи и ссылку на условие; 131 | 1. ссылку на вашу работу; 132 | 1. конкретное и подробное описание проблемы или затруднения при решении задачи. «Помогите, что-то не так» — это не описание; 133 | 1. подробное описание вашего анализа программы с помощью отладчика вместе со скринами; 134 | 1. ваши размышления и описание шагов, которые вы совершили для решения. 135 | --- 136 | 137 |
138 | 139 |
140 | 4. Отформатирован код 141 | 142 | Кроме правил, нарушение которых приводит к ошибкам компиляции, есть ещё и [правила форматирования кода](https://google.github.io/styleguide/javaguide.html), соблюдение которых обязательно при написании программ. 143 | 144 | С большинством проблем может справиться автоформатирование в идее. Для этого выберите `Code -> Reformat code` в меню или используйте горячие сочетания клавиш. В меню будет показано актуальное сочетание для вашей операционной системы. Так, идея поправит неправильные отступы, пробелы и некоторые другие ошибки. Следите, чтобы у `if-else`, `for`, `while` всегда были `{}`. 145 | 146 | Проблемы с именованием сущностей нужно решать самим. Так, все ячейки, кроме `final`-констант, и методы должны писаться [камелкейсом](https://ru.wikipedia.org/wiki/CamelCase) с **маленькой** буквы, а классы и интерфейсы — камелкейсом с **большой** буквы. 147 | 148 | Мы вам настоятельно советуем всегда держать код в отформатированном виде во время разработки, со временем глаз привыкнет, и вы почувствуете, насколько это облегчает поиск ошибок в коде и его анализ. В любом случае перед отправкой кода на проверку его обязательно нужно отформатировать, иначе он может быть отправлен на доработку без более глубокой проверки на этой итерации. 149 |
150 | 151 |
152 | 5. Настроен Github CI с verify-сборкой Maven и JaCoCo :new: 153 | 154 | #### CI 155 | После связывания локального репозитория с удалённым и первого пуша в заготовки проекта, время настроить CI на основе GitHub Actions. Шаблон вашего maven.yml должен выглядеть вот так, убедитесь, что всё совпадает с вашим шаблоном, например, что вы указали фазу `verify`, а не `package`: 156 | ```yml 157 | name: Java CI with Maven 158 | 159 | on: [push, pull_request] 160 | 161 | jobs: 162 | build: 163 | 164 | runs-on: ubuntu-latest 165 | 166 | steps: 167 | - uses: actions/checkout@v2 168 | - name: Set up JDK 11 169 | uses: actions/setup-java@v2 170 | with: 171 | java-version: '11' 172 | distribution: 'adopt' 173 | - name: Build with Maven 174 | run: mvn -B -e verify 175 | ``` 176 | 177 | #### JaCoCo 178 | 179 | ```xml 180 | 181 | org.jacoco 182 | jacoco-maven-plugin 183 | 0.8.5 184 | ... 185 | ``` 186 | 187 | Инициализация: 188 | ```xml 189 | 190 | prepare-agent 191 | 192 | prepare-agent 193 | 194 | 195 | ``` 196 | 197 | В режиме генерации отчётов: 198 | ```xml 199 | 200 | report 201 | verify 202 | 203 | report 204 | 205 | 206 | ``` 207 | 208 | В режиме проверки и обрушения сборки по уровню покрытия: 209 | ```xml 210 | 211 | check 212 | 213 | check 214 | 215 | 216 | 217 | 218 | 219 | 220 | LINE 221 | COVEREDRATIO 222 | 100% 223 | 224 | 225 | 226 | 227 | 228 | 229 | ``` 230 | 231 |
232 | 233 | # Задание 1. Радиоман (обязательное к выполнению) 234 | 235 | В рамках проекта по созданию «Умного дома» у нас появился очень важный клиент, которых хочет кастомную доработку: он очень любит радио, поэтому нам нужно научиться управлять радио. 236 | 237 | Что нужно сделать: по аналогии с кондиционером создайте класс `Radio`, в котором храните следующие поля — данные, которые будут помнить о себе объекты радио): 238 | 1. Номер текущей радиостанции. 239 | 1. Громкость звука. 240 | 241 | Требования к работе с радиостанциями: 242 | 1. Номер текущей радиостанции может принимать значения только в пределах от 0 до 9. 243 | 1. Если текущая радиостанция — 9 и клиент нажал на кнопку `next` (=вызвал одноимённый метод `next`, с англ. — следующая) на пульте, то текущей должна стать нулевая. В остальных случаях при нажатии на эту же кнопку радио переключается просто на следующую станцию. 244 | 1. Если текущая радиостанция — 0 и клиент нажал на кнопку `prev` (=вызвал одноимённый метод `prev`, с англ. — предыдущая) на пульте, то текущей должна стать девятая. В остальных случаях радио переключается просто на предыдущую станцию. 245 | 1. Клиент должен иметь возможность выставлять номер радиостанции через прямое указание её номера. Для этого подойдёт один метод-сеттер с проверкой на допустимость номера станции. 246 | 247 | Требования к работе с уровнем громкости звука: 248 | 1. Клиент должен иметь возможность увеличивать и уменьшать уровень громкости звука в пределах от 0 до 10. 249 | 1. Если уровень громкости звука достиг максимального значения, то дальнейшее нажатие на `+` (=вызов метода увеличения громкости на один, придумайте название сами) не должно ни к чему приводить. 250 | 1. Если уровень громкости звука достиг минимального значения, то дальнейшее нажатие на `-` (=вызов метода уменьшения громкости на один, придумайте название сами) не должно ни к чему приводить. 251 | 252 | Пример реализации метода увеличения звука на 1. Остальные методы переключения на 1 текущей станции или звука сделайте самостоятельно по аналогии: 253 | ```java 254 | public class Radio { 255 | ... 256 | 257 | public void increaseVolume() { 258 | if (currentVolume < 10) { 259 | currentVolume = currentVolume + 1; 260 | } 261 | } 262 | } 263 | ``` 264 | 265 | К созданному классу `Radio` напишите тесты, добейтесь покрытия на 100% по бранчам, обрушать сборку по покрытию при этом не нужно. Для хорошего тестирования рекомендуем вам провести тест-дизайн перед написанием тестов, так вы с большей вероятностью найдёте дефекты в вашем коде. 266 | 267 | ### Результат 268 | При отправке решения в личном кабинете прикрепите ссылку на ваш публичный репозиторий GitHub. 269 | -------------------------------------------------------------------------------- /OOP_CONST.md: -------------------------------------------------------------------------------- 1 | # Домашнее задание к занятию «Объекты с внутренним состоянием, управление состоянием при тестировании» 2 | 3 | ## Инструкция к выполнению домашнего задания 4 | 5 | Перед тем как отправить своё решение на проверку преподавателю, сверьтесь с чеклистом. 6 | 7 |
8 | 1. В решении выполнены все требования задания 9 | 10 | Убедитесь, что все требования задания выполнены. Для этого перед отправкой внимательно прочтите весь текст условия задания и соотнесите сказанное в нём с вашим решением. Навык самопроверки работы перед ревью пригодится вам как при обучении, так и на работе. 11 | 12 | --- 13 | 14 |
15 |
16 | 2. Правильно настроен Maven-проект, тесты проходят 17 | 18 | Репозиторий должен быть папкой вашего Мавен-проекта. Обратите внимание, что репозиторием не должна быть папка, в которой лежит папка Мавен-проекта, он сам должен быть папкой проекта. В нём должны быть соответствующие файлы и папки — `pom.xml`, `src` и другие. 19 | 20 | Не забудьте создать .gitignore-файл в корне проекта и добавить туда в игнорирование автогенерируемую папку `target`. 21 | 22 | Общая схема вашего `pom.xml`-файла: 23 | 24 | ```xml 25 | 26 | 29 | 4.0.0 30 | 31 | ru.netology 32 | НАЗВАНИЕ-ВАШЕГО-ПРОЕКТА-БЕЗ-ПРОБЕЛОВ 33 | 1.0-SNAPSHOT 34 | 35 | 36 | 11 37 | 11 38 | UTF-8 39 | 40 | 41 | 42 | 43 | 44 | ... 45 | 46 | ... 47 | 48 | 49 | 50 | 51 | 52 | 53 | ... 54 | 55 | 56 | 57 | ... 58 | 59 | 60 | ... 61 | 62 | ... 63 | 64 | 65 | ... 66 | 67 | 68 | 69 | 70 | ``` 71 | 72 | #### JUnit 73 | Обратите внимание, что у артефакта нет `-api` на конце. Если у вас автоматически добавилась зависимость вида `junit-jupiter-api`, то лучше поменять артефакт на тот, что ниже, иначе будут сюрпризы в работе. 74 | 75 | ```xml 76 | 77 | org.junit.jupiter 78 | junit-jupiter 79 | 5.7.0 80 | test 81 | 82 | ``` 83 | 84 | #### Surefire 85 | Без этого плагина тесты могут Мавеном не запускаться, хоть в идее через кнопки они и будут проходить. Чтобы лишний раз убедиться, что всё работает, нажмите `Ctrl+Ctrl` и затем `mvn clean test`. 86 | 87 | ```xml 88 | 89 | org.apache.maven.plugins 90 | maven-surefire-plugin 91 | 2.22.2 92 | 93 | true 94 | 95 | 96 | ``` 97 | 98 | --- 99 | 100 |
101 | 102 |
103 | 3. Что делать, если возникли сложности 104 | 105 | Это здорово. Если их преодолевать правильно, то можно получить большую образовательную пользу для себя. Периодическое возникновение вопросов, недопонимание пройденного материала — нормальная и неотъемлемая часть обучения. А мы здесь, чтобы помочь вам пройти этот путь. 106 | 107 | ### Что делать, если непонятна теория 108 | 1. Если подобный вопрос разбирался на лекции, посмотрите ещё раз раздел с этой темой в видеозаписи. 109 | 1. Если вопрос не решился, попробуйте поискать ответ самостоятельно в интернете, этот навык пригодится вам в работе. 110 | 1. Если самостоятельно разобраться не удалось, задайте вопрос в общем чате, мы обязательно поможем. 111 | 112 | ### Что делать, если непонятно условие задания 113 | 1. Прежде чем задать вопрос по условию задачи, перечитайте его ещё раз и убедитесь, что в тексте условия нет прямого ответа на этот вопрос. Умение работать с текстом — важный навык работы с информацией. 114 | 1. Если ответа на свой вопрос в тексте условия не увидели, задайте его в общем чате, мы раскроем детали условия. 115 | 116 | ### Что делать, если не получается задача 117 | Если ваша проблема — это **ошибка компиляции** — подчёркивает красным, не даёт запустить программу, сборки проекта, CI и прочие подобные ошибки, то: 118 | 1. Найдите и прочитайте текст ошибки, который вам подсвечивает идея или логи. «Подчёркивает красным» — это не описание ошибки. 119 | 1. Попробуйте понять текст ошибки, при необходимости воспользуйтесь переводчиком. Не страшно, если вы переведёте неточно, тут главное — сам процесс: со временем и с нашей помощью вы будете это делать лучше и лучше, но, пропуская этот этап, вы не сможете научиться это делать. 120 | 1. Если не получилось понять ошибку по её тексту, попробуйте её загуглить и изучить подобную ошибку у других людей. Попробуйте примерить решения их проблем на свой код. Соотнесите найденные описания ошибки с пройденной теорией. 121 | 1. Если всё равно ваши трудности не разрешились, напишите в общий чат, обязательно указав: 122 | 1. название задачи и ссылку на условие; 123 | 1. ссылку на вашу работу; 124 | 1. текст и скриншот, не фотографию, ошибки; 125 | 1. ваши размышления и описание шагов, которые вы совершили для решения. 126 | 127 | Если ваша проблема — это **ошибка исполнения**, программа умирает уже после запуска, или она **отрабатывает неправильно**, из-за чего ваши тесты не проходят, то: 128 | 1. Воспользуйтесь отладчиком для пошагового анализа работы вашей программы. Так вы или убедитесь в неправильности придуманного вами алгоритма, или найдёте конкретное место, где ожидаемое поведение программы разошлось с фактическим. 129 | 1. Если проблему найти не получилось, напишите в общий чат, обязательно указав: 130 | 1. название задачи и ссылку на условие; 131 | 1. ссылку на вашу работу; 132 | 1. конкретное и подробное описание проблемы или затруднения при решении задачи. «Помогите, что-то не так» — это не описание; 133 | 1. подробное описание вашего анализа программы с помощью отладчика вместе со скринами; 134 | 1. ваши размышления и описание шагов, которые вы совершили для решения. 135 | --- 136 | 137 |
138 | 139 |
140 | 4. Отформатирован код 141 | 142 | Кроме правил, нарушение которых приводит к ошибкам компиляции, есть ещё и [правила форматирования кода](https://google.github.io/styleguide/javaguide.html), соблюдение которых обязательно при написании программ. 143 | 144 | С большинством проблем может справиться автоформатирование в идее. Для этого выберите `Code -> Reformat code` в меню или используйте горячие сочетания клавиш. В меню будет показано актуальное сочетание для вашей операционной системы. Так, идея поправит неправильные отступы, пробелы и некоторые другие ошибки. Следите, чтобы у `if-else`, `for`, `while` всегда были `{}`. 145 | 146 | Проблемы с именованием сущностей нужно решать самим. Так, все ячейки, кроме `final`-констант, и методы должны писаться [камелкейсом](https://ru.wikipedia.org/wiki/CamelCase) с **маленькой** буквы, а классы и интерфейсы — камелкейсом с **большой** буквы. 147 | 148 | Мы вам настоятельно советуем всегда держать код в отформатированном виде во время разработки, со временем глаз привыкнет, и вы почувствуете, насколько это облегчает поиск ошибок в коде и его анализ. В любом случае перед отправкой кода на проверку его обязательно нужно отформатировать, иначе он может быть отправлен на доработку без более глубокой проверки на этой итерации. 149 |
150 | 151 |
152 | 5. Настроен Github CI с verify-сборкой Maven и JaCoCo :new: 153 | 154 | #### CI 155 | После связывания локального репозитория с удалённым и первого пуша в заготовки проекта, время настроить CI на основе GitHub Actions. Шаблон вашего maven.yml должен выглядеть вот так, убедитесь, что всё совпадает с вашим шаблоном, например, что вы указали фазу `verify`, а не `package`: 156 | ```yml 157 | name: Java CI with Maven 158 | 159 | on: [push, pull_request] 160 | 161 | jobs: 162 | build: 163 | 164 | runs-on: ubuntu-latest 165 | 166 | steps: 167 | - uses: actions/checkout@v2 168 | - name: Set up JDK 11 169 | uses: actions/setup-java@v2 170 | with: 171 | java-version: '11' 172 | distribution: 'adopt' 173 | - name: Build with Maven 174 | run: mvn -B -e verify 175 | ``` 176 | 177 | #### JaCoCo 178 | 179 | ```xml 180 | 181 | org.jacoco 182 | jacoco-maven-plugin 183 | 0.8.5 184 | ... 185 | ``` 186 | 187 | Инициализация: 188 | ```xml 189 | 190 | prepare-agent 191 | 192 | prepare-agent 193 | 194 | 195 | ``` 196 | 197 | В режиме генерации отчётов: 198 | ```xml 199 | 200 | report 201 | verify 202 | 203 | report 204 | 205 | 206 | ``` 207 | 208 | В режиме проверки и обрушения сборки по уровню покрытия: 209 | ```xml 210 | 211 | check 212 | 213 | check 214 | 215 | 216 | 217 | 218 | 219 | 220 | LINE 221 | COVEREDRATIO 222 | 100% 223 | 224 | 225 | 226 | 227 | 228 | 229 | ``` 230 | 231 |
232 | 233 | 234 | # Задание 1. Радиоман (обязательное к выполнению) 235 | 236 | Проект «Умный дом» развивается, и было решено улучшить часть, отвечающую за радио. 237 | 238 | Что нужно сделать: внедрить изменения в сам класс и тесты. 239 | 240 | Как это сделать: 241 | 242 | * создайте в Git в том же репозитории новую ветку: flexible — возьмите проект к ДЗ про радио, в который уже подключены CI и нужные плагины; 243 | * модифицируете класс `Radio` под новые требования; 244 | * делаете тест-дизайн новой версии класса, модифицируете или добавляете новые тесты; 245 | * пушите всё на GitHub и делаете Pull Request, мёржить его не нужно; 246 | * удостоверьтесь, что все тесты в CI запускаются на Pull Request и проходят; 247 | * ссылку на Pull Request пришлите в качестве результата ДЗ. 248 | 249 | Требования к работе с радиостанциями: 250 | 251 | 1. Можно задавать **количество радиостанций** при создании объекта, по умолчанию — 10. 252 | 1. Номер текущей радиостанции изменяется в пределах от 0 до количества радиостанций не включительно. То есть если станций 10, то номер последней — 9. 253 | 1. Если текущая радиостанция — максимальная, и клиент нажал на кнопку next, следующая, на пульте, то текущей должна стать нулевая. 254 | 1. Если текущая радиостанция — 0, и клиент нажал на кнопку prev, предыдущая, на пульте, то текущей должна стать максимальная. 255 | 1. Всё так же должен присутствовать сеттер текущей станции. 256 | 257 | Теперь объекты радио в своём поле будут хранить и количество станций, заданное при создании объекта радио. Для этого вам понадобится создать свой конструктор для класса `Radio` с одним параметром, принимающий им желаемое количество радиостанций и сохраняющий это значение у себя в поле. Ещё один конструктор потребуется без параметров, чтобы, если пользователь нашего класса не захотел указывать количество радиостанций, мы бы выставили их количество в 10 штук, как указано в требованиях, «по умолчанию — 10». 258 | 259 | Внимание: конструктором с параметром задаётся именно количество радиостанций, а не номер максимальной, это разные вещи — если количество станций, например, 30, то последней будет номер 29, так как нумеруем мы с нуля. 260 | 261 | Требования к работе с уровнем громкости звука: 262 | 263 | * клиент должен иметь возможность увеличивать и уменьшать уровень громкости звука в пределах от 0 до 100; 264 | * если уровень громкости звука достиг максимального значения, то дальнейшее нажатие на + не должно ни к чему приводить; 265 | * если уровень громкости звука достиг минимального значения, то дальнейшее нажатие на - не должно ни к чему приводить. 266 | 267 | Итого: ссылку на Pull Request пришлите в качестве результата ДЗ. 268 | 269 | # Задание 2*. Lombok (необязательная задача) 270 | 271 | Пришла пора разобраться с [Lombok](https://projectlombok.org). В вашем личном кабинете прикреплено видео, где демонстрируется работа с Lombok. 272 | 273 | Что нужно сделать: 274 | 1. Из ветки `flexible`, созданной в предыдущем задании, создайте ветку `lombok`, в которой перепишите ваш класс `Radio`, используя Lombok. 275 | 1. Сделайте коммит и Pull Request на GitHub, удостоверьтесь, что CI успешно проводит сборку, мёржить его не нужно. 276 | 277 | ### Результат 278 | При отправке решения в личном кабинете прикрепите ссылку на ваш публичный репозиторий GitHub. 279 | -------------------------------------------------------------------------------- /OOP_PRINCIPLES.md: -------------------------------------------------------------------------------- 1 | # Домашнее задание к занятию «Объектно-ориентированное программирование: ключевые принципы» 2 | 3 | ## Инструкция к выполнению домашнего задания 4 | 5 | Перед тем как отправить своё решение на проверку преподавателю, сверьтесь с чеклистом. 6 | 7 |
8 | 1. В решении выполнены все требования задания 9 | 10 | Убедитесь, что все требования задания выполнены. Для этого перед отправкой внимательно прочтите весь текст условия задания и соотнесите сказанное в нём с вашим решением. Навык самопроверки работы перед ревью пригодится вам как при обучении, так и на работе. 11 | 12 | --- 13 | 14 |
15 |
16 | 2. Правильно настроен Maven-проект, тесты проходят 17 | 18 | Репозиторий должен быть папкой вашего Мавен-проекта. Обратите внимание, что репозиторием не должна быть папка, в которой лежит папка Мавен-проекта, он сам должен быть папкой проекта. В нём должны быть соответствующие файлы и папки — `pom.xml`, `src` и другие. 19 | 20 | Не забудьте создать .gitignore-файл в корне проекта и добавить туда в игнорирование автогенерируемую папку `target`. 21 | 22 | Общая схема вашего `pom.xml`-файла: 23 | 24 | ```xml 25 | 26 | 29 | 4.0.0 30 | 31 | ru.netology 32 | НАЗВАНИЕ-ВАШЕГО-ПРОЕКТА-БЕЗ-ПРОБЕЛОВ 33 | 1.0-SNAPSHOT 34 | 35 | 36 | 11 37 | 11 38 | UTF-8 39 | 40 | 41 | 42 | 43 | 44 | ... 45 | 46 | ... 47 | 48 | 49 | 50 | 51 | 52 | 53 | ... 54 | 55 | 56 | 57 | ... 58 | 59 | 60 | ... 61 | 62 | ... 63 | 64 | 65 | ... 66 | 67 | 68 | 69 | 70 | ``` 71 | 72 | #### JUnit 73 | Обратите внимание, что у артефакта нет `-api` на конце. Если у вас автоматически добавилась зависимость вида `junit-jupiter-api`, то лучше поменять артефакт на тот, что ниже, иначе будут сюрпризы в работе. 74 | 75 | ```xml 76 | 77 | org.junit.jupiter 78 | junit-jupiter 79 | 5.7.0 80 | test 81 | 82 | ``` 83 | 84 | #### Surefire 85 | Без этого плагина тесты могут Мавеном не запускаться, хоть в идее через кнопки они и будут проходить. Чтобы лишний раз убедиться, что всё работает, нажмите `Ctrl+Ctrl` и затем `mvn clean test`. 86 | 87 | ```xml 88 | 89 | org.apache.maven.plugins 90 | maven-surefire-plugin 91 | 2.22.2 92 | 93 | true 94 | 95 | 96 | ``` 97 | 98 | --- 99 | 100 |
101 | 102 |
103 | 3. Что делать, если возникли сложности 104 | 105 | Это здорово. Если их преодолевать правильно, то можно получить большую образовательную пользу для себя. Периодическое возникновение вопросов, недопонимание пройденного материала — нормальная и неотъемлемая часть обучения. А мы здесь, чтобы помочь вам пройти этот путь. 106 | 107 | ### Что делать, если непонятна теория 108 | 1. Если подобный вопрос разбирался на лекции, посмотрите ещё раз раздел с этой темой в видеозаписи. 109 | 1. Если вопрос не решился, попробуйте поискать ответ самостоятельно в интернете, этот навык пригодится вам в работе. 110 | 1. Если самостоятельно разобраться не удалось, задайте вопрос в общем чате, мы обязательно поможем. 111 | 112 | ### Что делать, если непонятно условие задания 113 | 1. Прежде чем задать вопрос по условию задачи, перечитайте его ещё раз и убедитесь, что в тексте условия нет прямого ответа на этот вопрос. Умение работать с текстом — важный навык работы с информацией. 114 | 1. Если ответа на свой вопрос в тексте условия не увидели, задайте его в общем чате, мы раскроем детали условия. 115 | 116 | ### Что делать, если не получается задача 117 | Если ваша проблема — это **ошибка компиляции** — подчёркивает красным, не даёт запустить программу, сборки проекта, CI и прочие подобные ошибки, то: 118 | 1. Найдите и прочитайте текст ошибки, который вам подсвечивает идея или логи. «Подчёркивает красным» — это не описание ошибки. 119 | 1. Попробуйте понять текст ошибки, при необходимости воспользуйтесь переводчиком. Не страшно, если вы переведёте неточно, тут главное — сам процесс: со временем и с нашей помощью вы будете это делать лучше и лучше, но, пропуская этот этап, вы не сможете научиться это делать. 120 | 1. Если не получилось понять ошибку по её тексту, попробуйте её загуглить и изучить подобную ошибку у других людей. Попробуйте примерить решения их проблем на свой код. Соотнесите найденные описания ошибки с пройденной теорией. 121 | 1. Если всё равно ваши трудности не разрешились, напишите в общий чат, обязательно указав: 122 | 1. название задачи и ссылку на условие; 123 | 1. ссылку на вашу работу; 124 | 1. текст и скриншот, не фотографию, ошибки; 125 | 1. ваши размышления и описание шагов, которые вы совершили для решения. 126 | 127 | Если ваша проблема — это **ошибка исполнения**, программа умирает уже после запуска, или она **отрабатывает неправильно**, из-за чего ваши тесты не проходят, то: 128 | 1. Воспользуйтесь отладчиком для пошагового анализа работы вашей программы. Так вы или убедитесь в неправильности придуманного вами алгоритма, или найдёте конкретное место, где ожидаемое поведение программы разошлось с фактическим. 129 | 1. Если проблему найти не получилось, напишите в общий чат, обязательно указав: 130 | 1. название задачи и ссылку на условие; 131 | 1. ссылку на вашу работу; 132 | 1. конкретное и подробное описание проблемы или затруднения при решении задачи. «Помогите, что-то не так» — это не описание; 133 | 1. подробное описание вашего анализа программы с помощью отладчика вместе со скринами; 134 | 1. ваши размышления и описание шагов, которые вы совершили для решения. 135 | --- 136 | 137 |
138 | 139 |
140 | 4. Отформатирован код 141 | 142 | Кроме правил, нарушение которых приводит к ошибкам компиляции, есть ещё и [правила форматирования кода](https://google.github.io/styleguide/javaguide.html), соблюдение которых обязательно при написании программ. 143 | 144 | С большинством проблем может справиться автоформатирование в идее. Для этого выберите `Code -> Reformat code` в меню или используйте горячие сочетания клавиш. В меню будет показано актуальное сочетание для вашей операционной системы. Так, идея поправит неправильные отступы, пробелы и некоторые другие ошибки. Следите, чтобы у `if-else`, `for`, `while` всегда были `{}`. 145 | 146 | Проблемы с именованием сущностей нужно решать самим. Так, все ячейки, кроме `final`-констант, и методы должны писаться [камелкейсом](https://ru.wikipedia.org/wiki/CamelCase) с **маленькой** буквы, а классы и интерфейсы — камелкейсом с **большой** буквы. 147 | 148 | Мы вам настоятельно советуем всегда держать код в отформатированном виде во время разработки, со временем глаз привыкнет, и вы почувствуете, насколько это облегчает поиск ошибок в коде и его анализ. В любом случае перед отправкой кода на проверку его обязательно нужно отформатировать, иначе он может быть отправлен на доработку без более глубокой проверки на этой итерации. 149 |
150 | 151 | # Задание 1. API (обязательное к выполнению) 152 | 153 | Вспомните [условие задачи](https://github.com/netology-code/iqa-homeworks/tree/iqa-12/2.4#%D0%B7%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-2) из курса по ручному тестированию, где вы общались с сервером. Тогда на сервер вы посылали информацию в виде JSON — текстового формата описания объекта в JavaScript-стиле, выглядела она так: 154 | ```json 155 | { 156 | "birthday": "13.06.1999", 157 | "name": "Иван", 158 | "passport": "4444 № 44444444", 159 | "patronymic": "Иванович", 160 | "phone": "+7 (999)-999-99-99", 161 | "surname": "Иванов" 162 | } 163 | ``` 164 | 165 | Немного усложним и добавим в неё ещё информацию о том, согласен ли пользователь получать новости о скидках в виде sms: `"subscription": true`. Также предлагается, чтобы дата рождения была не полем-строкой, а тоже объектом: `"birthday": {"day" : 13, "month": 6, "year": 1999}`. В итоге объект в запросе будет выглядеть, например, так: 166 | 167 | ```json 168 | { 169 | "birthday": { 170 | "day": 13, 171 | "month": 6, 172 | "year": 1999 173 | }, 174 | "name": "Иван", 175 | "passport": "4444 № 44444444", 176 | "patronymic": "Иванович", 177 | "phone": "+7 (999)-999-99-99", 178 | "surname": "Иванов", 179 | "subscription": true 180 | } 181 | ``` 182 | 183 | Вашей задачей будет разработать классы, описывающие объекты запроса анкеты на сервер, и продемонстрировать их работу в `Main`. 184 | 185 | Создайте класс `Post`, описывающий объект запроса на сервер, и заполните его полями. Сперва можно без `birthday`, так как для него придётся создавать вспомогательный класс, выбрав подходящие типы: 186 | ```java 187 | public class Post { 188 | public String name; // поле для имени 189 | // добавьте другие поля 190 | } 191 | ``` 192 | 193 | Создадим класс `Main`, в `main` которого создадим и заполним наш объект: 194 | ```java 195 | public class Main { 196 | public static void main(String[] args) { 197 | Post post = new Post(); 198 | post.name = "Иван"; 199 | // заполните другие поля 200 | } 201 | } 202 | ``` 203 | 204 | Поставим точку останова на последней строчке, можно прямо на закрывающей фигурной скобке `main`, и запустим отладчик, чтобы посмотреть, что у нас будет лежать в переменной с объектом: 205 | ![My First Board - Frame 14](https://user-images.githubusercontent.com/53707586/151747800-bbd79552-0f62-4105-90fa-b0d7df7dbce6.jpg) 206 | 207 | 208 | Если вы сделали всё правильно, то в отладчике будет виден созданный и заполненный объект типа `Post` по схеме данных — полей — указанных вами в классе `Post`. 209 | 210 | Осталось добавить поле `birthday`. Значение в этом поле должно быть объектом, для которого также нужно будет создать свой класс. Создайте класс `FormDate` для описания схемы объекта в поле `birthday`: 211 | ```java 212 | public class FormDate { 213 | // добавьте три необходимых поля 214 | } 215 | ``` 216 | 217 | Теперь в классе `Post` добавьте поле `birthday` с типом `FormDate`. После чего добавьте заполнение этого поля в `main`: 218 | ```java 219 | post.birthday = new FormDate(); 220 | post.birthday.day = 13; 221 | // заполните другие поля даты рождения 222 | ``` 223 | 224 | Запустите отладчик снова и убедитесь, что всё заполнено как надо и соответствует JSON-описанию объекта выше. 225 | 226 | ### Результат 227 | При отправке решения в личном кабинете прикрепите ссылку на ваш публичный репозиторий GitHub. 228 | -------------------------------------------------------------------------------- /PRIMITIVES.md: -------------------------------------------------------------------------------- 1 | # Домашнее задание к занятию «Примитивные типы данных и условные операторы» 2 | 3 | ## Инструкция к выполнению домашнего задания 4 | 5 | Перед тем как отправить своё решение на проверку преподавателю, сверьтесь с чеклистом. 6 | 7 |
8 | 1. В решении выполнены все требования задания 9 | 10 | Убедитесь, что все требования задания выполнены. Для этого перед отправкой внимательно прочтите весь текст условия задания и соотнесите сказанное в нём с вашим решением. Навык самопроверки работы перед ревью пригодится вам как при обучении, так и на работе. 11 | 12 | --- 13 | 14 |
15 | 16 |
17 | 2. Проект и репозиторий настроены правильно 18 | 19 | Репозиторий должен быть папкой вашего idea-проекта. Обратите внимание, что репозиторием не должна быть папка, в которой лежит папка проекта, он сам должен быть папкой проекта. В нём должны быть соответствующие файлы и папки — `src` и другие. 20 | 21 | Не забудьте создать .gitignore-файл в корне проекта и добавить туда в игнорирование автогенерируемую папку `out` и папку настроек идеи `.idea`. 22 | 23 | --- 24 |
25 | 26 |
27 | 3. Что делать, если возникли сложности :new: 28 | 29 | Это здорово. Если их преодолевать правильно, то можно получить большую образовательную пользу для себя. Периодическое возникновение вопросов, недопонимание пройденного материала — нормальная и неотъемлемая часть обучения. А мы здесь, чтобы помочь вам пройти этот путь. 30 | 31 | ### Что делать, если непонятна теория 32 | 1. Если подобный вопрос разбирался на лекции, посмотрите ещё раз раздел с этой темой в видеозаписи. 33 | 1. Если вопрос не решился, попробуйте поискать ответ самостоятельно в интернете, этот навык пригодится вам в работе. 34 | 1. Если самостоятельно разобраться не удалось, задайте вопрос в общем чате, мы обязательно поможем. 35 | 36 | ### Что делать, если непонятно условие задания 37 | 1. Прежде чем задать вопрос по условию задачи, перечитайте его ещё раз и убедитесь, что в тексте условия нет прямого ответа на этот вопрос. Умение работать с текстом — важный навык работы с информацией. 38 | 1. Если ответа на свой вопрос в тексте условия не увидели, задайте его в общем чате, мы раскроем детали условия. 39 | 40 | ### Что делать, если не получается задача 41 | Если ваша проблема — это **ошибка компиляции** — подчёркивает красным, не даёт запустить программу, сборки проекта, CI и прочие подобные ошибки, то: 42 | 1. Найдите и прочитайте текст ошибки, который вам подсвечивает идея или логи. «Подчёркивает красным» — это не описание ошибки. 43 | 1. Попробуйте понять текст ошибки, при необходимости воспользуйтесь переводчиком. Не страшно, если вы переведёте неточно, тут главное — сам процесс: со временем и с нашей помощью вы будете это делать лучше и лучше, но, пропуская этот этап, вы не сможете научиться это делать. 44 | 1. Если не получилось понять ошибку по её тексту, попробуйте её загуглить и изучить подобную ошибку у других людей. Попробуйте примерить решения их проблем на свой код. Соотнесите найденные описания ошибки с пройденной теорией. 45 | 1. Если всё равно ваши трудности не разрешились, напишите в общий чат, обязательно указав: 46 | 1. название задачи и ссылку на условие; 47 | 1. ссылку на вашу работу; 48 | 1. текст и скриншот, не фотографию, ошибки; 49 | 1. ваши размышления и описание шагов, которые вы совершили для решения. 50 | 51 | Если ваша проблема — это **ошибка исполнения**, программа умирает уже после запуска, или она **отрабатывает неправильно**, из-за чего ваши тесты не проходят, то: 52 | 1. Воспользуйтесь отладчиком для пошагового анализа работы вашей программы. Так вы или убедитесь в неправильности придуманного вами алгоритма, или найдёте конкретное место, где ожидаемое поведение программы разошлось с фактическим. 53 | 1. Если проблему найти не получилось, напишите в общий чат, обязательно указав: 54 | 1. название задачи и ссылку на условие; 55 | 1. ссылку на вашу работу; 56 | 1. конкретное и подробное описание проблемы или затруднения при решении задачи. «Помогите, что-то не так» — это не описание; 57 | 1. подробное описание вашего анализа программы с помощью отладчика вместе со скринами; 58 | 1. ваши размышления и описание шагов, которые вы совершили для решения. 59 | --- 60 | 61 |
62 | 63 | 64 |
65 | 4. Отформатирован код :new: 66 | 67 | Кроме правил, нарушение которых приводит к ошибкам компиляции, есть ещё и [правила форматирования кода](https://google.github.io/styleguide/javaguide.html), соблюдение которых обязательно при написании программ. 68 | 69 | С большинством проблем может справиться автоформатирование в идее. Для этого выберите `Code -> Reformat code` в меню или используйте горячие сочетания клавиш. В меню будет показано актуальное сочетание для вашей операционной системы. Так, идея поправит неправильные отступы, пробелы и некоторые другие ошибки. Следите, чтобы у `if-else`, `for`, `while` всегда были `{}`. 70 | 71 | Проблемы с именованием сущностей нужно решать самим. Так, все ячейки, кроме `final`-констант, и методы должны писаться [камелкейсом](https://ru.wikipedia.org/wiki/CamelCase) с **маленькой** буквы, а классы и интерфейсы — камелкейсом с **большой** буквы. 72 | 73 | Мы вам настоятельно советуем всегда держать код в отформатированном виде во время разработки, со временем глаз привыкнет, и вы почувствуете, насколько это облегчает поиск ошибок в коде и его анализ. В любом случае перед отправкой кода на проверку его обязательно нужно отформатировать, иначе он может быть отправлен на доработку без более глубокой проверки на этой итерации. 74 |
75 | 76 | ## Задание 1. Мили (обязательное к выполнению) 77 | 78 | #### Условие 79 | 80 | Авиаперевозчики предлагают различные бонусные программы, начисляющие бесплатные мили за перелёты. 81 | Формула расчёта следующая: за каждые 20 рублей, потраченные на билет, начисляется 1 миля. Дробные мили не начисляются. 82 | 83 | #### Ваша задача 84 | 85 | Создать приложение, рассчитывающее количество начисленных миль за купленный билет. 86 | Стоимость билета вы выбираете сами — сами заполняете переменную, в которой она будет храниться. 87 | 88 | #### Пример схемы кода вашего приложения: 89 | 90 | ```java 91 | public class Main { 92 | public static void main(String[] args) { 93 | 94 | // Объявляете переменные для входных данных и 95 | // параметров программы: одну для хранения 96 | // стоимости билета, другую для хранения количества 97 | // рублей для одной бонусной мили 98 | 99 | // Рассчитываете количество бонусных миль, используя 100 | // значения заведённых переменных. Ответ сохраняете в 101 | // новую переменную и выводите на экран 102 | } 103 | } 104 | ``` 105 | 106 | #### Результат 107 | На проверку отправьте ссылку на ваш публичный репозиторий GitHub с решением. 108 | 109 | 110 | ## Задание 2. «Получи рубль за каждые 100» (обязательное к выполнению) 111 | 112 | #### Условие 113 | Один из сотовых операторов решил сделать своим клиентам приятный бонус: если клиент пополняет счёт более чем на 1000 рублей, то сотовый оператор дарит ему по 1 рублю за каждые полные 100 рублей пополнения. 114 | 115 | Примеры. Начальные данные: у клиента на счету 100 рублей. 116 | 1. Клиент пополнил счёт на 100 рублей — бонусов нет, итоговая сумма на счету клиента — 200 рублей. 117 | 2. Клиент пополнил счёт на 1100 рублей — бонус равен 11 рублям, итоговая сумма на счету клиента — 1211 рублей. 118 | 119 | #### Ваша задача 120 | Создать приложение, выводящее итоговый счёт и количество бонусных рублей. 121 | Количество денег на текущем счету клиента и сумму пополнения вы выбираете сами — сами создайте переменные, в которых эти данные будут храниться. 122 | 123 | Приложение должно быть написано так, чтобы при замене значений переменных— начальной суммы счёта и суммы пополнения — итоговый счёт и бонусные рубли рассчитывались правильно. 124 | 125 | #### Пример схемы кода вашего приложения: 126 | 127 | ```java 128 | public class Main { 129 | public static void main(String[] args) { 130 | 131 | // Объявляете переменные для входных данных и 132 | // параметров программы: начального счёта, 133 | // суммы пополнения и тп 134 | 135 | // Условным оператором проверяете, превысила ли 136 | // сумма пополнения порог, и для этих двух разных 137 | // сценариев рассчитываете сумму бонуса и выводите 138 | // на экран. 139 | } 140 | } 141 | ``` 142 | #### Результат 143 | На проверку отправьте ссылку на ваш публичный репозиторий GitHub с решением. 144 | 145 | Каждое задание выполняйте в отдельном репозитории. 146 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Домашние задания по курсу "Java для тестировщиков" 2 | 3 | В этом репозитории расположены ваши домашние задания к каждой лекции. 4 | 5 | Обязательными к выполнению являются задачи без указания звездочки. Их выполнение необходимо для получения зачета и диплома о профессиональной переподготовке. 6 | 7 | Задачи со звездочкой (*) являются дополнительными задачами и/или задачами повышенной сложности. Они не являются обязательными к выполнению, но помогут вам глубже понять тему. 8 | 9 | Любые вопросы по решению задач задавайте в чате курса. 10 | 11 | ## Блок 1. Введение в Java 12 | 13 | 1.1. Программирование в тестировании 14 | 15 | 1.2. [Введение в Java](/JAVA_INTRO.md) 16 | 17 | 18 | ## Блок 2. Основы Java, Автотесты и CI 19 | 20 | 2.1. [Примитивные типы данных и условные операторы](/PRIMITIVES.md) 21 | 22 | 2.2. [Testability, авто-тесты, введение в ООП: объекты и методы](/TESTABILITY.md) 23 | 24 | 2.3. [Система сборки Maven, управление зависимостями, авто-тесты на JUnit5](/MAVEN.md) 25 | 26 | 2.4. [Пакеты и циклы](/CYCLES1.md) 27 | 28 | 2.5. [Строки и массивы](CYCLES2.md) 29 | 30 | 2.6. [Выстраивание процесса непрерывной интеграции (CI): Github Actions. Покрытие кода с JaCoCo, статический анализ кода: CheckStyle, SpotBugs](CICD.md) 31 | 32 | 33 | ## Блок 3. Объектно-ориентированное программирование 34 | 35 | 3.1. [Объектно-ориентированное программирование: ключевые принципы](OOP_PRINCIPLES.md) 36 | 37 | 3.2. [Объектно-ориентированное программирование и проектирование](OOP1.md) 38 | 39 | 3.3. [Объекты с внутренним состоянием, управление состоянием при тестировании](OOP_CONST.md) 40 | 41 | 3.4. [Композиция и зависимость объектов. Mockito при создании авто-тестов](MOCKITO.md) 42 | 43 | 44 | ## Блок 4. Исключения, Интерфейсы, Generics и Collections Framework 45 | 46 | 4.1. [Наследование и расширяемость систем. Проблемы наследования](INH.md) 47 | 48 | 4.2. [Исключительные ситуации и их обработка. Тестирование исключений](EXC.md) 49 | 50 | 4.3. [Интерфейсы для организации малой связности. Обобщённое программирование (Generics)](GENERICS.md) 51 | 52 | 4.4. [Collections Framework. CRUD и тестирование систем, управляющих набором объектов](COLLECTIONS.md) 53 | -------------------------------------------------------------------------------- /TESTABILITY.md: -------------------------------------------------------------------------------- 1 | # Домашнее задание к занятию «Testability, автотесты, введение в ООП: объекты и методы» 2 | 3 | ## Инструкция к выполнению домашнего задания 4 | 5 | Перед тем как отправить своё решение на проверку преподавателю, сверьтесь с чеклистом. 6 | 7 |
8 | 1. В решении выполнены все требования задания 9 | 10 | Убедитесь, что все требования задания выполнены. Для этого перед отправкой внимательно прочтите весь текст условия задания и соотнесите сказанное в нём с вашим решением. Навык самопроверки работы перед ревью пригодится вам как при обучении, так и на работе. 11 | 12 | --- 13 | 14 |
15 | 16 |
17 | 2. Проект и репозиторий настроены правильно 18 | 19 | Репозиторий должен быть папкой вашего idea-проекта. Обратите внимание, что репозиторием не должна быть папка, в которой лежит папка проекта, он сам должен быть папкой проекта. В нём должны быть соответствующие файлы и папки — `src` и другие. 20 | 21 | Не забудьте создать .gitignore-файл в корне проекта и добавить туда в игнорирование автогенерируемую папку `out` и папку настроек идеи `.idea`. 22 | 23 | --- 24 |
25 | 26 |
27 | 3. Что делать, если возникли сложности :new: 28 | 29 | Это здорово. Если их преодолевать правильно, то можно получить большую образовательную пользу для себя. Периодическое возникновение вопросов, недопонимание пройденного материала — нормальная и неотъемлемая часть обучения. А мы здесь, чтобы помочь вам пройти этот путь. 30 | 31 | ### Что делать, если непонятна теория 32 | 1. Если подобный вопрос разбирался на лекции, посмотрите ещё раз раздел с этой темой в видеозаписи. 33 | 1. Если вопрос не решился, попробуйте поискать ответ самостоятельно в интернете, этот навык пригодится вам в работе. 34 | 1. Если самостоятельно разобраться не удалось, задайте вопрос в общем чате, мы обязательно поможем. 35 | 36 | ### Что делать, если непонятно условие задания 37 | 1. Прежде чем задать вопрос по условию задачи, перечитайте его ещё раз и убедитесь, что в тексте условия нет прямого ответа на этот вопрос. Умение работать с текстом — важный навык работы с информацией. 38 | 1. Если ответа на свой вопрос в тексте условия не увидели, задайте его в общем чате, мы раскроем детали условия. 39 | 40 | ### Что делать, если не получается задача 41 | Если ваша проблема — это **ошибка компиляции** — подчёркивает красным, не даёт запустить программу, сборки проекта, CI и прочие подобные ошибки, то: 42 | 1. Найдите и прочитайте текст ошибки, который вам подсвечивает идея или логи. «Подчёркивает красным» — это не описание ошибки. 43 | 1. Попробуйте понять текст ошибки, при необходимости воспользуйтесь переводчиком. Не страшно, если вы переведёте неточно, тут главное — сам процесс: со временем и с нашей помощью вы будете это делать лучше и лучше, но, пропуская этот этап, вы не сможете научиться это делать. 44 | 1. Если не получилось понять ошибку по её тексту, попробуйте её загуглить и изучить подобную ошибку у других людей. Попробуйте примерить решения их проблем на свой код. Соотнесите найденные описания ошибки с пройденной теорией. 45 | 1. Если всё равно ваши трудности не разрешились, напишите в общий чат, обязательно указав: 46 | 1. название задачи и ссылку на условие; 47 | 1. ссылку на вашу работу; 48 | 1. текст и скриншот, не фотографию, ошибки; 49 | 1. ваши размышления и описание шагов, которые вы совершили для решения. 50 | 51 | Если ваша проблема — это **ошибка исполнения**, программа умирает уже после запуска, или она **отрабатывает неправильно**, из-за чего ваши тесты не проходят, то: 52 | 1. Воспользуйтесь отладчиком для пошагового анализа работы вашей программы. Так вы или убедитесь в неправильности придуманного вами алгоритма, или найдёте конкретное место, где ожидаемое поведение программы разошлось с фактическим. 53 | 1. Если проблему найти не получилось, напишите в общий чат, обязательно указав: 54 | 1. название задачи и ссылку на условие; 55 | 1. ссылку на вашу работу; 56 | 1. конкретное и подробное описание проблемы или затруднения при решении задачи. «Помогите, что-то не так» — это не описание; 57 | 1. подробное описание вашего анализа программы с помощью отладчика вместе со скринами; 58 | 1. ваши размышления и описание шагов, которые вы совершили для решения. 59 | --- 60 | 61 |
62 | 63 | 64 |
65 | 4. Отформатирован код :new: 66 | 67 | Кроме правил, нарушение которых приводит к ошибкам компиляции, есть ещё и [правила форматирования кода](https://google.github.io/styleguide/javaguide.html), соблюдение которых обязательно при написании программ. 68 | 69 | С большинством проблем может справиться автоформатирование в идее. Для этого выберите `Code -> Reformat code` в меню или используйте горячие сочетания клавиш. В меню будет показано актуальное сочетание для вашей операционной системы. Так, идея поправит неправильные отступы, пробелы и некоторые другие ошибки. Следите, чтобы у `if-else`, `for`, `while` всегда были `{}`. 70 | 71 | Проблемы с именованием сущностей нужно решать самим. Так, все ячейки, кроме `final`-констант, и методы должны писаться [камелкейсом](https://ru.wikipedia.org/wiki/CamelCase) с **маленькой** буквы, а классы и интерфейсы — камелкейсом с **большой** буквы. 72 | 73 | Мы вам настоятельно советуем всегда держать код в отформатированном виде во время разработки, со временем глаз привыкнет, и вы почувствуете, насколько это облегчает поиск ошибок в коде и его анализ. В любом случае перед отправкой кода на проверку его обязательно нужно отформатировать, иначе он может быть отправлен на доработку без более глубокой проверки на этой итерации. 74 |
75 | 76 | ## Задание 1. Мили — модернизация (обязательное к выполнению) 77 | 78 | Вы уже научились создавать классы и методы. Поэтому вам необходимо модернизировать [приложение для расчёта миль](./PRIMITIVES.md). Теперь сама логика расчёта будет находиться в специально выделенном классе сервиса, а в Main мы будем лишь создавать объект этого сервиса и вызывать его метод, передавая аргументами все необходимые данные для расчёта. Получив от вызова метода рассчитанный результат, мы выведем его на экран. 79 | 80 | #### Этапы выполнения 81 | 1. Создайте класс `BonusMilesService` (`File -> New -> Java Class`, вводите название и нажимаете `Enter`). 82 | 1. Определите в нём метод `calculate`, который: 83 | 1. принимает на вход один параметр: `cost` типа `int`; 84 | 1. анализируя значение переданного параметра, возвращает рассчитанное количество миль (тип — `int`). 85 | 86 | Разместите следующий код в классе `Main`: 87 | 88 | ```java 89 | public class Main { 90 | public static void main(String[] args) { 91 | BonusMilesService service = new BonusMilesService(); 92 | int price = 10_000; 93 | int miles = service.calculate(price); 94 | System.out.println(miles); 95 | } 96 | } 97 | ``` 98 | 99 | Убедитесь, что выводимое в консоль значение соответствует результатам предыдущей версии приложения. 100 | 101 | #### Результат 102 | На проверку отправьте ссылку на ваш публичный репозиторий GitHub с решением. 103 | 104 | ## Задание 2*. Индекс массы тела (необязательная задача) 105 | 106 | Вы решили написать сервис, который рассчитывает индекс массы тела (body mass index). 107 | 108 | #### Этапы выполнения 109 | 1. Самостоятельно собрать информацию о том, какие входные данные нужны для расчёта, вы же умеете гуглить 😉 110 | 1. Создать класс `BmiService` с методом `calculate`. Помните, что вы считаете индекс, а не выдаёте диагноз. 111 | 1. Продемонстрировать в `Main` по аналогии с первой задачей: 112 | 1. создание объекта, 113 | 1. вызов метода `calculate`, 114 | 1. печать в консоль результата, 115 | 116 | #### Результат 117 | На проверку отправьте ссылку на ваш публичный репозиторий GitHub с решением. 118 | 119 | ## Задание 3*. Кредитный калькулятор (необязательная задача повышенной сложности) 120 | 121 | Вам поручили написать кредитный калькулятор, который считает как на сайте. Но формулы, естественно, не дали. 122 | 123 | Вам нужно провести небольшой анализ и написать свой `CreditPaymentService`, который умеет рассчитывать ежемесячный платёж (см. аннуитетный платёж). 124 | 125 | Параметры, их количество, типы, а также формулу вам необходимо определить исходя из скриншотов ниже. 126 | 127 | Обратите внимание: на тех же данных ваш сервис должен считать так же. 128 | 129 | Чтобы это продемонстрировать, в `Main` создайте объект и три раза вызовите его метод `calculate`. Результаты каждого вызова выводите в консоль. 130 | 131 | Скриншоты для решения задачи. Важно: это не реальный сервис. 132 | 133 | ![image](https://user-images.githubusercontent.com/53707586/145564347-174ef746-013e-4793-bda1-79d81ac18e65.png) 134 | ![image](https://user-images.githubusercontent.com/53707586/145564368-0c1aaa9c-563b-4177-9ad6-a9f9adef8f92.png) 135 | ![image](https://user-images.githubusercontent.com/53707586/145564380-5140f2ab-312c-46c1-b423-1e5c209617b5.png) 136 | 137 | #### Результат 138 | На проверку отправьте ссылку на ваш публичный репозиторий GitHub с решением. 139 | 140 | Каждое задание выполняйте в отдельном репозитории. 141 | -------------------------------------------------------------------------------- /_CHECKLIST.md: -------------------------------------------------------------------------------- 1 | # Чеклист перед отправкой 2 |
3 | :grey_question: Возникли трудности? 4 | 5 | И это здорово! Если их преодолевать правильно, то из этого можно извлечь большую образовательную пользу для себя. Периодическое возникновение вопросов, недопонимания пройденного материала - нормальная и неотъемлимая часть обучения. А мы здесь чтобы помочь вам пройти этот путь. 6 | 7 | ### Если непонятна теория 8 | 1. Если вопрос разбирался на лекции, стоит сперва пересмотреть соответствующие части теоретических материалов. 9 | 1. Если вопрос не решился, стоит попробовать загуглить проблему, этот навык вам пригодится в работе. 10 | 1. Если вопрос не решился, можно задать его в общем чате, мы обязательно поможем с пониманием трудных для вас мест. 11 | 12 | ### Если непонятно условие 13 | 1. Прежде чем задать вопрос по условию задачи, перечитайте его ещё раз и убедитесь, что в тексте условия нет прямого ответа на этот вопрос; умение работать с текстом - важный навык работы с информацией. 14 | 1. Если ответа на свой вопрос в тексте условия вы не увидели, задайте его в общем чате, мы раскроем детали условия подробнее. 15 | 16 | ### Если не получается задача 17 | Если ваша проблема это **ошибка компиляции** (подчёркивает красным, не даёт запустить программу), сборки проекта, CI и прочие подобные ошибки, то: 18 | 1. Найдите и прочитайте текст ошибки, который вам подсвечивает идея (или логи); "подчёркивает красным" - это не описание ошибки. 19 | 1. Попробуйте понять текст ошибки, при необходимости воспользуйтесь переводчиком. Не страшно, если вы переведёте неточно, тут главное сам процесс - со временем и с нашей помощью вы будете это делать лучше и лучше, но пропуская эти попытки вы не сможете научиться этого делать. 20 | 1. Если не получилось понять ошибку по её тексту, попробуйте её загуглить и изучить подобную ошибку у других людей. Попробуйте примерить решения их проблем на свой код. Соотнесите найденные описания ошибки с пройденной теорией. 21 | 1. Если в итоге ваше затруднение сохраняется, напишите в общий чат, обязательно указав: 22 | 1. Название задачи и ссылку на условие 23 | 1. Ссылку на вашу работу 24 | 1. Текст и скриншот (не фотография) ошибки 25 | 1. Ваши мысли и описание попыток её решить 26 | 27 | Если ваша проблема это **ошибка исполнения** (программа умирает уже после запуска) или она **отрабатывает неправильно** (из-за чего ваши тесты не проходят), то: 28 | 1. Воспользуйтесь отладчиком для пошагового анализа работы вашей программы. Так вы либо убедитесь в неправильности придуманного вами алгоритма или найдёте конкретное место, где ожидаемое поведение программы разошлось с фактическим. 29 | 1. Если проблему найти не получилось, напишите в общий чат, обязательно указав: 30 | 1. Название задачи и ссылку на условие 31 | 1. Ссылку на вашу работу 32 | 1. Конкретное и подробное описание проблемы или затруднения при решении задачи ("Помогите что не так" - это не описание) 33 | 1. Подробное описание вашего анализа программы с помощью отладчика вместе со скринами 34 | 1. Ваши мысли и описание попыток её решить 35 | --- 36 | 37 |
38 | 39 |
40 | :muscle: Выполнены все требования задачи 41 | 42 | Убедитесь, что все требования задания выполнены. Для этого перед отправкой внимательно пройдитесь по всему тексту условия и соотнесите сказанное в нём с вашим решением. Навык самопроверки работы перед ревью очень пригодится вам как при обучении, так и на работе. 43 | 44 | --- 45 | 46 |
47 | 48 |
49 | :straight_ruler: Отформатирован код 50 | 51 | Кроме правил, нарушение которых приводит к ошибкам компиляции, есть ещё и [правила форматирования кода](https://google.github.io/styleguide/javaguide.html), соблюдение которых обязательно при напиании программ. 52 | 53 | С большинством проблем может справиться автоформатирование в идее. Для этого выберите `Code -> Reformat code` в меню или используйте горячие сочетания клавиш (в меню будет показано актуальное сочетание для вашей операционной системы). Так, идея поправит неправильные отступы, пробелы и некоторые другие ошибки. Следите, чтобы у `if-else`, `for`, `while` всегда были `{}`. 54 | 55 | Проблемы с именованием сущностей нужно решать самим. Так, все ячейки кроме `final`-констант и методы должны писаться с маленькой буквы [камелкейсом](https://ru.wikipedia.org/wiki/CamelCase) с **маленькой** буквы, а классы и интерфейсы - камелкейсом с **большой** буквы. 56 | 57 | Мы вам настоятельно советуем всегда держать код в отформатированном виде во время разработки, со временем глаз привыкнет и вы почувствуете насколько это облегчает поиск ошибок в коде и его анализ. В любом случае, перед отправкой кода на проверку его обязательно нужно отформатировать, иначе он может быть отправлен на доработку без более глубокой проверки на этой итерации. 58 |
59 | 60 |
61 | :package: Правильно настроен Maven-проект, тесты проходят 62 | 63 | Репозиторий должен быть папкой вашего мавен-проекта. Обратите внимание, что репозиторием не должна быть папка в которой лежит папка мавен-проекта, он сам должен быть папкой проекта. В нём должны быть соответствующие файлы и папки - `pom.xml`, `src` и др. 64 | 65 | Не забудьте создать .gitignore-файл в корне проекта и добавить туда в игнорирование автогенерируемую папку `target`. 66 | 67 | Общая схема вашего `pom.xml`-файла: 68 | 69 | ```xml 70 | 71 | 74 | 4.0.0 75 | 76 | ru.netology 77 | НАЗВАНИЕ-ВАШЕГО-ПРОЕКТА-БЕЗ-ПРОБЕЛОВ 78 | 1.0-SNAPSHOT 79 | 80 | 81 | 11 82 | 11 83 | UTF-8 84 | 85 | 86 | 87 | 88 | 89 | ... 90 | 91 | ... 92 | 93 | 94 | 95 | 96 | 97 | 98 | ... 99 | 100 | 101 | 102 | ... 103 | 104 | 105 | ... 106 | 107 | ... 108 | 109 | 110 | ... 111 | 112 | 113 | 114 | 115 | ``` 116 | 117 | #### JUnit 118 | Обратите внимание что у артефакта нет `-api` на конце. Если у вас автоматически добавилась зависимость вида `junit-jupiter-api`, то лучше поменять артефакт на тот что ниже, иначе будут сюрпризы в работе. 119 | 120 | ```xml 121 | 122 | org.junit.jupiter 123 | junit-jupiter 124 | 5.7.0 125 | test 126 | 127 | ``` 128 | 129 | #### Surefire 130 | Без этого плагина тесты могут мавеном не запускаться, хоть в идее через кнопки они и будут проходить. Чтобы лишний раз убедиться, что всё работает, нажмите `Ctrl+Ctrl` и затем `mvn clean test`. 131 | 132 | ```xml 133 | 134 | org.apache.maven.plugins 135 | maven-surefire-plugin 136 | 2.22.2 137 | 138 | true 139 | 140 | 141 | ``` 142 | 143 | --- 144 | 145 |
146 | 147 |
148 | :heavy_check_mark: Настроен Maven CI с verify и JaCoCo :new: 149 | 150 | #### Maven CI 151 | После связывания локального репозитория с удалённым и первого пуша в заготовки проекта, время настроить CI на основе Github Actions. Шаблон вашего maven.yml должен выглядеть вот так, убедитесь что всё совпадает с вашим шаблоном (например, что вы указали фазу `verify`, а не `package`): 152 | ```yml 153 | name: Java CI with Maven 154 | 155 | on: [push, pull_request] 156 | 157 | jobs: 158 | build: 159 | 160 | runs-on: ubuntu-latest 161 | 162 | steps: 163 | - uses: actions/checkout@v2 164 | - name: Set up JDK 11 165 | uses: actions/setup-java@v2 166 | with: 167 | java-version: '11' 168 | distribution: 'adopt' 169 | - name: Build with Maven 170 | run: mvn -B -e verify 171 | ``` 172 | 173 | #### JaCoCo 174 | 175 | ```xml 176 | 177 | org.jacoco 178 | jacoco-maven-plugin 179 | 0.8.5 180 | ... 181 | ``` 182 | 183 | Инициализация: 184 | ```xml 185 | 186 | prepare-agent 187 | 188 | prepare-agent 189 | 190 | 191 | ``` 192 | 193 | В режиме генерации отчётов: 194 | ```xml 195 | 196 | report 197 | verify 198 | 199 | report 200 | 201 | 202 | ``` 203 | 204 | В режиме проверки и обрушения сборки по уровню покрытия: 205 | ```xml 206 | 207 | check 208 | 209 | check 210 | 211 | 212 | 213 | 214 | 215 | 216 | LINE 217 | COVEREDRATIO 218 | 100% 219 | 220 | 221 | 222 | 223 | 224 | 225 | ``` 226 | 227 |
228 | 229 |
230 | :100: Код классов с логикой покрыт на 100% :new: 231 | 232 | Покрытие кода тестами - одна из автоматических метрик качества тестирования. Стоит помнить, что 100% покрытие не гарантирует, что вы сделали качественный тест-дизайн и хорошо протестировали код, но пробелы в покрытии кода могут сигнализировать о недостаточном тестировании. В этом задании мы требуем, чтобы вы покрыли все классы с логикой на 100%. 233 | 234 | Обрушать сборку по покрытию при этом не нужно. Для того чтобы убедиться в 100% покрытии, сгенерируйте JaCoCo-отчёт через запуск `mvn clean verify` и откройте его в браузере; располагаться отчёт будет в папке `target/site/jacoco/index.html`. 235 | 236 | Если вы видите в отчёте не 100%-покрытие, то алгоритм следующий: 237 | 1. Смотрите на тестируемый код, вникаете в логику его работы. 238 | 1. Генерите jacoco-отчёт. 239 | 1. Смотрите какая строчка остаётся непокрытой. 240 | 1. Осознаёте, в каком случае она будет выполняться, а в каком нет (т.е. для какой ситуации эта непокрытая строчка или ветка вообще существует). 241 | 1. Добавляете случай в котором она выполняется в тесты. 242 | 243 | --- 244 | 245 | 246 |
247 | :file_folder: Правильно настроен проект и репозиторий :new: 248 | 249 | Репозиторий должен быть папкой вашего idea-проекта. Обратите внимание, что репозиторием не должна быть папка в которой лежит папка проекта, он сам должен быть папкой проекта. В нём должны быть соответствующие файлы и папки - `src` и др. 250 | 251 | Не забудьте создать .gitignore-файл в корне проекта и добавить туда в игнорирование автогенерируемую папку `out` и папку настроек идеи `.idea`. 252 | 253 | --- 254 |
255 | -------------------------------------------------------------------------------- /files/bonus-service.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netology-code/javaqa-homeworks-video/12cbf2e89f599ceb68840ca2f3b160be11b597c6/files/bonus-service.zip -------------------------------------------------------------------------------- /files/checkstyle.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 55 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 72 | 73 | 74 | 76 | 77 | 78 | 84 | 85 | 86 | 87 | 90 | 91 | 92 | 93 | 94 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 112 | 114 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 161 | 162 | 163 | 164 | 166 | 167 | 168 | 169 | 171 | 172 | 173 | 174 | 176 | 177 | 178 | 179 | 181 | 182 | 183 | 184 | 186 | 187 | 188 | 189 | 191 | 192 | 193 | 194 | 196 | 197 | 198 | 199 | 201 | 202 | 203 | 204 | 206 | 207 | 208 | 209 | 211 | 213 | 215 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 245 | 246 | 247 | 249 | 250 | 251 | 252 | 257 | 258 | 259 | 260 | 263 | 264 | 265 | 266 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 280 | 281 | 282 | 283 | 284 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 318 | 319 | 320 | 321 | -------------------------------------------------------------------------------- /files/javaintro/Main.java: -------------------------------------------------------------------------------- 1 | public class Main { 2 | public static void main(String[] args) { 3 | 4 | int income = 70000; // доход 5 | int spending = 100000; // расход 6 | 7 | int tax = income * 6 / 100; // налог 6% на доходы 8 | int tax2 = (income - spending) * 15 / 100; // налог 15% на разницу доходов и расходов 9 | 10 | System.out.println("Ваш налог на первой системе: " + tax + " рублей"); 11 | System.out.println("Ваш налог на второй системе: " + tax2 + " рублей"); 12 | 13 | } 14 | } 15 | --------------------------------------------------------------------------------