LINUX.ORG.RU

Python или PHP как первый язык…

 ,


0

1

Прежде стоит сказать, что я никогда не был связан с программированием: в школе ничего не проходили и с ВУЗом тоже не повезло. Однако, сдаваться же никто не собирается!

Буквально несколько месяцев назад, спонтанно, ну как это обычно бывает, появилась прекрасная идея, — показалось наверно, — подумал я. А вот и нет. Когда случайно рассказал одному замечательному товарищу — тот поддержал как только мог, и, более того, дополнил — а дополнение стало беспрецедентным мотиватором, каких в жизни своей не встречал.

В бой.

Сейчас мы с ним активно ищем качественный материал для самостоятельного углубленного изучения. Во времени не ограничены никак. Да вообще никак и ничем, что касаемо интернет-материала: нужно заплатить — заплатим, есть что-нибудь толковое в паблике — с удовольствием изучим. А мы уверены, что много чего есть.

Недавно, максимально насколько это было возможно изучили разметку HTML 4.01 и CSS 2.1 согласно спецификациям «W3C» и, сейчас продолжаем HTML5/CSS3. Эта часть, безусловно, никаких трудностей не доставляет ни в теории ни в практике; чего там, собственно, трудного, всё легко и понятно. //Отдельное спасибо за курсы от «Специалиста» людям, которые не хоронят их у себя на компьютере.

Далее.

В выборе серверного языка мы не сошлись взглядами: я за изучение Python и, конечно же, последующее освоение Django; приятель на стороне PHP. Наши позиции не могут быть сколь угодно объективными по ряду обстоятельных причин, поэтому не разумно ограничить себя двумя мнениями.

Итак, о проекте.

Проект социальный. Множество взаимодействий с (дальше пока густой лес), социальный граф, логика как у существующих соц. сетей. Идея абсолютно другая: не третий фейсбук и не десятый контакт. Идея имеет самодостаточную роль в жизни, а потому не высосана из пальца, лишь бы что-нибудь сделать. Полагаю, что свеохнагрузки приходятся не на ЯП, а на БД. Полагаю, что правильная архитектура — залог успеха. И, полагаю, что можно обойтись языком, который всё же больше нравится. Но не исключаю, что есть более компетентные люди, которые развеют мои предположения.

Что изучать тем, кто только пришел в программирование: Python (Django) или PHP (скорее всего Yii)? Или?

Извиняюсь за то, что случайно попал не в нужный раздел — исправлюсь.



Последнее исправление: NiceForce (всего исправлений: 3)

Ответ на: комментарий от NiceForce

писать приятно на любом языке

Молодец. Здравый смысл побеждает всегда :)

Ruby way

Успехов в начинаниях и свершениях !

gh0stwizard ★★★★★
()
Ответ на: комментарий от drBatty

эта корка НЕ зависит от ЯП. ЯП тупо положил болт на ситуацию. Что в Windows, что в Linux, что в MacOS.

Меня, как практика, интересуют последствия. В сишечке я не пропущу этот баг. В пыхе - пропущу.

предложений не слышу.

Выше уже предложили. В одних случаях(таких, как деление на ноль) - кидаем исключение. В других - возвращаем nullable-тип, который не умеет преобразовываться неявно к значению возвращаемого типа.

anonymous
()
Ответ на: комментарий от drBatty

Что возвращать в этом случае?

В ЯП со статической типизацией принято возвращать -1, в динамической я бы вернул nil/null или подобное.

PolarFox ★★★★★
()
Ответ на: комментарий от PolarFox

В ЯП со статической типизацией принято возвращать -1

Не во всех. Сейчас тенденция к применению nullable-типов для подобных случаев. В некоторых языках даже синтаксический сахар с вопросиком появился для nullable-типов.

anonymous
()
Ответ на: комментарий от dizza

Ужасное дизайн решение.

Вообще это отличное решение, особенно для ООП. Потому что если будет эксепшен в конструкторе, а до этого был создан другой объект, то произойдет memory leak. Особенно четко это видно в яве, но ты же не ругаешь их за это? Нет, там просто принято не создавать никаких иных объектов из других классов в конструкторе текущего класса, если хоть какой-то метод нижележащий может отдать неконтролируемое исключение. Так и в пхп принято отдавать false в функциях.

Ты еще скажи, что в сишных вызовах возврат -1 это не тру и все вокруг папарасы, а ты, гуру, д'Артаньян.

