C>_CreateDir(sFile) &&
C>CopyFile(lpszTemp, sFile, FALSE) &&
C>(_tcsicmp(m_lpszFile, sFile), 1); // и т.д. из &&
C>
C>Плюсы и минусы (ИМХО): C>+++ меньше кода писать C>+++ нет лишних табуляций, код получается проще C>-- не очевидно C>- не так удобно отлаживать
C>вместо then используется && C>вместо else — ||. C>при желании можно комбинировать с другими операторами, заключать в скобки...
C>Ну как Вам? C>Стоит ли мопед свеч?
Можно воспользоваться исключениями.
Если не поможет, будем действовать током... 600 Вольт (C)
Здравствуйте, -MyXa-, Вы писали:
MX>Здравствуйте, Chez, Вы писали:
C>>Придумалась тут одна шняга, выглядит очень симпатично! C>>Вместо того, чтобы городить конструкции типа:
C>>_CreateDir(sFile) &&
C>>CopyFile(lpszTemp, sFile, FALSE) &&
C>>(_tcsicmp(m_lpszFile, sFile), 1); // и т.д. из &&
C>>
C>>Плюсы и минусы (ИМХО): C>>+++ меньше кода писать C>>+++ нет лишних табуляций, код получается проще C>>-- не очевидно C>>- не так удобно отлаживать
C>>вместо then используется && C>>вместо else — ||. C>>при желании можно комбинировать с другими операторами, заключать в скобки...
C>>Ну как Вам? C>>Стоит ли мопед свеч?
MX>Можно воспользоваться исключениями.
В любом случае, по закону strong exception safety guarantee, желательно, чтобы созданная директория удалялась, буде не удастся скопировать файл. Так что мопед тот ещё
Если не поможет, будем действовать током... 600 Вольт (C)
Здравствуйте, Chez, Вы писали:
C>Плюсы и минусы (ИМХО): C>+++ меньше кода писать C>+++ нет лишних табуляций, код получается проще C>-- не очевидно C>- не так удобно отлаживать
C>вместо then используется && C>вместо else — ||. C>при желании можно комбинировать с другими операторами, заключать в скобки...
C>Ну как Вам? C>Стоит ли мопед свеч?
НЕТ!
плюсы сомнительны, минусы огромны.
оставляй координаты для тех, кто такое будет сопровождать. Бить будут.
Минус — это уже половина плюса, а плюс — это, порой, целых два минуса...
Здравствуйте, -MyXa-, Вы писали:
MX>В любом случае, по закону strong exception safety guarantee, желательно, чтобы созданная директория удалялась, буде не удастся скопировать файл. Так что мопед тот ещё
Ну, тут эти функции приведены только как пример. Они не имеют непосредственного отношения к вопросу.
Здравствуйте, -MyXa-, Вы писали:
MX>Можно воспользоваться исключениями.
Конечно можно. Но как вам такая структура, применяемая как замен if-ам?
Ведь даже в exception-oriented-коде довольно часто встречаются такие вещи...
Здравствуйте, Сергей Мухин, Вы писали:
СМ>НЕТ!
СМ>плюсы сомнительны, минусы огромны. СМ>оставляй координаты для тех, кто такое будет сопровождать. Бить будут.
Аргументы?
СМ> Минус — это уже половина плюса, а плюс — это, порой, целых два минуса...
Здравствуйте, Chez, Вы писали:
C>Здравствуйте, Сергей Мухин, Вы писали:
СМ>>НЕТ!
СМ>>плюсы сомнительны, минусы огромны. СМ>>оставляй координаты для тех, кто такое будет сопровождать. Бить будут.
C>Аргументы?
1. +++ меньше кода писать
на сколько меньше? на 5% и это пишется один раз, а читается десятки, еще отлаживается и еще сопровождается несколько лет
2. +++ нет лишних табуляций, код получается проще
какие табуляции? с чего вы взяли что проще? сделайте условие посложней и сами запутаетесь в скобках
3. -- не очевидно
см п.1
4. — не так удобно отлаживать
см п.1
много ли вы видели нормальных программ, написанных в таком стиле?
Здравствуйте, sch, Вы писали:
sch>Здравствуйте, Chez, Вы писали:
C>>Придумалась тут одна шняга, выглядит очень симпатично!
sch>Собственно говоря, все новое это хорошо забытое старое -- подобные конструкции довольно давно используются, например на Perl.
Еще это чем-то напоминает Пролог. Код на Прологе
Здравствуйте, Сергей Мухин, Вы писали:
СМ>много ли вы видели нормальных программ, написанных в таком стиле?
Нет, не очень. ИМХО причина лучше всего раскрывается в следующей главе книги Alen I. Holub "Enough Rope to Shoot Yourself in the Foot":
50. Не путайте привычность с читаемостью
(Или синдром "настоящего программиста, который может программировать на любом языке как на ФОРТРАНе").
Многие люди пытаются злоупотреблять препроцессором для того, чтобы придать Си большее сходство с каким-нибудь другим языком программирования.
Например:
#define begin {
#define end }
while ( ... )
begin
// ...
end
Эта практика ничего не дает, кроме того, что ваш код становится нечитаемым для кого-нибудь, кто не знает того языка, который вы стараетесь имитировать. Для программиста на Си код станет менее читаемым, не более того.
Родственная проблема связана с использованием макросов препроцессора для скрытия синтаксиса объявлений Си. Например, не делайте следующего:
typedef const char *LPCSTR;
LPCSTR str;
Подобные вещи вызывают проблемы с сопровождением, потому что кто-то, не знакомый с вашими соглашениями, будет должен просматривать typedef, чтобы разобраться, что происходит на самом деле.
Дополнительная путаница возникает в Си++, потому что читатель может интерпретировать происходящее, как определение объекта Си++ из класса LPCSTR. Большинству программистов на Си++ не придет в голову, что LPCSTR является указателем. Объявления Си очень легко читаются программистами на Си. (Кстати, не путайте вышеупомянутое с разумной практикой определения типа word в виде 16-битового числа со знаком для преодоления проблемы переносимости, присущей типу int, размер которого не определен ни в ANSI Си, ни в ANSI Си++).
К тому же, многие программисты избегают условной операции ?: просто потому, что она им кажется непонятной. Тем не менее, это условное выражение может существенно упростить ваш код и, следственно, сделать его лучше читаемым. Я думаю, что:
Вы к тому же экономите на двух вызовах printf(). Мне также часто приходится видеть неправильное использование операций ++ и --. Весь смысл автоинкремента или автодекремента заключается в соединении этих операций с другими. Вместо:
Этот код вполне читаем для компетентного программиста на языке Си, даже если ему нет эквивалентной операции в ФОРТРАНе или Паскале.
Вы также никогда не должны прятать операторы в макросах из-за того, что вам просто не нравится, как они выглядят. Я однажды видел следующее в реальной программе:
Программист намеренно сделал определение структуры труднее читаемым для того, чтобы избежать конфликта имен между полем и совершенно необходимым макросом, и все из-за того, что ему не нравился внешний вид оператора ->. Для него было бы гораздо лучшим
Правила обычного программирования выходом просто назвать поле left_child и совсем избавиться от макроса. Если вы действительно думаете, что программа должна внешне выглядеть как на Паскале, чтобы быть читаемой, то вы должны программировать на Паскале, а не на Си или Си++.
Ваш код вполне понятен и уместен в определённых случаях. Хотя, я бы использовал такой вариант записи:
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
По голове не бить! Это пример как можно, а не как нужно.
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
СМ>>много ли вы видели нормальных программ, написанных в таком стиле?
GN>Нет, не очень. ИМХО причина лучше всего раскрывается в следующей главе книги Alen I. Holub "Enough Rope to Shoot Yourself in the Foot":
GN>Если вы действительно думаете, что программа должна внешне выглядеть как на Паскале, чтобы быть читаемой, то вы должны программировать на Паскале, а не на Си или Си++.[/q]
совершенно лишняя огромная цитата. Никто не спорит, что надо писать на Паскале.
GN>Ваш код вполне понятен и уместен в определённых случаях. Хотя, я бы использовал такой вариант записи: GN>
а давайте теперь представим, что вам надо написать не курсовую, а реальную программу. Несколько вопросов:
1. Куда вставлять диагностику, если CreateDir выдал ошибку?
2. Куда вставлять другую диагностику, если CopyFile выдал ошибку?
3. Если хоть одно условие не сработало, то что произошло? не создалось оглавление или icmp не сравнилось?
СМ>а давайте теперь представим, что вам надо написать не курсовую, а реальную программу. Несколько вопросов: СМ>1. Куда вставлять диагностику, если CreateDir выдал ошибку? СМ>2. Куда вставлять другую диагностику, если CopyFile выдал ошибку?
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
Здравствуйте, Chez, Вы писали:
C>Ну как Вам? C>Стоит ли мопед свеч?
ИМХО данная записть основана на том что при разборе логических выражений выхдй из отношения "&&" происходит сразу же если текущий оператор равен 0 (тек поступают большинство компиляторов). Но никто не запрещает компилятору разбирато логические выражения полностью. сооьветсвенно он вызовет все функции. А вот отловить этот баг в данном случае будет проблематично.
СМ>>а давайте теперь представим, что вам надо написать не курсовую, а реальную программу. Несколько вопросов: СМ>>1. Куда вставлять диагностику, если CreateDir выдал ошибку?
ответа так и нет
СМ>>2. Куда вставлять другую диагностику, если CopyFile выдал ошибку?
GN>Re[3]: Вместо if-ов
Здравствуйте, sch, Вы писали:
sch>Здравствуйте, Chez, Вы писали:
C>>Придумалась тут одна шняга, выглядит очень симпатично!
sch>Собственно говоря, все новое это хорошо забытое старое -- подобные конструкции довольно давно используются, например на Perl. Классический пример:
sch>
sch> open HANDLE, "filename"
sch> or die "Can't open: $!\n";
sch>
еще дольше — Bourn Shell, мой любиvый командный контейнер:
Здравствуйте, Сергей Мухин, Вы писали:
СМ>а давайте теперь представим, что вам надо написать не курсовую, а реальную программу. Несколько вопросов: СМ>1. Куда вставлять диагностику, если CreateDir выдал ошибку? СМ>2. Куда вставлять другую диагностику, если CopyFile выдал ошибку?
Ну, во-первых, всё это зависит от среды, а не от C++.
Да, я знаю, что во всех мало-мальски известных средах breakpoint можно повесить будет только на всё выражение, а не на его отдельную часть.
Но это не так страшно: я сам отлаживал такой код в VC, по F11 сначала в одну функцию, по Shift-F11 — выход из неё. Посмотреть возвращаемый результат можно только если вставить фигнюшку типа "&& (res = ...) &&", но то же самое происходит и при использовании if-a.
СМ>3. Если хоть одно условие не сработало, то что произошло? не создалось оглавление или icmp не сравнилось?
Разве непонятно Из правил C++ следует, что в данном случае:
1) если не сработало _CreateDir — _CopyFile и _tcsicmp — не вызовутся.
2) если сработает _CreateDir но не сработает _CopyFile — не вызовется _tcsicmp.
3) если сработает _CreateDir и _CopyFile — вызовется _tcsicmp, результат которого проигнорируется.
От себя скажу — в таком синтаксисе меня более всего привлекает то, что нет код не уходит вправо из-за табуляций (в моём примере уровень вложенности — 3, а в реале может быть и 10). Из-за этого его реально проще читать.
Кстати. Подобное и так используется нередко и без особого осуждения, только немного в другом контексте:
Здравствуйте, Radmir, Вы писали:
R>Здравствуйте, Chez, Вы писали:
C>>Ну как Вам? C>>Стоит ли мопед свеч? R>ИМХО данная записть основана на том что при разборе логических выражений выхдй из отношения "&&" происходит сразу же если текущий оператор равен 0 (тек поступают большинство компиляторов). Но никто не запрещает компилятору разбирато логические выражения полностью. сооьветсвенно он вызовет все функции. А вот отловить этот баг в данном случае будет проблематично.
Выделенное курсивом — верно
А вот выделенное жирным неверно — это запрещает Стандарт С++.
Здравствуйте, Radmir, Вы писали:
R>ИМХО данная записть основана на том что при разборе логических выражений выхдй из отношения "&&" происходит сразу же если текущий оператор равен 0 (тек поступают большинство компиляторов).
Да, и это явно документированно в стандарте.
R>Но никто не запрещает компилятору разбирато логические выражения полностью. сооьветсвенно он вызовет все функции. А вот отловить этот баг в данном случае будет проблематично.
Отлов бага компилятора — задача разработчиков компилятора .
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