Перейти к содержанию

🗒 Задача

На территории агрокомплекса функционирует система автоматического мониторинга условий для роста растений. Напиши программу, которая будет определять, подходят ли текущие условия для успешного роста бобовых культур.

Критерии благоприятных условий включают:

  • наличие солнечной погоды;

  • открытый тент;

  • влажность воздуха составляет 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")
}