Более того, в скриптовых языках, таких как php и perl проверка подобных функций превращается в простую if (myfunc($arg)) { ... } вместо ловли исключений через try-catch. Хотя одно другому не мешает.

gh0stwizard ★★★★★
()
Ответ на: комментарий от anonymous

Боюсь представить себе слабые...

как одно из слабых можно упомянуть странную привычку php упрямо и тупорыло кастовать всё что непоподя в intval. Просто обычно принято кастовать в тип по крайне мере верхнего порядка, типа как в C char→short→int→long, и логично думать, что int превратится в string, а не наоборот. Однако правила кастования типов в php писались явно под марихуаной, и работают иногда очень странно.

Ещё одно слабое место: Over9000 функций в рантайме, которые действительно часто дублируют и/или противоречат друг другу.

Кстати, а чем полезно такое деление? Можно пример?

например саппорт, который стоит X рублей в сутки. Который ты и заказываешь на Y рублей. Время поддержки составит Y/X. Можно ввести бесплатную поддержку за 0 рублей, которая действует до 2015го года. Или платную за X рублей, которая действует Y/X суток. Надо только записать в коде, что

$delta = $Y/$X;
$end_time = ($delta === FALSE) ? 1420056000 : ($end_time + $delta);
(тут у меня рубли в секунду, что-бы считать было проще).

drBatty ★★
()
Ответ на: комментарий от drBatty

Что возвращать в этом случае?

Самым общим решением является nullable с явным преобразованием к значению возвращаемого типа(с исключением, если такого значения нет). В зависимости от языка могут быть вариации. В некоторых языках не приняты явные касты, там всякие Maybe нужно будет руками проверять(но там это удобно, в Haskell, например).

Т.е. что-то в духе:

int? strpos(String s, String p);
для языков со статической типизацией.

И

def strpos(s, p) {
    # ...
    if (not_found) {
        return Nil;
    }
    return pos;
}
для языков с динамической.

Естественно, что с null/Nil ничего нельзя сделать(кроме проверок и пр.) и при попытке его использовать в качестве обычного значения мы получим исключение.

anonymous
()
Ответ на: комментарий от gh0stwizard

собенно четко это видно в яве, но ты же не ругаешь их за это?

Лол что? Тебе показать конструктор из JDK, который кидает исключение?

Так и в пхп принято отдавать false в функциях.

Вот чем меньше всего «принято», тем лучше.

Ты еще скажи, что в сишных вызовах возврат -1 это не тру и все вокруг папарасы, а ты, гуру, д'Артаньян

Минус -1 - отличное решение. Си вообще язык стройный.

вместо ловли исключений через try-catch

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

dizza ★★★★★
()
Ответ на: комментарий от gh0stwizard

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

dizza ★★★★★
()
Ответ на: комментарий от anonymous

Значение option-типа. false в данном случае плох тем, что превратится в 0 при первом же чихе.

к сожалению, в php ВСЕ типы такие. И это не баг, а фича. Почему ты не плачешь, что fgetc(3) возвращает EOF, который «при любом чихе» кастуется в -1? Что обычно соответствует символу 0xff.

drBatty ★★
()
Ответ на: комментарий от drBatty

Так у тебя тут проверка не пропущена. А разговор идет, в том числе, об отлавливании проблемной ситуации. Если ты тут забудешь проверить на false у тебя к $end_time прибавится 0.

Кроме того, ты подменяешь логику, не совсем адекватно представляя

Можно ввести бесплатную поддержку за 0 рублей, которая действует до 2015го года

А в коде:

$delta = $Y/$X;
$end_time = ($delta === FALSE) ? 1420056000 : ($end_time + $delta);
Так гораздо нагляднее:
end_time = 1420056000 if x == 0 else end_time + x / y

anonymous
()
Ответ на: комментарий от Deleted

какая еще беда? если надо, то ставят рядом 2&3.

ну да, подумаешь, права рута на чужом сервере получить, делов-то…

drBatty ★★
()
Ответ на: комментарий от gh0stwizard

Вообще это отличное решение, особенно для ООП. Потому что если будет эксепшен в конструкторе, а до этого был создан другой объект, то произойдет memory leak.

Если у тебя есть GC, то не произойдет.

Если ты о С++, то ты просто не умеешь на нем писать.

anonymous
()
Ответ на: комментарий от dizza

-1 например.

