3 плохих фрагмента Java, которые вы должны увидеть
- Чистый код
- Значимые имена
- Тесты
О них все время кричат. Вы знаете, я знаю, и все знают о чистом коде.
А как насчет грязного кода? Вот 3 фрагмента кода с ошибками. Подробно объясняя, почему они важны.
Давайте углубимся.
Как решить четвертую задачу Эйлера?
Вы на собеседовании на должность разработчика Java. Вы получаете задачу по кодированию, которую нужно решить. Оказывается, это 4-я задача Эйлера.
Вот настоящая проблема, которую вам нужно решить.
"Палиндромное число одинаково читается в обоих случаях. Самый большой палиндром, составленный из произведения двух двузначных чисел, равен 9009 = 91 × 99.
Найдите наибольший палиндром, составленный из произведения двух трехзначных чисел. — источник
Вот один неверный подходк этой проблеме.
Это метод грубой силы. Начните с двух циклов, умножьте множители и найдите наибольший.
Циклы содержат создание строк. Нет необходимости использовать StringBuffer или String. Это только добавляет сложности и бессмысленных вычислений.
Вот мой подход.
Начните с 1000, уменьшите множители, найдите правильное решение.
Используйте математику, чтобы избежать сложности пробелов. Переверните число, используя математику, а не строки. Строки внутри цикла вызывают только накладные расходы памяти.
Проверьте раздел комментариев, чтобы найти еще лучшее решение о том, как сократить бесполезные вычисления.
Вы разводите условия?
Если объект является экземпляром X, выполните M. Если объект является экземпляром Y, выполните Z.
Это распространенная проблема кодирования и имеет свою собственную закономерность. Вы должны использовать Strategy
для решения этой проблемы.
Некоторые разработчики прибегают к операторам if-else. Это хорошо работает, если есть только 2-3 условия.
Хотя это кажется жизнеспособным решением, условия размножаются. Никто не станет переписывать эти 2–3 условия в стратегии. Следующий разработчик добавит еще один и пойдет дальше.
Вот один из примеров условий разведения.
Лучше всего использовать стратегии. Вы можете создать Map<Condition, Strategy>
и оценить на его основе.
Как расположить данные в алфавитном порядке?
Вам необходимо отсортировать данные в алфавитном порядке.
У вас есть страны клиентов, имена или фамилии, которые нуждаются в алфавитном порядке.
Лексический порядок не совпадает с алфавитным порядком. Пример: «Z» будет стоять перед «а».
Вот как может выглядеть плохое решение.
Вот решение грубой силы. Сравните каждую из них и расположите их правильно. Это наихудший способ сортировки строк.
Вы не увидите этого в производственном коде. Вы могли видеть, как новички пробуют это решение.
Вот более элегантный способ сортировки строк. Сортировка строк с помощью Collections#sort
. Предоставьте пользовательский компаратор и отсортируйте их по желанию.
Но вам нужен алфавитный порядок. Сортировка по умолчанию дает лексический порядок. Этот порядок соответствует кодам ASCII. Лексический порядок не совпадает с алфавитным порядком.
// this won't work as expected
list.sort(Comparator.naturalOrder());
Всегда ищите нативное решение. Здесь Collator
вам поможет.
// this will sort the countries in alphabetical order
Collections.sort(countries, Collator.getInstance(new Locale(languageCode)));
Украсть мою электронную книгу
Я уже написал много плохих фрагментов Java. Вы можете украсть их из Моей Гамроуд.
Чаевые в размере одного-двух долларов помогли бы мне создать лучшую электронную книгу бесплатно!