Ключевое слово VAR в Java и почему оно скорее всего тебе не нужно.

Поділитися
Вставка
  • Опубліковано 22 гру 2024

КОМЕНТАРІ • 65

  • @Viktor-g2d9z
    @Viktor-g2d9z 15 годин тому +15

    заходит как-то джава разработчик в бар и говорит бармену - мне пиво пиво новое пиво

  • @artemorlov9941
    @artemorlov9941 12 годин тому +7

    Вы затронули очень холиварную тему, приведу аргументы почему использовать var по дефолту это нормальная практика.
    1. Использование явного типа может увеличивать когнитивную нагрузку пишущего, поскольку он может не помнить точного название типа, возвращаемого методом, и также вынужден наводиться и проваливаться, чтобы этот тип написать. Это видно даже в Вашем видео, где Вы засомневались в типах и стали проваливаться в их объявления)
    2. Когнитивная нагрузка читающего может снижаться, но часто это ничего не дает. Если тип стандартный или читающий с ним хорошо знаком, то его очень легко вывести по контексту. Если же вы не знаете тип, то аннотация разве что поможет Вам провалиться в тип в один клик вместо двух, либо, если повезет, что-то понять из названия типа.
    3. Часто читающему и не нужно знать, что за тип используется в данном конкретном месте, потому что по названию переменной в совокупности с названиями используемых методов и так понятно, что данный участок кода делает, если все хорошо названо. В таком случаем тип становится просто визуальным шумом, который только мешает.
    4. Подсвечивания типов IDE без их явного прописывания, как Вам уже написали в комментариях, очень хорошая вещь, т.к. она одновременно может снизить нагрузку пишущего, поскольку он может использовать var и снизить нагрузку с читающего, поскольку он видит тип.
    5. Автоматический вывод типов - это тенденция в современном программировании. Он появился во многих старых языках (С#, C++, Java), и я не знаю ни одного нового языка, в котором бы его не было, например, он есть в Dart, Kotlin, Rust. Причем в новых языках он рассматривается, как дефолтный вариант, и прописывание типов оставлено для ситуаций, когда вывод не справляется или справляется плохо. Вы показали такие ситуации в видео, однако в большинстве случаев вывод типов справляется достаточно хорошо.
    6. Куча языков с динамической типизацией нормально себя чувствовали вообще без аннотаций типов. А после того, как они в них появились (Python, TypeScript) стандартной практикой стало считаться использовать их только в сигнатурах и опять же в спорных ситуациях, где вывод не справляется. В остальных ситуациях используется аналог var из Java.
    Вы, конечно, можете ограничить или запретить использовать var в своей кодовой базе, и это будет нормально, но это вопрос стиля, аргументы есть в обе стороны. Поэтому мне кажется странным объявлять практику, которая нравится огромному количеству людей, ошибочной. Мне кажется, что неприятие этой фичи во многом исходит из консерватизма Java программистов. В C#, например, эта фича появилась в 2007 году и всем уже давно ок, а в Java var ввели в 2018 и код написанный на var, может выглядеть, как нарушение всех возможных основ)))

    • @AlSlonex123
      @AlSlonex123 8 годин тому +1

      Млин ну серьезно, откуда вы такие беретесь.
      >> Использование явного типа может увеличивать когнитивную нагрузку пишущего, поскольку он может не помнить точного название типа,
      Код пишется один раз - читается тыщу. Лучше "когнитивно нагрузиться" один раз в процесске писки чем потом постоянно держать тип в башке и гадать "что эта хрень делает".
      Рефакторинг "выделение переменной" горячими кнопками очень быстро помогает обьявить тип возвращаемый правой частью. Вся нагрузка пропадает.
      >>Если тип стандартный или читающий с ним хорошо знаком, то его очень легко вывести по контексту.
      Ну нах..я? Если его просто можно тыпо написать и ничего не вывыдить, фокусируясь но бОльшей задаче.
      >>Часто читающему и не нужно знать, что за тип используется в данном конкретном месте, потому что по названию переменной в совокупности с названиями используемых методов и так понятно,...
      Чаще нужно, чтобы понимать что происходит и ведеть большую картинку...
      Все аргументы справедливы для программок типа Хелло Ворлд.

    • @universeunity9970
      @universeunity9970 3 години тому

      @@AlSlonex123 Согласен на 100% с каждым пунктом.

    • @kotojava
      @kotojava  35 хвилин тому

      "Использование явного типа может увеличивать когнитивную нагрузку пишущего, поскольку он может не помнить точного название типа, " как указание типа увеличивает когнитивную нагрузку? мол если не видишь ничего то и думать не надо?

  • @TheExcentro
    @TheExcentro 5 годин тому +3

    Спасибо, интересное видео. Я - за var :) Var снижает многословность Java, за которую многие ее ругают. Ну и зачем писать два раза тип переменной - слева и справа?

  • @noneinby5798
    @noneinby5798 6 годин тому +1

    Пример с пользователем показателен. Проблема не в var, а в ожиданиях. Использование конкретного типа (User) никак проблему решает.

  • @gatos-su
    @gatos-su 13 годин тому +3

    Переходи на котлин, зачем страдать на джаве?
    Объявление типа переменной было нужно, чтобы упростить компилятор, так как машины тех лет были несказанно слабее нынешних.
    Вместо финал вар, нужно было сделать лет или конст - это да, промах.
    Посмотри на те же котлин, с шарп, тайпскрипт - всё ок, проблем с типами не.
    Если у тебя есть 2 метода, которые принимают Лист и Итерэйбл, а у тебя переменная АррвйЛист, то тебе нужно кастовать.
    Большинство примеров высосаны из пальца и на практике ошибки сразу дадут о себе знать, и вообще так никто не напишет.

    • @kotojava
      @kotojava  12 годин тому

      Упростить компилятор? В котлине тип тоже слева пишется? Какие два метода? какой итератор? Ты точно правильное видео посмотрел?

    • @gatos-su
      @gatos-su Годину тому

      ​@@kotojava Упростить компилятор? - да, представь себе, лет 20 назад 512 мб оперативики - это был шик, процессоры в то время были на несколько порядков медленнее. А чтобы сделать вывод типа - нужно заглянуть дальше в синтаксическое дерево и сделать выводы. Сейчас это кажется какой-то элементарщиной, но тогда - это требовало дополнительных вычислений.
      По поводу итераторов.
      Вот есть два метода:
      printUsers(Iterable users)
      updateUsers(List users)
      И есть такие переменные:
      ArrayList users = new ArrayList();
      var varUsers = new ArrayList();
      А теперь представь разницу в вызове этих методов.
      Но это ещё не всё. В джаве, в отличии от того же Тайпскрипта, довольно таки скудные возможности работы с типами. И когда в ТС начинаешь комбинировать типы - то никаких бы сил не хватило дублировать их ещё и при объявлении переменной.
      Да и в целом, смотреть на объявление типа List - это такое себе подспорье.

    • @kotojava
      @kotojava  Годину тому

      @@gatos-su "Объявление типа переменной было нужно, чтобы упростить компилятор, так как машины тех лет были несказанно слабее нынешних. " - ссылку можно? ну чтобы без твоих фантазий. (И ссылку не про объем памяти) а про технические решения. И еще приведи хотя бы 1 компилятор (а лучше 2) старше java которые уже поддерживали и строгую типизацию и var - чтобы твои фантазии вообще разрушились.

    • @gatos-su
      @gatos-su 55 хвилин тому

      @@kotojava meta Language, ocaml, хаскель? Ссылку могу дать, далеко ходить не надо: скорость компиляции тех же Скала и Котлин

    • @kotojava
      @kotojava  39 хвилин тому

      @@gatos-su если единственная ссылка подтверждающая твои слова это отсылка к скорости компиляции scala или котлин то пожалуйста не пиши больше комментариев. спасибо.

  • @glebbondarenko67
    @glebbondarenko67 12 годин тому +1

    согласен, уже раз пять пытался писать var, но через 3 строчки понимал что читать это невозможно и ставил нормальные типы.
    Как было сказано, мы читаем слева направо и проблема в том что нам чаще не интересна конкретная имплементация, а не интерфейс с которым мы будем работать
    Поэтому идея оказалась провальной, тут даже не в реализации проблема, а в том что мы собственоручно удаляем информацию об интерфейсе. Слава богу я еще много кода с этим не видел :)

    • @Das.Kleine.Krokodil
      @Das.Kleine.Krokodil 8 годин тому +2

      Провальной? Ну если только лично для вас. Меня устраивает. Тем более что на смену джаве приходит котлин со своими var и val

    • @glebbondarenko67
      @glebbondarenko67 7 годин тому

      @Das.Kleine.Krokodil все как сказал автор: меньше кода - меньше ясности - ещё тяжелее читать. Так же как в идущем котлине 😂

    • @Das.Kleine.Krokodil
      @Das.Kleine.Krokodil 6 годин тому

      @@glebbondarenko67 котлин читается прекрасно если писать на нем.

    • @noneinby5798
      @noneinby5798 6 годин тому +2

      ​@@glebbondarenko67 что Котлин, что C#, что некоторые другие языки с выводом типов прекрасно читаются. Просто надо давать функциям и переменным разумные названия. Тогда не будет приходиться задумываться о типах каждой переменной в коде.

  • @sprendex5296
    @sprendex5296 17 годин тому +2

    я джун, но на сто процентов с тобой согласен. Один раз даже пришлось спорить с намного более опытным разработчиком и на таких же аргументах как у тебя доказывать, что var - это зло (в 90% случаев). Читать код с варами это просто пытка, особенно когда еще хочется перейти в сам класс, который скрывается за варом. С явно указаными типами ctrl+click и перескочил, а попробуйте с варом....

    • @Das.Kleine.Krokodil
      @Das.Kleine.Krokodil 8 годин тому +2

      упаси бог от джунов, которые спорят со словами "smth - это зло"

    • @noneinby5798
      @noneinby5798 6 годин тому +1

      Какие проблемы с var? Ctrl-left click точно так же переходит а нужный класс.

  • @rytmtembr251
    @rytmtembr251 Годину тому

    "заставь дурака богу молиться - он себе лоб расшибет"
    var это годная тема для осмысленного использования в отдельных участках кода, чтобы лишний раз не писать кишки из каких нибудь длинных названий и цепочки вложенных классов и генериков, если важна конкретика или на важном участке кода создается неразбериха, то вар не пишем = profit!

  • @noneinby5798
    @noneinby5798 6 годин тому +1

    Ну увидели, что Set параметризован вот таким типом. И что это дает? Это оиносится к первому "контрпримеру".

  • @hukers2892
    @hukers2892 2 години тому +1

    тип переменной обычно понятен из контекста. если это не так, то ты делаешь что-то не то. переменные не создаются от балды, у них есть предназначение, и это предназначение диктует тип.
    твои примеры малодоказательны:
    примеры с entySet и singleton это типичные примеры, где всё ясно из контекста.
    а за остальное тебя будут бить. возможно даже ногами. List - та хрень из-за которой появились генерики. старшие коллеги быстро объяснят тебе почему так делать нельзя. с матами и подзатыльниками для лучшего запоминания.
    а когда ты попытаешься доказать необходимость переменной, которая может принимать либо число либо текст, то тебя пошлют в наркодиспансер за справкой.
    в примере с юзером не ясно что ты пытаешься доказать: createUser создаёт юзера. если это не так, то твои коллеги будут недовольны. а значит в переменной будет юзер и значит функция будет вызвана та, где в параметрах юзер. и только когда ты специально указал, что это не юзер а сериалайзабел, только тогда была вызвана другая функция. тут всё сработало предсказуемо.

  • @windus08
    @windus08 13 годин тому +1

    В 2024 версии код ревью можно делать внутри IDE

  • @xanderxk
    @xanderxk 15 годин тому +3

    белая тема в IDE и почему она скорее всего тебе не нужна

  • @xanderxk
    @xanderxk 15 годин тому +1

    каждый день использую var в C# )

  • @tomvenom
    @tomvenom 17 годин тому +2

    В С# давно это стало стандартом. На Котлине с этим проблем нет. В Java вечно какие-то проблемы с использованием новых фичей)

    • @kotojava
      @kotojava  17 годин тому

      в котлине тип указывается справа. зачем нужна эта фича, что она дает?

    • @Das.Kleine.Krokodil
      @Das.Kleine.Krokodil 8 годин тому

      @@kotojava видимо для различия var и val

    • @hukers2892
      @hukers2892 4 години тому

      @@kotojava в котлине тип указывается только там, где нет присвоения - в параметрах или отложенных переменных. и никаких проблем с пониманием кода. ну, разве что некоторый "гений" (скорее всего ты из прошлого) решил повыпендриваться и написал гениальнейший код, который настолько гениален, что тебе нужно время, чтоб понять, что эта хрень делает.

  • @DHARMA252
    @DHARMA252 14 годин тому

    var в целом прикольно. Опционально

  • @ВалентинАндреев-л3т
    @ВалентинАндреев-л3т 13 годин тому +1

    А какая сакральная причина знать тип? Вам не хватает названий? Если не хватает названий (переменных, функций), тогда уже вопросы не к var, а к названиям

    • @mysorrowangel
      @mysorrowangel 12 годин тому

      знать тип надо, иначе что ты дальше будешь делать с этой переменной? В Visual Studio можно включить добавление типа за var, и если уж совсем нужно то Ctrl + ., enter, и дальше F12.
      PS я имею ввиду что IDE будет показывать правильный тип после var мелким шрифтом. Очень удобно.

    • @ВалентинАндреев-л3т
      @ВалентинАндреев-л3т 12 годин тому

      @@mysorrowangel а что даст название типа в хорошем коде? Банальный пример
      var a = 1.4;
      var b = 2;
      System.out.print(a + b);

    • @kotojava
      @kotojava  12 годин тому

      Типы писать в переменных и названиях методов ? Серьезно?

    • @ВалентинАндреев-л3т
      @ВалентинАндреев-л3т 11 годин тому

      @@kotojava а где я писал про то, что в именах нужно писать название типа?) хотя, кстати, так поступили в microsoft, но сейчас не об этом.
      суть в том, что название переменной и ее методов должно быть говорящим, будь то даже
      `vasya_pupkin.eat(apple);`
      логично же, что vasya_pupkin - это не бульдозер, а apple - это яблоко, а не компания?

    • @ВалентинАндреев-л3т
      @ВалентинАндреев-л3т 11 годин тому

      я не очень понял почему не отправился мой комментарий, но переписывать все не буду, просто скажу:
      на сколько важно знать какие типы в данном примере?
      vasya.eat(apple);

  • @АлександрМышляев-щ5и

    как это не нужно?

  • @AlSlonex123
    @AlSlonex123 8 годин тому +1

    Помоему чуваки которые топят за var ничего более сложного чем то что можно целиком держать в голове не делали.

    • @hukers2892
      @hukers2892 4 години тому

      рукалицо. если ты делаешь что-то, что не может поместиться в твоей голове, то ты идиот - разбей проблему на удобоваримые части и обрабатывай по очереди. "разделяй и властвуй" это один из самых основных принципов программирования.

  • @densquek1753
    @densquek1753 17 годин тому

    Это же все просто проблемы ide, которая не подсвечивает тип у var

    • @kotojava
      @kotojava  17 годин тому

      те нужно иметь var и еще подсвечивать тип?

    • @densquek1753
      @densquek1753 17 годин тому

      @kotojava именно так и сделано в андроид студии и котлине

    • @kotojava
      @kotojava  17 годин тому

      @@densquek1753 зачем тогда var нужен если тип все равно показывается? для снижения читаемости?

    • @densquek1753
      @densquek1753 17 годин тому +1

      @@kotojava он показывается, но мы же его не пишем. В итоге и тип видим и пишем сокращённо. Тут скорее вопрос привычки как читать. Хотя конечно остаётся проблема читаемости чужого кода при ревью

    • @pavelkravchenko7005
      @pavelkravchenko7005 16 годин тому +1

      ​@@kotojava нужен чтобы не дублировать одно и то же, тип будет просто подсвечен в тени путем угадывания. И если произойдет смена типа, нам не придется менять его во всех местах, где объявили до этого.
      Такая же штука реализована в TypeScript и kotlin и все ок с отрисовкой типов в идее. Тут скорее проблема не в фиче, а в IDE.

  • @Victorqwertymxn
    @Victorqwertymxn 17 годин тому

    Вор 😂😂😂😂😂

  • @VasillaRobocraft
    @VasillaRobocraft 15 годин тому +1

    Даже когдя я только начинал учить джаву, мне было непонятно - на кой хрен этот var? Зачем вносить этот хаос в строго типизированный язык?
    Make peace - not var

    • @Das.Kleine.Krokodil
      @Das.Kleine.Krokodil 8 годин тому +3

      так строгость типизации не меняется

  • @universeunity9970
    @universeunity9970 9 годин тому

    var пишут только особоодарённые. Обычно такие люди ещё и джаву явой называют. С такими в жизни не особо хочется иметь что-то общее, не то что работать.

    • @Das.Kleine.Krokodil
      @Das.Kleine.Krokodil 8 годин тому +3

      жесть. и кому то ведь с тобой работать приходится)