Это не нужно. Потому что на уровне непосредственно интерпретатора подобная проверка встроена, она же вызывает эксепшн при необходимости. Все как показано в примере - деление на нуль возвращает -1, который вызывает эксепшн где написано write(STDERR, «Division by zero...», strlen(...))

Чтобы не путать людей, какого фига встроена собственная проверка и как от нее избавится, приняли решение, что лучше всегда отдавать true/false. При этом однозначно ясно, что false вызывает соответствующее исключение, которое по желанию можно выловить или пропустить.

В итоге получается довольно гибкий яп.

Аналогично обстоит дело в перле. Но там все еще веселее: undef, 0, " это одно и тоже для if (), т.е. всегда false. И там вместо if (myfunc() < 0) приходится извращаться вроде такого:


my $rv = my_func();

if (defined $rv) {

} elsif ($rv == 0) {

} else {

}

Что порой нифига не весело :)

gh0stwizard ★★★★★
()
Ответ на: комментарий от gh0stwizard

в сишных вызовах возврат -1 это не тру

тру.

anonymous
()
Ответ на: комментарий от anonymous

Если у тебя есть GC, то не произойдет.

В яве он есть. Это спасает их? :) Насколько знаю, перл имеет иммунитет от этого. Но у него и другой тип GC (подсчет ссылок).

gh0stwizard ★★★★★
()
Ответ на: комментарий от anonymous

Меня, как практика, интересуют последствия. В сишечке я не пропущу этот баг.

ой ли!

см. Python или PHP как первый язык… (комментарий) в котором нет никаких исключений.

Выше уже предложили. В одних случаях(таких, как деление на ноль) - кидаем исключение.

которое зависит от архитектуры, и от типа данных? Сам факт кидания не определён в сишечке, может кинуть, а может молча на ноль поделить, хрен его знает как получится. Зависит от того, в козероге меркурий, или в деве.

В других - возвращаем nullable-тип, который не умеет преобразовываться неявно к значению возвращаемого типа.

в php нет таких типов (и в сишечке тоже), и это не баг, а фича.

drBatty ★★
()
Ответ на: комментарий от gh0stwizard

В итоге получается довольно гибкий яп.

Говно в итоге получается.

anonymous
()
Ответ на: комментарий от PolarFox

В ЯП со статической типизацией принято возвращать -1, в динамической я бы вернул nil/null или подобное.

Дык и возвращает FALSE. Смысл NULL в php несколько иной (NULL это синоним «пусто», а вот FALSE синоним фэйла или ложного результата).

drBatty ★★
()
Ответ на: комментарий от drBatty

в php нет таких типов (и в сишечке тоже), и это не баг, а фича.

Ваша привычка возвращать false в «неправильных» случаях - и есть такой «тип». Если бы false к 0 не кастовался...

Но для деления это в любом случае неправильно делать.

anonymous
()
Ответ на: комментарий от dizza

Тебе показать конструктор из JDK, который кидает исключение?

Сначала глянь, что перед этим исключением. Создание нового объекта? Запись себе в private ? Или что? Давай пример.

gh0stwizard ★★★★★
()
Ответ на: комментарий от dizza

Если забыл проверить код возврата, то в лучшем случае ворнинг.

Все ошибки в пхп можно вообще не выводить. Те кто ставит в php.ini вывод всего и вся либо знали что делают, либо не знали. Если все выключено выкидывается пустая «страница», т.е. ничего не выводится. В контексте веб-сайта отличное решение.

gh0stwizard ★★★★★
()
Ответ на: комментарий от dizza

-1 например.

-1 возвращать нельзя, ибо -2/2(например) === -1. В других случаях -1 тоже может быть вполне себе валидным значением, например это может быть такой handle успешно открытой СУБД.

Но тем не менее.

но тем не менее, иногда можно и проверку забить.

drBatty ★★
()
Ответ на: комментарий от gh0stwizard

В яве он есть. Это спасает их? :)

От чего спасает? Утечки никакой не будет в Java в описанном тобой случае.

Утечка будет в С++, но там так не пишут. В смысле там уже давно используются unique_ptr/shared_ptr и им подобные механизмы RAII(вот за что Страуструпа уважаю, так это за RAII).

anonymous
()
Ответ на: комментарий от drBatty

-1 возвращать нельзя, ибо -2/2(например) === -1. В других случаях -1 тоже может быть вполне себе валидным значением, например это может быть такой handle успешно открытой СУБД.

-1 при делении никто не предлагает возвращать. Это про strpos речь шла. При делении - исключение.

