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

แชร์
ฝัง
  • เผยแพร่เมื่อ 23 ธ.ค. 2024

ความคิดเห็น • 75

  • @Viktor-g2d9z
    @Viktor-g2d9z วันที่ผ่านมา +20

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

    • @Dark3470
      @Dark3470 2 ชั่วโมงที่ผ่านมา +1

      На меня глядит игриво пиво пиво пиво пиво

  • @artemorlov9941
    @artemorlov9941 วันที่ผ่านมา +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 วันที่ผ่านมา +1

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

    • @kotojava
      @kotojava  วันที่ผ่านมา +2

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

    • @АндрейРешетченко-т9й
      @АндрейРешетченко-т9й 5 ชั่วโมงที่ผ่านมา

      @@kotojava там автор этого комментария дал пояснение по этому моменту и даже привел пример, но ты, видимо, увидел только то, что хотел)

  • @TheExcentro
    @TheExcentro วันที่ผ่านมา +7

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

    • @АндрейРешетченко-т9й
      @АндрейРешетченко-т9й 6 ชั่วโมงที่ผ่านมา

      Ну, когда джава придумывалась, предполагалось что это будет язык для чайников и утюгов, и называть классы 5ю словами никому не нужно будет. Да и дженериков изначально не было. А потом всё повернуло не туда и заверте....

  • @hukers2892
    @hukers2892 วันที่ผ่านมา +2

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

  • @gatos-su
    @gatos-su วันที่ผ่านมา +3

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

    • @kotojava
      @kotojava  วันที่ผ่านมา

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

    • @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 วันที่ผ่านมา

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

    • @kotojava
      @kotojava  วันที่ผ่านมา

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

  • @noneinby5798
    @noneinby5798 วันที่ผ่านมา +1

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

  • @xanderxk
    @xanderxk วันที่ผ่านมา +4

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

  • @noneinby5798
    @noneinby5798 วันที่ผ่านมา +1

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

  • @windus08
    @windus08 วันที่ผ่านมา +1

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

  • @tomvenom
    @tomvenom 2 วันที่ผ่านมา +3

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

    • @kotojava
      @kotojava  2 วันที่ผ่านมา

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

    • @Das.Kleine.Krokodil
      @Das.Kleine.Krokodil วันที่ผ่านมา

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

    • @hukers2892
      @hukers2892 วันที่ผ่านมา

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

  • @glebbondarenko67
    @glebbondarenko67 วันที่ผ่านมา +2

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

    • @Das.Kleine.Krokodil
      @Das.Kleine.Krokodil วันที่ผ่านมา +2

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

    • @glebbondarenko67
      @glebbondarenko67 วันที่ผ่านมา

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

    • @Das.Kleine.Krokodil
      @Das.Kleine.Krokodil วันที่ผ่านมา

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

    • @noneinby5798
      @noneinby5798 วันที่ผ่านมา +2

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

  • @ВалентинАндреев-л3т
    @ВалентинАндреев-л3т วันที่ผ่านมา +2

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

    • @mysorrowangel
      @mysorrowangel วันที่ผ่านมา

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

    • @ВалентинАндреев-л3т
      @ВалентинАндреев-л3т วันที่ผ่านมา

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

    • @kotojava
      @kotojava  วันที่ผ่านมา

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

    • @ВалентинАндреев-л3т
      @ВалентинАндреев-л3т วันที่ผ่านมา

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

    • @ВалентинАндреев-л3т
      @ВалентинАндреев-л3т วันที่ผ่านมา

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

  • @Das.Kleine.Krokodil
    @Das.Kleine.Krokodil 17 ชั่วโมงที่ผ่านมา

    9:38 у вас в проде есть такой код?

  • @ArtFanRamm
    @ArtFanRamm 2 ชั่วโมงที่ผ่านมา

    На моей работе использовать var вообще запрещено, с чем я в принципе согласен. Хотя когда изучал джаву на автомате использовал var. Использование var для инициализации переменнной возвращаемым значением какого-либо метода по-моему вообще к терроризму нужно приравнивать

  • @sprendex5296
    @sprendex5296 2 วันที่ผ่านมา +2

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

    • @Das.Kleine.Krokodil
      @Das.Kleine.Krokodil วันที่ผ่านมา +2

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

    • @noneinby5798
      @noneinby5798 วันที่ผ่านมา +1

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

    • @sprendex5296
      @sprendex5296 วันที่ผ่านมา

      @@Das.Kleine.Krokodil упаси бог от мидлов, которые апеллируют к грейду, а не аргументам

    • @Das.Kleine.Krokodil
      @Das.Kleine.Krokodil 21 ชั่วโมงที่ผ่านมา

      @@sprendex5296 просто это часто свойственно именно джунам - сделать революцию

  • @xanderxk
    @xanderxk วันที่ผ่านมา +1

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

  • @AlSlonex123
    @AlSlonex123 วันที่ผ่านมา +1

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

    • @hukers2892
      @hukers2892 วันที่ผ่านมา +1

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

  • @DHARMA252
    @DHARMA252 วันที่ผ่านมา

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

  • @АлександрМышляев-щ5и
    @АлександрМышляев-щ5и 2 วันที่ผ่านมา

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

  • @densquek1753
    @densquek1753 2 วันที่ผ่านมา

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

    • @kotojava
      @kotojava  2 วันที่ผ่านมา

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

    • @densquek1753
      @densquek1753 2 วันที่ผ่านมา

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

    • @kotojava
      @kotojava  2 วันที่ผ่านมา

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

    • @densquek1753
      @densquek1753 2 วันที่ผ่านมา +1

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

    • @pavelkravchenko7005
      @pavelkravchenko7005 2 วันที่ผ่านมา +1

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

  • @VasillaRobocraft
    @VasillaRobocraft วันที่ผ่านมา +1

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

    • @Das.Kleine.Krokodil
      @Das.Kleine.Krokodil วันที่ผ่านมา +3

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

  • @Victorqwertymxn
    @Victorqwertymxn 2 วันที่ผ่านมา

    Вор 😂😂😂😂😂

    • @kotojava
      @kotojava  2 วันที่ผ่านมา

      почему?

    • @vladputnikov5949
      @vladputnikov5949 วันที่ผ่านมา +2

      Вар в законе

  • @universeunity9970
    @universeunity9970 วันที่ผ่านมา

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

    • @Das.Kleine.Krokodil
      @Das.Kleine.Krokodil วันที่ผ่านมา +3

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

  • @rytmtembr251
    @rytmtembr251 วันที่ผ่านมา

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

    • @verayanovka8114
      @verayanovka8114 วันที่ผ่านมา

      Не могли бы уточнить про " дурака"?

    • @Das.Kleine.Krokodil
      @Das.Kleine.Krokodil 21 ชั่วโมงที่ผ่านมา

      Значит использовать без понимания​@@verayanovka8114