├── 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 | 
206 |
207 | Быстро это сделать можно вот так: `Alt + Insert` на каталоге `test` выбираете `New File` и дальше вводите имя файла вместе с именем каталога:
208 |
209 | 
210 |
211 | IDEA сама за вас создаст и каталог, и файл.
212 |
213 | После чего в боковой панельке следует сделать reimport Maven-проекта:
214 |
215 | 
216 |
217 | И IDEA поставит вам красивую иконочку на ресурсы для тестов:
218 |
219 | 
220 |
221 | Сам файл вы можете редактировать прямо в IDEA, это обычный текстовый файл, но подчиняющийся правилам CSV.
222 |
223 | При этом обратите внимание, что кодировка файла UTF8:
224 |
225 | 
226 |
227 | Если это не так, кликните на указанном поле и выберите UTF8:
228 |
229 | 
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 | 
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 |
94 |
95 | 4. Создайте класс `Main` с содержимым из кода выше.
96 | 5. Нажмите на кнопку запуска программы. Она должна запуститься, вывести информацию на экран и завершиться.
97 | 6. Закоммитьте и запушьте ваш проект в публичный репозиторий на GitHub.
98 | 7. Проанализируйте код и вывод программы. Найдите в них дефекты. Менять код программы не нужно.
99 | 8. Оформите баг-репорт с помощью GitHub Issues, описывающий найденный дефект по шаблону из примера ниже.
100 |
101 | ### Формат оформления баг-репорта
102 | Наша цель — получить такой баг-репорт:
103 |
104 | 
105 |
106 | Это можно сделать, написав следующее:
107 |
108 | 
109 |
110 | Комментарии к формату:
111 | * И в .md-файлах, и внутри описания баг-репортов используется [формат Markdown](https://www.markdownguide.org/basic-syntax/).
112 | * Исходный код Issue специально вставлен картинкой, чтобы вы вчитывались и перепечатывали, а не копировали.
113 | * Чтобы красиво сослаться на нужное место в коде на GitHub (в нашем случае для отображения локации), откройте этот файл на GitHub, нажмите на номер или номера соответствующей строки, удерживая `Shift`, и рядом слева нажмите на троеточие, в выпавшем меню нажмите `Copy permalink`. В буфер обмена скопируется прямая ссылка на эту строку этого коммита. Теперь вы её можете просто вставить в текст Issue как в шаблоне:
114 |
115 | 
116 |
117 | * Для загрузки изображений вы можете воспользоваться кнопкой, находящейся сразу под полем редактирования текста. Также возможна автозагрузка скриншотов прямо из буфера обмена через `Ctrl+V` с автовставкой в место нахождения курсора:
118 |
119 | 
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 | 
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 | 
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 | 
134 | 
135 | 
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 |
--------------------------------------------------------------------------------