anonymous
()
Ответ на: комментарий от gh0stwizard

Гибкий для языка - синоним какашечный. Мне не нужен «гибкий» яп. Мне нужен строгий и точный. Я вижу вам нравится эта «гибкость», да ради бога. Другим не надо только это впаривать.

dizza ★★★★★
()
Ответ на: комментарий от anonymous

Естественно, что с null/Nil ничего нельзя сделать(кроме проверок и пр.) и при попытке его использовать в качестве обычного значения мы получим исключение.

я уже говорил про дурацкую привычку пхп кастовать всё подряд в intval. Да, грабли. Особенность языка. Оно явно даже массивы может преобразовывать сначала в BOOL, а потом в INTEGER (массив равен TRUE если не пуст, и FALSE иначе). К счастью сейчас хоть неявно массивы нельзя в целое преобразовывать, а раньше ЕМНИП можно было (сейчас fatal error).

drBatty ★★
()
Ответ на: комментарий от dizza

Мне нужен строгий и точный.

Что ты тогда делаешь в этом треде? Изливаешь свою ненависть? Спасибо, это может каждый, мы твои вбросы не оценили.

Другим не надо только это впаривать.

Это ты впариваешь. Вобщем, возьми чайку, да напиши свой идеальный яп. Мы посмотрим.

Мне вот интересно ты перл не хаешь за его гибкость? А он погибче пхп на порядок. Хочешь дам строчку на перле, запустишь ее, да оценишь возможности :)

gh0stwizard ★★★★★
()
Последнее исправление: gh0stwizard (всего исправлений: 1)
Ответ на: комментарий от anonymous

Так у тебя тут проверка не пропущена. А разговор идет, в том числе, об отлавливании проблемной ситуации. Если ты тут забудешь проверить на false у тебя к $end_time прибавится 0.

также, если в форме ничего юзер не вводил, все поля будут равны "", что приведёт к тому, что юзер «купит» 0 поддержки за 0 рублей. Вполне логично, на правда-ли? Сначала string === «» преобразуется в int === 0, и после деления это даст FALSE, который тоже логично будет 0 (без изменений).

Уродская логика, но оно успешно работает на 95% сайтов…

Так гораздо нагляднее:

угу. Только это НЕ php. php будет так

if($x == 0)
 end_time = 1420056000;
else
 end_time + x / y;

в данном случае, что в лоб, что по лбу, но IRL разница в предварительном вычислении $delta таки есть. Ибо если её в строку преобразовать (вывести юзеру), то это будет «пусто», а не «бесконечность» и не тем более 0. Заказчик такое понимает (пусто как «не задано»), а вот infinity, и тем более сегфолт боюсь не поймёт.

drBatty ★★
()
Ответ на: комментарий от gh0stwizard
    public FileInputStream(File file) throws FileNotFoundException {
        String name = (file != null ? file.getPath() : null);
        SecurityManager security = System.getSecurityManager();
        if (security != null) {
            security.checkRead(name);
        }
        if (name == null) {
            throw new NullPointerException();
        }
        fd = new FileDescriptor();
        fd.incrementAndGetUseCount();
        open(name);
    }
dizza ★★★★★
()
Ответ на: комментарий от gh0stwizard

Что ты тогда делаешь в этом треде?

А ты что? Пропагаднируешь quick and dirty?

Вобщем, возьми чайку, да напиши свой идеальный яп. Мы посмотрим.

Лол что? У меня есть java, у меня есть python. Мне этого хватает.

Мне вот интересно ты перл не хаешь за его гибкость? А он погибче пхп на порядок.

Во-во, это вообще вселенская гадость.

dizza ★★★★★
()
Ответ на: комментарий от anonymous

Ваша привычка возвращать false в «неправильных» случаях - и есть такой «тип». Если бы false к 0 не кастовался...

тут достаточно глубокое противоречие. Если-бы не кастовался, многое-бы сложнее и кривее получилось.

drBatty ★★
()
Ответ на: комментарий от gh0stwizard

Все ошибки в пхп можно вообще не выводить. Те кто ставит в php.ini вывод всего и вся либо знали что делают, либо не знали. Если все выключено выкидывается пустая «страница», т.е. ничего не выводится. В контексте веб-сайта отличное решение.

в продакшене так оно и делается, в тестинге с точностью наоборот.

drBatty ★★
()
Ответ на: комментарий от dizza

