
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.9.170] |
![]() |
|
Страницы: (7) « Первая ... 2 3 [4] 5 6 ... Последняя » все ( Перейти к последнему сообщению ) |
Сообщ.
#46
,
|
|
|
Хмм... Сам я goto ПОЧТИ не юзаю, но глупо считать него ненужным или тем более вредным(особенно если он ведёт на метку с толковым названием, типа extremal_error_exit
![]() Если кто-то (физически близко находящийся : )) мне скажет, что лучше написать лишних десять строк кода, чем поставить goto -- серьёзно рискует получить увечья. И не за наличие мнения по теме, а за то, что не сможет ответить за базар (т.е. обосновать своё высказывание) А вообще, здесь не место для флейма (да он и вовсе неуместен, надо просто банить тех кто немотивированно орёт "goto отстой" : ) ), есть специальный холивар на эту тему. ЗЫ. И не надо мне говорить, что пять вложенных if, физически не помещающихся в один экран кода, нагляднее (даже звучит-то тупо...), чем 2 goto, указывающих на одну и ту же метку. И ещё одно "зы": Вот примерно так выглядит структура case select на пхп: ![]() ![]() switch ($a){ case 1: echo "1"; break; case 2: echo "2"; break; default: echo "not 1, not 2." break; } так вот, пославлю ПЛЮС тому, кто сможет ВНЯТНО сказать, чем вот такой вариант был бы хуже (синтаксис условный, это НЕ работает): ![]() ![]() switch ($a){ case 1: echo "1"; goto end_select; case 2: echo "2"; goto end_select; default: echo "not 1, not 2." goto end_select; } label end_select: разница только в том, что в оригинале слово goto с переходом на подразумеваемую_метку заменено специальным аналогом - словом break. Просто для того, чтоб не было goto. |
Сообщ.
#47
,
|
|
|
BlackSnake
Цитата switch ($a){ case 1: echo "1"; goto end_select; case 2: echo "2"; goto end_select; default: echo "not 1, not 2." goto end_select; } label end_select: зачем здесь Goto, если после Case идет эта метка label end_select:, ведь выполнится только что-то одно, что первое подойдет по условию, и сразу уйдет за пределы Case, на то, что стоит после него. Ведь принцип работы Case, выполнять одно условие. Или я чего-то не догоняю. |
Сообщ.
#48
,
|
|
|
Цитата Dr._S @ Ведь принцип работы Case, выполнять одно условие. Или я чего-то не догоняю. Сразу заметно, что не сишник-) Добавлено Совершенно голословное утверждение. Всякому фрукту свое время. В том числе и GoTo. Блин, холивар продолжается ![]() |
![]() |
Сообщ.
#49
,
|
|
Цитата Демо @ Блин, холивар продолжается Ну, пока всё идет достаточно спокойно. Главное - держите себя в руках, и модераторы вас не тронут ![]() |
![]() |
Сообщ.
#50
,
|
|
goto не использую, не возникает необходимости...
только как временная мера... Цитата BlackSnake @ switch ($a){ case 1: echo "1"; goto end_select; case 2: echo "2"; goto end_select; default: echo "not 1, not 2." goto end_select; } label end_select: а зачем? просто чтобы было? все какую-то синтетику, в качестве примеров приводят покажи кусок кода из реального проекта, где goto тебе помогло(сократило, улучшило читабельност кода и тд) |
Сообщ.
#51
,
|
|
|
Демо,
Цитата да, не сишник, этого не знал, теперь понятно, уже почитал. В этом случае, на мой взгляд проще обойтись break;, чем лишняя метка. Сразу заметно, что не сишник-) |
Сообщ.
#52
,
|
|
|
BlackSnake
Цитата кто сможет ВНЯТНО сказать, чем вот такой вариант был бы хуже Тем что придется писать "goto end_select", что на 10 символов длиннее break ![]() |
Сообщ.
#53
,
|
|
|
хмм... пока никто ничего ОБЪЕКТИВНОГО не сказал...
Цитата Dr._S, 21.02.2006, 12:17:11, 1022622 В этом случае, на мой взгляд проще обойтись break;, чем лишняя метка. видишь ли в чём дело... эта метка ЕСТЬ ВСЕГДА (просто для программера она неопределена, только для компилятора/интерпретатора), и break; - это всего лишь СИНОНИМ goto end_case_label. Цитата Shaggy, 21.02.2006, 11:28:15, 1022576 а зачем? просто чтобы было? все какую-то синтетику, в качестве примеров приводят покажи кусок кода из реального проекта, где goto тебе помогло(сократило, улучшило читабельност кода и тд) это не синтетика, а кусок реального проекта ![]() или ты структурой case select не пользуешься? имхо, далеко не самая читабельная вещь, особенно если растянуть её строк так на тысячу. (принципиально не выделяю бессмысленных функций) |
![]() |
Сообщ.
#54
,
|
|
Цитата BlackSnake @ эта метка ЕСТЬ ВСЕГДА (просто для программера она неопределена, только для компилятора/интерпретатора), и break; - это всего лишь СИНОНИМ goto end_case_label. да, но ЯВУ позволяют абстрагироваться от деталей реализации пусть она и существует, но мне та этот счёт напрягаться не нужно, это головная боль компилятора Цитата BlackSnake @ показывает, как плохо БЕЗ goto. ![]() Цитата BlackSnake @ или ты структурой case select не пользуешься? я Delphi`ст, там эти бряки не нужны совершенно ![]() |
Сообщ.
#55
,
|
|
|
тебе никогда не приходилось набивать код такими комментами? а я такое и сам бывает пишу, и чужое часто вижу (прим: в релизах, даже в опен-сорсных, часто потёрта значительная часть каментов, которые были поставлены разработчиками "для себя")
![]() ![]() //это скобка от блока If в самом начале. если обращение //прямое, без субдомена, портал неактивен и выполнение //продолжается со строки, следующей за скобкой. } вот ещё пример: ![]() ![]() } echo "</div>"; } } echo "</div>"; } }}} else { очень понятно, что где? Учти, что парная открывающая скобка от полследней закрывающей - на 1200 строк выше, следующие две - примерно на 800 и 700 строк, причём там (между 1й и 2й скобками ещё несколько циклов, два селекта и несколько ифов, каждый со своими наборами скобок) и ты хочешь сказать, что это УДОБНЕЕ меток??? ![]() Грустно... как людям паскальщики мозг промыли... |
![]() |
Сообщ.
#56
,
|
|
Цитата BlackSnake @ и ты хочешь сказать, что это УДОБНЕЕ меток??? НЕТ ![]() Цитата BlackSnake @ на 1200 строк выше, следующие две - примерно на 800 и 700 строк, такую функцию писать, а тем более отлаживать НЕ СТАНУ! здоровье дороже |
Сообщ.
#57
,
|
|
|
BlackSnake 1200 строк - это сила..... Нельзя было на функции разбить?
У меня лично (хоть я и не считаю себя хорошим программистом) больше 50-60 строк функция не занимает.... И никаких проблем нету. И я почти уверен в том, что любую программу можно разбить на короткие функции. |
Сообщ.
#58
,
|
|
|
Цитата Lucifer, 22.02.2006, 01:00:12, 1023281 BlackSnake, а неписать такие длинный функции ты не пробовал? Мартин Файлер "Рефакторинг". И мозги мне никто не промывал. насчёт длинных функций - я НИКОГДА не выделяю код в отдельную функцию, если это не несёт СМЫСЛОВОЙ НАГРУЗКИ, и если он непериодичен. более того, иногда я разворачиваю функции в периодический код, ради оптимизации ВЫПОЛНЕНИЯ. когда речь идёт о пхп, всё ещё сложнее... из-за отсутствия goto нередко приходится идти на вообще немыслимые извращения, ради того, чтобы не набивать код чем-нить типа die(); вот недавний пример: скрипт, выполняющий ПОСЛЕДОВАТЕЛЬНОСТЬ действий (заполняешь форму, жмёшь сабмит, ЭТОТЖЕ скрипт обрабатывает результат и выдаёт другую форму, и так несколько раз.)... в конечном итоге я развернул его в структуру select case, по полученным данным определяющую, какую форму давать теперь, и выбирающую одну из функций, анализирующих данные и генерящих новую форму, но это было неправильной и ВЫНУЖДЕННОЙ мерой, нарушающей прЫнцЫпы структурного программинга и ДЕЙСТВИТЕЛЬНО затрудняющей разбор кода... Функция должна только анализировать данные и возвращать результат, а применение функции в качестве контейнера кода - вообще-то, изврат. упомянутую книгу, к сожалению (а может и без сожаления, не прочитав не узнать), я даже не видел. насчёт "промывки мозгов" - если ты пользуешься паскалем - значит промывали. Паскаль именно для этого и предназначен, почитай о истории языка. (об этом я уже говорил в соответствующем холиваре.) Вообще же, сам я в состоянии разобратся в любом коде (разумеется, на знакомом языке), особенно если код грамотно комментирован. (в МОЁМ коде - не менее 10% - комменты.) И я искренне считаю, что писАть надо так, чтобы: а) было удобно писаАть. б) оптимизировать выполнение кода. И если ради оптимизации time-critical участка мне придётся отказаться от ООП, и соорудить код, где каждая пятая строка - goto, а функции развёрнуты в периодики, я не буду колебаться ни секунды. (разумеется, только в том случае, если стандарные приёмы оптимизации, вроде кэширования свойств объектов и применения архитектурно-совместимых величин (для Win32 это означает, что все переменные,какие удастся, описываются как Long. Это даёт до 7% прироста эффективности.), окажутся недостаточными) |
Сообщ.
#59
,
|
|
|
BlackSnake,
Цитата я уже про это писал, что если накатать две проги, одинаковые по функциональности, откомпилить, а птом дизассемблировать и посмотреть тот участок, где есть и где нету Goto, то они ничем не будут отличаться.видишь ли в чём дело... эта метка ЕСТЬ ВСЕГДА (просто для программера она неопределена, только для компилятора/интерпретатора), и break; - это всего лишь СИНОНИМ goto end_case_label. Пример: ![]() ![]() Dim i As Integer, j As Integer If Second(Time) / 2 <> Int(Second(Time) / 2) Then GoTo 1 For i = 1 To 100 j = j + i Next i 1: MsgBox j ![]() ![]() Dim i As Integer, j As Integer If Second(Time) / 2 = Int(Second(Time) / 2) Then For i = 1 To 100 j = j + i Next i End If MsgBox j Мне кажется, что это бессмысленный спор, в итоге каждый останется при своем мнении и никто никому ничего не докажет, да и в этом нет смысла. |
Сообщ.
#60
,
|
|
|
Цитата BlackSnake @ a) Удобно читать - что означает "удобно отлаживать" и удобно "сопровождать". После того, как мне пришлось поучаствовать в паре проектов по отладке/сопровождению "чужого" кода, я ставлю это на первое место. Да и в своем коде, через пару лет после написания ... ой-ой-ой.И я искренне считаю, что писАть надо так, чтобы: а) было удобно писаАть. б) оптимизировать выполнение кода. б) оптимизировать выполнение кода (но только если это на самом деле необходимо - иначе - ассемблер в руки, или может в машинных кодах?) в) было удобно писАть. Если на а) стояло бы "оптимизировать выполнение кода" языки высокого уровня просто бы никогда не появились, про интерпретаторы я вообще молчу. Цитата BlackSnake @ Лучше хотя бы на секунду задуматься - "а это на самом деле time-critical?" Часто натыкAлся на код по приему нек. информации по нек. соединению, очень-очень "таймекритично соптимизированный", после которого шел код по обработке этой информации, который просто физически не успевал да и не мог поспеть за этим оптимизированным потоком данных - и кому было нужно торопиться?И если ради оптимизации time-critical участка мне придётся отказаться от ООП, и соорудить код, где каждая пятая строка - goto, а функции развёрнуты в периодики, я не буду колебаться ни секунды. Цитата BlackSnake @ Что-то это как-то поверхностно звучит, точнее, не по-боюсь этого слова, - по-дилетански. Скорее "для 32-х разрядной ОС на 32-разрядном процессоре, для поддерживающего такой процессор компиляторе и то - не всегда (для Win32 это означает, что все переменные,какие удастся, описываются как Long. Это даёт до 7% прироста эффективности.), окажутся недостаточными) ![]() ![]() Цитата Dr._S @ Закоренелые - остнуться, а "сомневающиеся" будут смотреть на аргументы. Единственным стОящим аргументом за goto было подмена break в switch, но Люцифер его опроверг одним мановением руки Мне кажется, что это бессмысленный спор, в итоге каждый останется при своем мнении и никто никому ничего не докажет, да и в этом нет смысла. ![]() |