Вспомним один из прошлых уроков:
// Перевод евро в рубли через доллары
var euros = 1000;
var dollars = euros * 1.25; // 1250
var rubles = dollars * 60; // 75000
System.out.println(rubles); // => 75000
С точки зрения профессиональной разработки, такой код «пахнет». Так описывают код, который не соответствует так называемым лучшим практикам (best practices). И причина здесь вот в чем: уже сейчас, глядя на числа 60 и 1.25, вы скорее всего задаетесь вопросом: «что это за числа?».
А представьте, что будет через месяц! А как его поймет новый программист, не видевший код ранее? В нашем примере контекст восстанавливается благодаря грамотному именованию. Но в реальной жизни код значительно сложнее, и поэтому догадаться до смысла чисел зачастую невозможно.
Этот эффект вызывают магические числа (magic numbers) — числа, происхождение которых невозможно понять без глубокого знания происходящего внутри участка кода.
Выход из ситуации прост: достаточно создать переменные с правильными именами, как все встанет на свои места:
var dollarsInEuro = 1.25;
var roublesInDollar = 60;
var euros = 1000;
var dollars = euros * dollarsInEuro; // 1250
var rubles = dollars * roublesInDollar; // 75000
System.out.println(rubles); // => 75000
Обратите внимание на следующие детали:
Вы столкнулись с таким кодом, который выводит на экран общее количество комнат во владении нынешнего короля:
var king = "King Balon the 6th";
System.out.println(king + " has " + (6 * 17) + " rooms.");
Как видите, это магические числа: непонятно, что такое 6 и что такое 17. Можно догадаться, если знать историю королевской семьи: каждый новый король получает в наследство все замки от предков и строит новый замок — точную копию родительского.
Эта странная династия просто плодит одинаковые замки…
Избавьтесь от магических чисел, создав новые переменные, а затем выведите текст на экран.
Получится так:
King Balon the 6th has 102 rooms.
Названия переменных должны передавать смысл чисел, но должны при этом оставаться достаточно короткими и ёмкими для комфортного чтения.
Помните: код будет работать с любыми названиями, а наша система всегда проверяет только результат на экране, поэтому выполнение этого задания — под вашу ответственность.
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Ваше упражнение проверяется по этим тестам
1import java.io.ByteArrayOutputStream;
2import java.io.FileDescriptor;
3import java.io.FileOutputStream;
4import java.io.PrintStream;
5
6import static org.assertj.core.api.Assertions.assertThat;
7
8class Test {
9 public static void main(String[] args) {
10 final var expected = "King Balon the 6th has 102 rooms.";
11
12 ByteArrayOutputStream out = new ByteArrayOutputStream();
13 System.setOut(new PrintStream(out));
14
15 App.main(null);
16
17 final var actual = out.toString().trim();
18
19 System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));
20 System.out.println(actual);
21
22 assertThat(actual).isEqualTo(expected);
23 }
24}
25
Решение учителя откроется через: