Comments 54
ООП не хватает для полной шедевральности (8
Тут главное чтоб руки расли откуда надо. Если придерживаться определенных правил, то эта фича только во благо.
В нестрогой типизации есть своя прелесть. Только руки должны рости из правильного места.
Ну одно дело нестрогая типизация, а другое когда id и респонс базы называют емейлом. :-)
Я дико извиняюсь, но при чем тут нестрогая типизация? Термин такой красивый?
Вообще-то это динамическая типизация, нестрогая типизация, которая характерна PHP, JavaScript, VBScript проявляется в случаях вида a = «1» + 1, т.е. переменная со значением одного типа используется в разных местах кода как будто она пренадлежит к другим типам, строгая типизация придает определенную строгость языку и не позволяет допустить ряда ошибок характерных коду написанному на языках с нестрогой типизацией. Из скриптовых языков к языкам со строгой типизацией можно отнести Python.
Ну да, я спутал строгую со статической. Бывает.
Именно в php a = «1» + 1, а будет равно 2, а если a = «1». 1, тогда 11 ;)
Только после вашего примера заметил одну странность:)
echo «1» + 1; //Это даже работает! И выводит 1
echo «1»+1; //Выводит 2, оно и понятно… (кстати в JS выведет 11:) )
Но первый пример прям порадовал:) Оказывается даже так:
echo asdf; //Выведет на экран asdf
Дальше углубился в эту задачу и сделал так:
echo «1» + 1; //Это даже работает! И выводит 1
echo «1»+1; //Выводит 2, оно и понятно… (кстати в JS выведет 11:) )
Но первый пример прям порадовал:) Оказывается даже так:
echo asdf; //Выведет на экран asdf
Дальше углубился в эту задачу и сделал так:
Почему то коммент отправился… Так вот продолжение:)
define(«asdf»,«123»);
echo asdf; //Выводит конечно же 123.
define(«asdf»,«123»);
echo asdf; //Выводит конечно же 123.
Незнаю, я сам хоть и пишу на PHP — но в нестрогой типизации никакой прелести не нашел, стараюсь жестко придерживаться правила что у одной переменной может быть только один тип, или null, хотя в PHP null тоже отдельный тип данных, сложности следования этому правилу в основном возникают из-за встроенных функций, который часто возвращают то один тип данных, то другой.
А смысл? Я серьезно спрашиваю, не спорю, сколько людей — столько мнений. Просто интересно зачем это делать.
Ну как-то это удобно просто :) Когда пишешь что-то с нуля — тогда конечно при условии прямых рук даже с изменением типа данных в переменной конечно все будет четко и ясно, однако редактируя этот код в последствии — нужно будет проследить всю цепочку преобразований, что дает больший простор для того чтобы что-то проглядеть, забыть, ошибиться, а в случае когда для нового типа данных задается новая переменная — можно быть уверенным что если переменная пришла в функцию или метод строковым параметром — то она в любом ее месте будет строковым параметром, а булевое значение полученное из нее будет иметь отдельную переменную, и также всегда будет булевым значением в любом месте кода. И именую переменные я соот-но, с припиской в виде одной буквы, обозначающий тип, перед именем, а-ля $sName, $iCount и т.п., некоторых такой изыск раздражает, а мне это удобно, я бегло взглянув на код могу понять принцип его работы, где у меня в метод передан скалярный тип, а где целый объект, где строка а где число.
Вообще это по-моему даже какой-то стандарт —
$oObject
$sString
$iInt
$aArray
— первая буква типа=)
$oObject
$sString
$iInt
$aArray
— первая буква типа=)
Ну да, я это не сам придумывал :) Переодически встречал такой подход в чужом коде, и вот однажды сам начал использовать.
Венгерская нотация.
Особенно классно такой код рефакторить.
Особенно классно такой код рефакторить.
А вот тут про истоки «нотации», и, как мне кажется, действительно более правильный подход:
local.joelonsoftware.com/mediawiki/index.php/%D0%9A%D0%B0%D0%BA_%D0%B7%D0%B0%D1%81%D1%82%D0%B0%D0%B2%D0%B8%D1%82%D1%8C_%D0%BD%D0%B5%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4_%D0%B2%D1%8B%D0%B3%D0%BB%D1%8F%D0%B4%D0%B5%D1%82%D1%8C_%D0%BD%D0%B5%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE
local.joelonsoftware.com/mediawiki/index.php/%D0%9A%D0%B0%D0%BA_%D0%B7%D0%B0%D1%81%D1%82%D0%B0%D0%B2%D0%B8%D1%82%D1%8C_%D0%BD%D0%B5%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4_%D0%B2%D1%8B%D0%B3%D0%BB%D1%8F%D0%B4%D0%B5%D1%82%D1%8C_%D0%BD%D0%B5%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE
Венгерская нотация приносила имела смысл в C
Парой постов выше приведена достаточно интересна статья про то где и когда венгерская нотация имела смысл.
Случайно отправил, извиняюсь
Итак, в C
В случае отсутствия беззнаковых переменных ее полезность сомнительна. Для этого нужно чуть пораскинуть мозгами. Нотация позволяет не путаться в типе переменных, Вероятно, у вас в коде объявлено множество переменных с одним именем.
Вот и проблема — множество переменных. Возможные решения — разбиение на методы, выделение классов.
Итак, в C
wile (dwCount > 0) // бесконечный цикл { // do dwCount--; }
В случае отсутствия беззнаковых переменных ее полезность сомнительна. Для этого нужно чуть пораскинуть мозгами. Нотация позволяет не путаться в типе переменных, Вероятно, у вас в коде объявлено множество переменных с одним именем.
Вот и проблема — множество переменных. Возможные решения — разбиение на методы, выделение классов.
Давайте не искать чужие проблемы методом тыка, а уж тем более учить незнакомых людей азам программирования, по-крайней мере я-же вас им не учу.
Это наверно от кода поста. Ниже привел пример каким его хочется видеть habrahabr.ru/blogs/code_wtf/47774/#comment_1229020
Я не пытаюсь учить — бесполезно. Просто делюсь мыслями. Для меня венгерская нотация пройденный этап.
Я не пытаюсь учить — бесполезно. Просто делюсь мыслями. Для меня венгерская нотация пройденный этап.
А пример кода кстати и вправду смешон, если соот-щий email в базе найден не будет — внутри переменной email так и останется ресурс :)
UFO just landed and posted this here
jQuery напоминает. Там вместо $email – бакс
if(!empty($email) && is_numeric($email)){
…
}
…
}
угадай с трех раз что вернет is_bool(«false») :)
Мне кажется что этот кусок кода не может служить примером убогости php, поскольку он просто убог и всё. При чём тут php? Я являюсь Java и php разработчиком и могу вам сказать что и там и там есть код от которого хочется встать и бежать. Везде свои фичи и недостатки, и «любить» швабру за то что она хреново гвозди заколачивает… так вы не тем просто заняты вот и всё. При чём тут php?
var в LINQ…
Необходимость в переопределении отпадает при декомпозиции кода:
Код библиотеки:
A при использовании ORM даже так
Ну а если ORM умеет накладывать ограничения на параметры
Так за что вы «любите» PHP?
function processEmail($email) { requireNumeric($email); $row = queryOne("SELECT email FROM users WHERE id=".$email); return $row[0]; }
Код библиотеки:
function requireNumeric($data) { if (empty($data) || !is_numeric($data)) throw new InvalidArgumentException(); } function queryOne($query) { $result = query($query); if (!$result || mysql_num_rows($result) <= 0) throw new InvalidDBDataException(); return mysql_fetch_row($result); }
A при использовании ORM даже так
function processEmail($email) { requireNumeric($email); return select_email($email); }
Ну а если ORM умеет накладывать ограничения на параметры
function processEmail($email) { return select_email($email); }
Так за что вы «любите» PHP?
Кстати, если написать функцию вроде
То код в статье можно сильно упростить:
Вот за наличие функции extract я люблю пхп :))
P.S. Да, mysql_res() в приведенном мной виде не обрабатывает ошибки, это надо делать отдельно
function mysql_res($query) { return mysql_fetch_assoc(mysql_query($query)); }
То код в статье можно сильно упростить:
if(!empty($email)) extract(mysql_res('SELECT `email` FROM `users` WHERE `id`='.intval($email)));
Вот за наличие функции extract я люблю пхп :))
P.S. Да, mysql_res() в приведенном мной виде не обрабатывает ошибки, это надо делать отдельно
какие страшные условия, а всего надо написать:
if($email = (int) $email){
Кстати, в Python переопределение тоже сработает. И в Perl и в Ruby, причём тут PHP?
if($email = (int) $email){
Кстати, в Python переопределение тоже сработает. И в Perl и в Ruby, причём тут PHP?
Sign up to leave a comment.
За что я «люблю» PHP или переназначение переменных)