Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.149.213.209] |
|
Страницы: (32) « Первая ... 3 4 [5] 6 7 ... 31 32 ( Перейти к последнему сообщению ) |
Сообщ.
#61
,
|
|
|
Цитата D_KEY @ Не-не-не. Я не спорю. RAII - это отличная штука. Я ей постоянно пользуюсь. Я к тому, что глупо категорично заявлять, что goto никогда не надо использовать. Иногда, очень редко, goto оказывается проще, быстрее и понятнее, чем что-либо другое. Так не для этого городить надо. Идиома RAII тем хороша, что ты с одной стороны, знаешь, когда и что произойдет, а с другой - не делаешь это руками, т.к. все происходит в автоматическом режиме. На этом фоне даже finally выглядит костылем, а ты про goto... |
Сообщ.
#62
,
|
|
|
Цитата applegame @ Иногда, очень редко, goto оказывается проще, быстрее и понятнее, чем что-либо другое Конкретный пример в студию. |
Сообщ.
#63
,
|
|
|
Цитата michspar @ Был выше. Но похоже некоторым нравится дописывать еще десяток строк, лишь бы не нарушать табу.Конкретный пример в студию. Почитайте: http://habrahabr.ru/post/114211/ |
Сообщ.
#64
,
|
|
|
Да-да. Всё околоайтишное говницо со всего СНГ оседает именно на хабре.
На самом деле даже в том рафинированном примере, будь A, B, C, D, E более одной строчки, или как там написано: Цитата Даже тот вырвиглазный ужос во втором примере будет более понятен, нежели неизвестно куда ведущие goto. Закручивающие в циклы и ветвления (ветвлениz прямо во внутрь цикла sic!), по неочевидным (а после того, как код перестанет быть тривиальным -- так и вообще не понятным) условиям, которые через месяц не сможет разобрать даже их автор. это некоторые операции, а не вызов функции! Вполне возможно, что они используют массу локальных переменных. И вполне возможно, что они меняют их состояние. |
Сообщ.
#65
,
|
|
|
Цитата Повстанець @ Даже тот вырвиглазный ужос во втором примере будет более понятен, нежели неизвестно куда ведущие goto. Закручивающие в циклы и ветвления (ветвлениz прямо во внутрь цикла sic!), по неочевидным (а после того, как код перестанет быть тривиальным -- так и вообще не понятным) условиям, которые через месяц не сможет разобрать даже их автор. Зачем рыть себе могилу? Ты просто накладываешь на использование goto шаблон, по которому этот код у тебя обязательно разрастется до более чем 1 строчки, и станет до жути не понятным и запутанным. Так ты просто не юзай в этих местах goto. Юзай его там, где он не будет усложнять логику и запутывать программиста. А то как послушаешь так на словах все такие рассякие, у всех функции не больше 80 строк, ни у кого нет вложенных циклов, ни у кого нет костыльных dynamic/static/reinterped/const кастов. У всех все просто кульно и круто. А на деле, практически любой код содержит в себе запутанные места, вложенные циклы, либо переизбыток функций в классах, всякие магические касты, непонятные и запутанные алгоритмы и т.д. |
Сообщ.
#66
,
|
|
|
Цитата KILLER @ Это не мой пример, а того чудака с хабра. Я даже знаю как он его придумывал:Зачем рыть себе могилу? Ты просто накладываешь на использование goto шаблон, по которому этот код у тебя обязательно разрастется до более чем 1 строчки, и станет до жути не понятным и запутанным. Так ты просто не юзай в этих местох goto. Юзай его там, где он не будет усложнять логику и запутывать программиста. Сидит, значит, надо мол что то изообразить. Нарисовал схему. Не, не получается не обойтись без goto. Добавил ещё блоков, ч0рт -- опять не получается. Добавил стрелочик... та ну ёшкин кот... снова не то. И так пока совсем что то вырвиглазного не вышло. |
Сообщ.
#67
,
|
|
|
А то вон, помню один в тематике написал типа:
some_value SomeFunc(bool bFlag) { switch(bFlag) { case true: ... break; case false: ... break; } } Ну вообще как красиво и понятно все... Так и напрашивается default сюда Добавлено Цитата Повстанець @ Это не мой пример, а того чудака с хабра. Я даже знаю как он его придумывал: Сидит, значит, надо мол что то изообразить. Нарисовал схему. Не, не получается не обойтись без goto. Добавил ещё блоков, ч0рт -- опять не получается. Добавил стрелочик... та ну ёшкин кот... снова не то. И так пока совсем что то вырвиглазного не вышло. Не, я к тому, что не стоит так категорично относится к goto, в некоторых случаях он всетаки полезен и не запутывает, а юзать его с целью запутать программиста - ну так это уже ССЗБ. |
Сообщ.
#68
,
|
|
|
Цитата applegame @ Был выше. Вот этот-то? Цитата applegame @ Иногда goto вполне себе хорош. Была ситуация, когда в относительно длинной функции в нескольких местах надо было прервать выполнение, сделать несколько операций и выйти из функции. Наиболее простым и понятным вариантом оказался вариант с goto: int foo() { ... goto end; ... goto end; ... goto end; ... end: ... return; } Так что goto иногда можно и должно применять. Религиозные фанатики идут лесом. Так я тоже писал, как его правильно реализовывать надо. И это не костыль для обохода goto. Это разделение частей кода на логические части. |
Сообщ.
#69
,
|
|
|
Читал. Автор предлагает (синтетическую, кстати) схему: реализовать с помощью goto вот так: if (a) { A; goto L3; } L1: if (b) { L2: B; L3: C; goto L1; } else if (!c) { D; goto L2; } E; Но, во избежание goto, приводит какой-то монструозный вариант (который я тут даже показывать не хочу), вместо того, чтобы приложить мозг и родить хотя бы что-нибудь такое: bool a, b, c; if ( a ) { A(); C(); } do { while ( b ) { B(); C(); } if ( c ) break; D(); B(); C(); } while ( true ); E(); И тут (внезапно) выясняется, что в этом алгоритме два цикла, один вложеный в другой. А если ещё и добавить контекста, то полюбому получится, что задачу можно решить, разложив алгоритм на подалгоритмы, чтобы такая безумная схема не понадобилась в принципе. Goto действительно легче. Для того, кто пишет, потому что позволяет сериализовывать мысли в код с минимумом усилий. Как правильно тут уже упоминали, такой код - это write only код и в продакшене нам такой код не нужен |
Сообщ.
#70
,
|
|
|
michspar, ваш пример скопипастен из того же холивара на хабре, там же читайте возражения.
Добавлено Цитата Повстанець @ Отличная аргументация. Да-да. Всё околоайтишное говницо со всего СНГ оседает именно на хабре. |
Сообщ.
#71
,
|
|
|
Цитата applegame @ Что могу сказать? Какие аргументы, такие и контраргументы. Просто ахренительная аргументация. |
Сообщ.
#72
,
|
|
|
Цитата Повстанець @ Откровенная ложь с честными глазами. Что могу сказать? Какие аргументы, такие и контраргументы. |
Сообщ.
#73
,
|
|
|
Цитата applegame @ ваш пример скопипастен из того же холивара на хабре Глубоко не вчитывался. Честно выдумал находу. Нечего возразить? Так и запишем. |
Сообщ.
#74
,
|
|
|
Цитата michspar @ Иногда такое разделение только ухудшает читабельность кода. Собственно тут повторяются аргументы из комментов статьи на хабре. Так я тоже писал, как его правильно реализовывать надо. И это не костыль для обохода goto. Это разделение частей кода на логические части. Добавлено Цитата michspar @ Вы товарищ, похоже сам с собой разговариваете. Нечего возразить? Так и запишем. Добавлено А по существу, ваши A(), B() и.т.п. могут требовать доступ к неким локальным переменным. И что теперь каждый раз их передавать внутрь этих функций? Отличное решение и, главное, такое прозрачное. |
Сообщ.
#75
,
|
|
|
Вот неотвеченый пример из конца того же холивара:
public int[,] ReadByCoil( out int npts ) { int[,] res = null; npts = 0; if ( m_curArea != 0 ) goto _1; _2: if ( !StartNewSect() ) return null; _1: res = ReadCoil(); if ( res == null ) goto _2; npts = m_npt; return res; } Очевидно же: public int[,] ReadByCoil( out int npts ) { int[,] res = null; npts = 0; if ( m_curArea == 0 && !StartNewSect() ) return null; res = ReadCoil(); if ( res == null ) goto _2; npts = m_npt; return res; } Добавлено Цитата applegame @ ваши A(), B() и.т.п. могут требовать доступ к неким локальным переменным... Цитата michspar @ если ещё и добавить контекста, то полюбому получится, что задачу можно решить, разложив алгоритм на подалгоритмы, чтобы такая безумная схема не понадобилась в принципе |