Re[3]: Вместо if-ов
От: Alex Alexandrov США  
Дата: 27.09.05 05:33
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Здравствуйте, Erop, Вы писали:


E>>Предлагаю делать так:


E>>
E>>if (!_CreateDir(sFile)) {
E>>    //    возможно обработка ситуации
E>>    return false;
E>>}
E>>if (!CopyFile(lpszTemp, sFile, FALSE)) {
E>>    //    опять возможна обработка ошибочной ситуации
E>>    return false
E>>}
E>>    return _tcsicmp(m_lpszFile, sFile);

E>>И понятно, и отлаживать удобно и поддерживать и доп. диагностику есть куда вставлять -- идеальный вариант однако

GN>Идеальный, если можно делать return;.


2 вопроса:

1. А почему может быть нельзя делать return?
2. (вытекающий из ответа на первый ) А мы про C или про C++ говорим?
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
It's kind of fun to do the impossible (Walt Disney)
Re[3]: Вместо if-ов
От: Chez Россия  
Дата: 27.09.05 06:42
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>1. А если хоть одна функция в этой последовательности void ?


PD>Сорри, не совсем точно выразился. Я имею в виду, что внутри if ставится код в {}, и в нем вызываются void функции. Или что-то еще.

В данном случае operator , может быть заюзан (вместо ; )

Chez, ICQ#161095094

Posted via:RSDN@Home;version:1.1.3;muzikstamp:silent

Re[2]: Вместо if-ов
От: Chez Россия  
Дата: 27.09.05 06:42
Оценка:
Здравствуйте, Erop, Вы писали:

E>И понятно, и отлаживать удобно и поддерживать и доп. диагностику есть куда вставлять -- идеальный вариант однако

E>(Всё ИМХО, ясень фуясень
Ну, имхо, это ещё страшнее, чем просто куча вложенных if-ов.
Потому что код растёт очень сильна как. Я так раньше писал, но разочаровался.

А если ещё требуется какая-то зачистка перед выходом, то это вообще почти неприемлемый вариант: либо юзай "goto finish" вместо return, либо Copy-Paste.

Chez, ICQ#161095094

Posted via:RSDN@Home;version:1.1.3;muzikstamp:silent

Re[3]: Вместо if-ов
От: ssm Россия  
Дата: 27.09.05 07:58
Оценка:
Здравствуйте, gear nuke, Вы писали:


GN>Идеальный, если можно делать return;.


если нельзя сделать return, всегда можно сделать break в фиктивном do{...}while(false);
Re[4]: Вместо if-ов
От: Chez Россия  
Дата: 27.09.05 08:36
Оценка: +1
Здравствуйте, ssm, Вы писали:

ssm>Здравствуйте, gear nuke, Вы писали:



GN>>Идеальный, если можно делать return;.


ssm>если нельзя сделать return, всегда можно сделать break в фиктивном do{...}while(false);

Ж)
Уж тогда лучше "goto".

Chez, ICQ#161095094

Posted via:RSDN@Home;version:1.1.3;muzikstamp:silent

Re[3]: Вместо if-ов
От: CrystaX Россия https://crystax.me/
Дата: 27.09.05 08:53
Оценка: +1
Здравствуйте, Chez, Вы писали:

R>>ИМХО данная записть основана на том что при разборе логических выражений выхдй из отношения "&&" происходит сразу же если текущий оператор равен 0 (тек поступают большинство компиляторов). Но никто не запрещает компилятору разбирато логические выражения полностью. сооьветсвенно он вызовет все функции. А вот отловить этот баг в данном случае будет проблематично.

C>Выделенное курсивом — верно
C>А вот выделенное жирным неверно — это запрещает Стандарт С++.

Только не в случае перегруженного оператора && для возвращаемых типов — тогда оба подвыражения будут вычислены полностью.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[4]: Вместо if-ов
От: gear nuke  
Дата: 27.09.05 13:59
Оценка:
Здравствуйте, Alex Alexandrov, Вы писали:

GN>>Идеальный, если можно делать return;.


AA>2 вопроса:


AA>1. А почему может быть нельзя делать return?


Не всегда можно вынести часть кода в отдельную функцию.
Например — конечные автоматы (те, которые не table-driven, а забыл как называются )

AA>2. (вытекающий из ответа на первый ) А мы про C или про C++ говорим?


Исходя из ответа, в данном случае нет разницы.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[4]: Вместо if-ов
От: gear nuke  
Дата: 27.09.05 14:06
Оценка: +1
Здравствуйте, ssm, Вы писали:

GN>>Идеальный, если можно делать return;.


ssm>если нельзя сделать return, всегда можно сделать break в фиктивном do{...}while(false);


Не всегда. Цепочка if {} else {} может уже быть внутри цикла while(){}. Только не говорите что можно перейти на D .
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[4]: Вместо if-ов
От: gear nuke  
Дата: 27.09.05 14:13
Оценка:
Здравствуйте, Erop, Вы писали:

GN>>Идеальный, если можно делать return;.


E>Ну я вообще ратую за короткие и простые функции с ясной семантикой


Я тоже, но иногда приходится делать длинные и сложные.

