За последние 24 часа нас посетили 17643 программиста и 1548 роботов. Сейчас ищут 1204 программиста ...

Вброс: венгерская нотация

Тема в разделе "Беседы", создана пользователем admyx, 1 фев 2017.

  1. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Всем привет. Так вот, насчет вброса.
    Цитата из вики - "известный противник венгерской нотации - Линус Торвальдс".
    Цитата Торвальдса - «Вписывание типа переменной в её имя (так называемая венгерская нотация) ущербно — компилятор и так знает типы и может проверить их, и это запутывает программиста».

    Я с ним согласен, если мы имеем дело с C, C++, Java и т.п. (не берем node, там своя, отдельная идея от человечества, имхо, сколько с ней работаю)) )

    А вот лично я работаю уже 10 лет с PHP и иже с ними.
    Сейчас использую PHP7, и все свои разработки стараюсь перевести туда же.

    Отступая.. меня, наверное, побудила этот пост написать сегодняшняя ситуация - когда я раскопал метод Yii2

    PHP:
    1. Controller::bindActionParams().
    Там все хорошо, кроме контроля типов.
    Понятно, что когда мы передаем через браузер site.com/site/action?id=30, 30 будет в первую очередь строкой. А уже потом (int)30. Если мы сами так сделаем.
    Но - даже если мы пишем

    PHP:
    1. public function actionUpdate(int $id, bool $bIsDemo)
    передавая в адресной строке $id = 30.0, $bIsDemo = 1 - получим TypeError. Это в лучшем случае.

    Понятно, что данная обработка лежит полностью на разработчике, в данном случае, на мне.
    Что я и переписал с контролем типов с использованием Reflection.

    Но вот в чем смысл - пока есть неоднозначные ситуации.
    Пока есть не

    PHP:
    1. public function getUser(int $userId)
    2. // mixed
    вместо

    PHP:
    1. public function getUser(int $userId) : User
    2. // User or throw exception
    разработчик хотя бы может отследить суть переменной, исходя из префикса.

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

    PHP:
    1. $amount = (int)($amount * 100)
    или наоборот

    PHP:
    1. $amount  = (float)($amount / 100)
    Будет треш.
    На мой взгляд, правильнее оформлять переменную с префиксом, как-то:

    PHP:
    1. $aData = [];
    2. $oUser = new User;
    3. $bIsDemo = true;
    4. $fAmount = 0.1;
    5. $iAmount = 10;
    и т.п.

    Как считаете, форумчане?
     
    #1 admyx, 1 фев 2017
    Последнее редактирование модератором: 2 фев 2017
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    восстал из небытия?
    --- Добавлено ---
    а зафиг вообще этот префикс? давайте танцевать от печки.
     
  3. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.102
    Симпатии:
    1.243
    Адрес:
    там-сям
    IMHO, венгерская нотация это всё-таки голос из могилы :)
    это нормально. более того, если твои функции не по 200+ строк, то ты не успеешь забыть что $amount у тебя целый. префикс не нужен.
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    скорее нормально было бы вот так:
    PHP:
    1. $amount = (int)$amount * 100
    а на текущий момент там бомба часовая как раз с типом.
     
  5. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.102
    Симпатии:
    1.243
    Адрес:
    там-сям
    $amount *100 заставляет пхп считать $amount числом. затем результат тайпкастится к целому . что тут может быть неправильно понято? имхо бомбы тут нет, всё прозрачно.

    бомба бывает в сравнениях, когда переменная строкового типа сравнивается с числом. вот там нежданчики!
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну может. тогда похую. вброс захлебнулсо.
     
  7. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
     
  8. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    я никоим образом не говорю про пых 7.0, и 7.1.
    там уже более-менее понятно.

    но когда тот же yii2 придет еще к контролю типов и контролю возвращаемых значений.
    я собстно о чем. когда метод возвращает array|false|null, как в том же yii это возлюблено - не лучше ли использовать в таких случаях префикс (mixed) - $mData, раз уж проверять нужно.
     
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а какой смысл в этом? ну навёл ты мышку на метод, увидел всё, что он вовзращает и что требует. Зачем ещё префикс?
     
  10. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    шторм даже с указанием пхп 7.0 в качестве движка возвращает до сих пор при указании
    public function myFunction(string $str) : float{}
    как string|string и float|float.

    хотя, конечно, это уже к шторму относится.

    в общем, мне просто хотелось узнать мнение окружающих. опять-таки, я никого не агитирую.
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    мой стиль таков, что мне это не катит. Я могу одну переменную и строкой иметь, и в неё же массив спарсить. Я стараюсь не писать методы длиннее 30-50 строк никогда, и типа они на одном экране норм читаются и так, без подсказок. Если я буду имя типизировать, то у меня некоторые переменные больше двух строк не проживут, нафик надо.
     
  12. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    ну я отписавшихся услышал. всем спасибо )