И что ты дал? Пример хорошего кода с обработкой исключений? Здорово, только я не это просил. Убери все чеки на null, загони в цикл с постоянным созданием таких объектов, скажем миллион раз и посмотри что будет.

gh0stwizard ★★★★★
()
Ответ на: комментарий от drBatty

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

anonymous
()
Ответ на: комментарий от anonymous

-1 при делении никто не предлагает возвращать. Это про strpos речь шла. При делении - исключение.

нет у нас стандартных исключений, смирись. Есть куча костылей.

Что до strpos, то -1 тоже имеет смысл, например в контексте substr() это смещения от конца строки, а не от начала.

drBatty ★★
()
Ответ на: комментарий от dizza

Пропагаднируешь quick and dirty?

Нет. Ты не видел хороших пхп-шников это твои проблемы, а не яп. Иль думаешь, что на яве г-кода не пишут, да, в продакшене? Нет, не пишут, вы илита? Не смеши мои тапочки.

Факт простой, профи пхп-шников мало, а порог вхождения в язык очень низкий. Конечно, имеется много школоты, которые далеко не уехали. Тебе то что с этого? А может чел станет как раз гуру по пхп? Нет, ты в него не веришь. И знаешь почему? Ты не веришь ни в кого, ни даже в себя и свои силы.

Во-во, это вообще вселенская гадость.

Молодец. Тру-пограммист. Зачем тебе питон если есть ява? Что слабо писать абсолютно все на яве? Слабо. Так и не рыпайся.

gh0stwizard ★★★★★
()
Ответ на: комментарий от gh0stwizard

Я дал, что ты просил - инициализация private поля (fd), а дальше open(name), который может кинуть эксепшен.

И да, я могу это загнать в цикл, ничего страшного не произойдет.

dizza ★★★★★
()
Ответ на: комментарий от PolarFox

Это булевский false или какой-то иной?

булевский. А вот косорылые укуренные правила из мануала:

 When converting to boolean, the following values are considered FALSE:

    the boolean FALSE itself
    the integer 0 (zero)
    the float 0.0 (zero)
    the empty string, and the string "0"
    an array with zero elements
    an object with zero member variables (PHP 4 only)
    the special type NULL (including unset variables)
    SimpleXML objects created from empty tags
drBatty ★★
()
Ответ на: комментарий от gh0stwizard

Зачем идеальный?

C++, Python, Haskell, Scala - вполне достаточно. Есть и другие годные, которые могут дополнить список или заменить что-то из него. PHP к ним не относится и должен быть выброшен на свалку истории, что, в принципе, и происходит.

anonymous
()
Ответ на: комментарий от anonymous

C++, Python, Haskell, Scala - вполне достаточно.

Ты постановку задачи видел? Найди мне хостинг, просто для сайта под haskell или скалу, а может даже под c++. Выделенку, как студент, я не осилю. Вперед искать.

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

Какие? Именно для веба.

gh0stwizard ★★★★★
()
Ответ на: комментарий от drBatty

В Питоне возвращают -1:

virtuos86@home:~$ python
Python 2.7.2+ (default, Jul 20 2012, 22:12:53) 
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> "ЖОПА".find("Ё")
-1
>>> 
Задокументировано и логично: если подстрока есть, find отрицательные индексы не выдает. Я уж не говорю про то, что отрицательные индексы в Питоне это «сахар», он их в положительные переводит автоматом, но это офтоп.

А можно ошибку, кому что по вкусу:

>>> "ЖОПА".index("Ё")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: substring not found
>>>

Virtuos86 ★★★★★
()
Ответ на: комментарий от gh0stwizard

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

Перевожу. Для PHP нужны специальные «осиляторы» с повышенным уровнем дисциплины, которые могут скомпенсировать грязность языка.

Иль думаешь, что на яве г-кода не пишут, да, в продакшене?

Я не думаю, я знаю. На яве гораздо сложнее писать говнокод и его реально меньше.

Зачем тебе питон если есть ява? Что слабо писать абсолютно все на яве? Слабо. Так и не рыпайся.

Че, уже сказать нечего, пошел словесный понос?

dizza ★★★★★
()
Ответ на: комментарий от drBatty

нет у нас стандартных исключений, смирись. Есть куча костылей.

Зачем мириться, если можно забить на PHP и воспользоваться приличным языком?

Что до strpos, то -1 тоже имеет смысл, например в контексте substr() это смещения от конца строки, а не от начала.

Ну так nullable же.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.