🗒 Задача¶
На территории агрокомплекса функционирует система автоматического мониторинга условий для роста растений. Напиши программу, которая будет определять, подходят ли текущие условия для успешного роста бобовых культур.
Критерии благоприятных условий включают:
-
наличие солнечной погоды;
-
открытый тент;
-
влажность воздуха составляет 20%;
-
текущее время года - не зима.
Программа должна выводить результат анализа условий в формате: “Благоприятные ли условия сейчас для роста бобовых? true/false”
Для проверки работы программы, инициализируй переменные следующими значениями:
-
погода сегодня - солнечная;
-
тент на данный момент - открыт;
-
влажность воздуха - 20%;
-
текущее время года - зима.
И типами данных - boolean, boolean, int, String.
❌ Ошибки¶
-
некорректные названия для “флагов” — для Boolean переменных лучше начинать названия с is. Например isSomethingOpen
-
некорректные типы данных для переменных. Например: для погоды нужна строка
-
объявляют “не зима”, хотя корректнее отрицание использовать в условии
!= -
не инициализируют переменные, а сразу хардкодят значения в условии
-
не делают сравнение с константой, пишут как есть, игнорируя как должно быть, если совпадает:
// НЕ ПРАВИЛЬНО
val isConditionFavorable = isWeatherSunny && awningOpen &&
airHumidity == FAVORABLE_AIR_HUMIDITY &&
season != UNFAVORABLE_SEASON
✏️ Комментарии¶
В переменной времени года корректнее хранить только значение, а отрицание реализовать именно в коде условия. Так как предполагаем, что нам приходят сухие данные с названием времени года. В ином случае эту программу будет сложно поддерживать и расширять.
Лучше использовать более релевантное название. В данном случае для Boolean переменной, которая является своеобразным "флагом" состояния. И для них рекомендуемая конструкция такая: isSunny / isAwningOpen
Согласно условию следует проинициализировать значения с которыми сравниваются критерии) их, кстати, стоит вынести в константы, так как они постоянные и не планируются изменяться после компиляции.
хоть и согласно https://kotlinlang.org/docs/coding-conventions.html конвенции нет строгих правил переноса длинных условия, на моей практике я везде встречал так: сначала на строке остается && / || , а затем строка переносится
При формировании сущности, в свойствах на которые можно ответить да или нет, лучше писать тип Boolean (об этом будет подробнее в уроках на формирование классов)
Очень длинная строка получилась (более 120 символов). В крупных и средних проектах есть системы для автоматизированной проверки кода, например: [Detekt](https://detekt.dev/docs/rules/formatting/#maximumlinelength), который не пропустит такой код. Давай добавим переносов
Значения в этом коде являются [магическими числами](https://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D0%B3%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D1%87%D0%B8%D1%81%D0%BB%D0%BE_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)#%D0%9F%D0%BB%D0%BE%D1%85%D0%B0%D1%8F_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B0_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F). Не лучшая практика. Предлагаю добавить переменные) Согласно условию следует проинициализировать значения с которыми сравниваются критерии) их, кстати, стоит вынести в константы, так как они постоянные и не планируются изменяться после компиляции.
сейчас у нас будет всегда один и тот же результат, мы же сделали только условие)
давай теперь выше в main сделаем входные данные (переменные) с которыми уже будем сравнивать наше условие, например добавим переменную `isSunny` и в принте сравним ее с `IS_SUNNY`
Согласно ТЗ, значения сравниваются с критериями благоприятных условий, их, кстати, стоит вынести в константы, так как они постоянные и не планируются изменяться после компиляции.
🧾 Решение¶
const val IS_WEATHER_SUNNY = true
const val IS_AWNING_OPEN = true
const val FAVORABLE_AIR_HUMIDITY = 20
const val UNFAVORABLE_SEASON = "зима"
fun main() {
val isWeatherSunny = true
val awningOpen = true
val airHumidity = 20
val season = "зима"
val isConditionFavorable = isWeatherSunny == IS_WEATHER_SUNNY &&
awningOpen == IS_AWNING_OPEN &&
airHumidity == FAVORABLE_AIR_HUMIDITY &&
season != UNFAVORABLE_SEASON
println("Благоприятные ли условия сейчас для роста бобовых? - $isConditionFavorable")
}