E>Ну а для такого сложного действия, как обсуждается тут (там помнится речь шла о десятке if'ов ) совершенно точно стоит заводить отдельную функцию


ИМХО, если у этой функции будет куча параметров ссылок — только читаемость усложнит.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re: Вместо if-ов
От: Аноним  
Дата: 27.09.05 15:02
Оценка:
Здравствуйте, Chez, Вы писали:

C>Придумалась тут одна шняга, выглядит очень симпатично!

C>Вместо того, чтобы городить конструкции типа:
C>if (_CreateDir(sFile))
C>    if (CopyFile(lpszTemp, sFile, FALSE))
C>        _tcsicmp(m_lpszFile, sFile);
C>
Делать так:
C>_CreateDir(sFile) &&
C>CopyFile(lpszTemp, sFile, FALSE) &&
C>(_tcsicmp(m_lpszFile, sFile), 1); // и т.д. из &&
C>

C>Ну как Вам?

Куда брейкпойнты будем ставить, где талию делать?
Re[5]: Вместо if-ов
От: Centaur Россия  
Дата: 27.09.05 15:03
Оценка: 8 (1)
Здравствуйте, gear nuke, Вы писали:

GN>>>Идеальный, если можно делать return;.


E>>Ну я вообще ратую за короткие и простые функции с ясной семантикой


GN>Я тоже, но иногда приходится делать длинные и сложные.


E>>Ну а для такого сложного действия, как обсуждается тут (там помнится речь шла о десятке if'ов ) совершенно точно стоит заводить отдельную функцию


GN>ИМХО, если у этой функции будет куча параметров ссылок — только читаемость усложнит.


В случае, если приходится разбирать на запчасти функцию с большим количеством внутренних переменных, используется рефакторинг Replace Method with Method Object [Martin Fowler et al. Refactoring: Improving the Design of Existing Code, глава 6].

You have a long method that uses local variables in such a way that you cannot apply Extract Method.

Turn the method into its own object so that all the local variables become fields on that object.
You can then decompose the method into other methods on the same object.


Mechanics
Stolen shamelessly from Beck [Beck].

Now comes the fun part. Because all the local variables are now fields, you can freely decompose the method without having to pass any parameters.

Re[6]: Вместо if-ов
От: Глеб Алексеев  
Дата: 27.09.05 15:10
Оценка:
Здравствуйте, Centaur, Вы писали:

C>В случае, если приходится разбирать на запчасти функцию с большим количеством внутренних переменных, используется рефакторинг Replace Method with Method Object [Martin Fowler et al. Refactoring: Improving the Design of Existing Code, глава 6].

У Саттера авторство Фаулера/Бека не упоминалось, но предлагалось то же самое под С++-соусом — превратить функцию в function-object (т.е. вместо compute() — operator()).
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: Вместо if-ов
От: gear nuke  
Дата: 27.09.05 15:27
Оценка:
Здравствуйте, Centaur, Вы писали:

C>В случае, если приходится разбирать на запчасти функцию с большим количеством внутренних переменных, используется рефакторинг Replace Method with Method Object [Martin Fowler et al. Refactoring: Improving the Design of Existing Code, глава 6].


Спасибо, но это решение для общего случая.
А частный случаи бывают разные. Например, лексер для JIT компилятора, для которого важнейшим фактором является скорость работы. Table-driven автоматы и прочие вкусности плохо подходят под это условие. Ну и читаемость кода там важна только на момент написания, потомучто — написал и забыл.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[2]: Вместо if-ов
От: gear nuke  
Дата: 27.09.05 17:06
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Куда брейкпойнты будем ставить


Эти вопросы уже задавали...Re[3]: Вместо if-ов
Автор: gear nuke
Дата: 26.09.05


А>где талию делать?


А что это?
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[5]: Вместо if-ов
От: Alex Alexandrov США  
Дата: 28.09.05 05:18
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Не всегда можно вынести часть кода в отдельную функцию.

GN>Например — конечные автоматы (те, которые не table-driven, а забыл как называются )

Имеется в виду НКА? Не совсем понятно, почему нельзя его разбить на несколько функций. Рекурсия мешает? Впрочем, я не большой специалист в области конечных автоматов, поэтому просто заглянул в исходники PCRE — Perl Compatible Regular Expressions, как отличный пример НКА реализации на C. Безумных вложений условных конструкций не нашел.

AA>>2. (вытекающий из ответа на первый ) А мы про C или про C++ говорим?


GN>Исходя из ответа, в данном случае нет разницы.


Судя по всему, все-таки есть. Ибо как пример с невозможностью разбить код на несколько функций несколько надуман. В конце концов, inline функции еще никто не отменял. Это закон жанра: код должет быть либо удобочитаемым, либо автогенерируемым из чего-то удобочитаемого. Все остальное — от лукавого.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
It's kind of fun to do the impossible (Walt Disney)
Re[6]: Вместо if-ов
От: gear nuke  
Дата: 28.09.05 06:46
Оценка:
Здравствуйте, Alex Alexandrov, Вы писали:

GN>>Не всегда можно вынести часть кода в отдельную функцию.

GN>>Например — конечные автоматы (те, которые не table-driven, а забыл как называются )

AA>Имеется в виду НКА?


Детерминированные\недетерминированные — это классификация по другому принципу. Я имею ввиду, что обычно адреса переходов лежат в массиве-таблице, потом оттуда вытаскиваются и используются. Мне это не подходит — скорость критична, а на косвенной адресации она теряется. Поэтому приходится городить условные переходы.

AA>Не совсем понятно, почему нельзя его разбить на несколько функций. Рекурсия мешает? Впрочем, я не большой специалист в области конечных автоматов, поэтому просто заглянул в исходники PCRE — Perl Compatible Regular Expressions, как отличный пример НКА реализации на C. Безумных вложений условных конструкций не нашел.


PCRE и всё остальное — это хорошо, но это С. У меня же от С только язык написания, реально char'ы обрабатываются по 1, 2 или 4 за операцию. Другими словами, переписывается код с ассемблера . Безумных конструкций нет, просто длинные они.

AA>>>2. (вытекающий из ответа на первый ) А мы про C или про C++ говорим?


GN>>Исходя из ответа, в данном случае нет разницы.


AA>Судя по всему, все-таки есть. Ибо как пример с невозможностью разбить код на несколько функций несколько надуман. В конце концов, inline функции еще никто не отменял.


Проблема скорее в удобстве написания чернового варианта — так весь код перед глазами, и если правится в одном месте, то сразу видны зависимости. Функции же скрывают реализацию, поэтому несложно что-то пропустить.

AA>Это закон жанра: код должет быть либо удобочитаемым, либо автогенерируемым из чего-то удобочитаемого. Все остальное — от лукавого.


Не всегда это верно — ассемблер считается плохочитаемым, но его всё равно используют когда нужно. Так что, у меня тут по читаемости можно даже сказать прогресс .
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[7]: Вместо if-ов
От: Alex Alexandrov США  
Дата: 03.10.05 18:38
Оценка:
Здравствуйте, gear nuke, Вы писали:

[...]

GN>Проблема скорее в удобстве написания чернового варианта — так весь код перед глазами, и если правится в одном месте, то сразу видны зависимости. Функции же скрывают реализацию, поэтому несложно что-то пропустить.


AA>>Это закон жанра: код должет быть либо удобочитаемым, либо автогенерируемым из чего-то удобочитаемого. Все остальное — от лукавого.


GN>Не всегда это верно — ассемблер считается плохочитаемым, но его всё равно используют когда нужно. Так что, у меня тут по читаемости можно даже сказать прогресс .


Все-таки какая-то у тебя весьма специфическая область деятельности. Только никак не могу понять по постам точно — какая. С одной стороны, вроде как Rev. Eng. С другой, в оптимизации тоже шаришь. Похоже, что ты чьи-то оптимизированные бинарники в C/C++ перегоняешь.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
It's kind of fun to do the impossible (Walt Disney)
Re[8]: Вместо if-ов
От: gear nuke  
Дата: 03.10.05 20:18
Оценка:
Здравствуйте, Alex Alexandrov, Вы писали:

AA>Все-таки какая-то у тебя весьма специфическая область деятельности. Только никак не могу понять по постам точно — какая. С одной стороны, вроде как Rev. Eng. С другой, в оптимизации тоже шаришь.


Оптимизацию необходимо понимать, поскольку не всё скомпилировано трансляторами от Борланд .
Да и не верю я, что компиляторы могут сделать конфетку из абы как написанного кода, поэтому стараюсь им помогать.

AA>Похоже, что ты чьи-то оптимизированные бинарники в C/C++ перегоняешь.


В данном случае — свои сорцы написанные на С-- (компилятор не справляется, при компиляции проявляются баги ). Но бывает и чужие нужно. Поэтому и пытаюсь создать компилятор, который будет понимать ассемблер, являющийся одновременно и валидным С.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re: Вместо if-ов
От: ДимДимыч Украина http://klug.org.ua
Дата: 03.10.05 22:50
Оценка:
Здравствуйте, Chez, Вы писали:

C>Придумалась тут одна шняга, выглядит очень симпатично!

C>Вместо того, чтобы городить конструкции типа:
C>if (_CreateDir(sFile))
C>    if (CopyFile(lpszTemp, sFile, FALSE))
C>        _tcsicmp(m_lpszFile, sFile);
C>
Делать так:
C>_CreateDir(sFile) &&
C>CopyFile(lpszTemp, sFile, FALSE) &&
C>(_tcsicmp(m_lpszFile, sFile), 1); // и т.д. из &&
C>


Если в такой
Автор: ДимДимыч
Дата: 07.09.05
задаче — имхо приемлимо , но в Вашем случае — по рукам бы надавал . Хотя бы потому что обычно нужно анализировать, почему директория не создалась или файл не скопировался, и выполнять соответствующие действия, например сообщение пользователю выплюнуть.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[2]: Вместо if-ов
От: lpvoid Россия  
Дата: 04.10.05 04:33
Оценка:
Вся эта тема больше похожа на бурю в стакане. Все хорошо на своем месте.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.