Вместо if-ов
От: Chez Россия  
Дата: 26.09.05 10:06
Оценка: -2
Придумалась тут одна шняга, выглядит очень симпатично!
Вместо того, чтобы городить конструкции типа:
if (_CreateDir(sFile))
    if (CopyFile(lpszTemp, sFile, FALSE))
        _tcsicmp(m_lpszFile, sFile);
Делать так:
_CreateDir(sFile) &&
CopyFile(lpszTemp, sFile, FALSE) &&
(_tcsicmp(m_lpszFile, sFile), 1); // и т.д. из &&

Плюсы и минусы (ИМХО):
+++ меньше кода писать
+++ нет лишних табуляций, код получается проще
-- не очевидно
— не так удобно отлаживать

вместо then используется &&
вместо else — ||.
при желании можно комбинировать с другими операторами, заключать в скобки...

Ну как Вам?
Стоит ли мопед свеч?

Chez, ICQ#161095094

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

Re: Вместо if-ов
От: -MyXa- Россия  
Дата: 26.09.05 10:27
Оценка:
Здравствуйте, 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>Плюсы и минусы (ИМХО):
C>+++ меньше кода писать
C>+++ нет лишних табуляций, код получается проще
C>-- не очевидно
C>- не так удобно отлаживать

C>вместо then используется &&

C>вместо else — ||.
C>при желании можно комбинировать с другими операторами, заключать в скобки...

C>Ну как Вам?

C>Стоит ли мопед свеч?

Можно воспользоваться исключениями.
Если не поможет, будем действовать током... 600 Вольт (C)
Re[2]: Вместо if-ов
От: -MyXa- Россия  
Дата: 26.09.05 10:37
Оценка:
Здравствуйте, -MyXa-, Вы писали:

MX>Здравствуйте, 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>>Плюсы и минусы (ИМХО):
C>>+++ меньше кода писать
C>>+++ нет лишних табуляций, код получается проще
C>>-- не очевидно
C>>- не так удобно отлаживать

C>>вместо then используется &&

C>>вместо else — ||.
C>>при желании можно комбинировать с другими операторами, заключать в скобки...

C>>Ну как Вам?

C>>Стоит ли мопед свеч?

MX>Можно воспользоваться исключениями.


В любом случае, по закону strong exception safety guarantee, желательно, чтобы созданная директория удалялась, буде не удастся скопировать файл. Так что мопед тот ещё
Если не поможет, будем действовать током... 600 Вольт (C)
Re: Вместо if-ов
От: sch  
Дата: 26.09.05 10:38
Оценка: 7 (2) +1
Здравствуйте, Chez, Вы писали:

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


Собственно говоря, все новое это хорошо забытое старое -- подобные конструкции довольно давно используются, например на Perl. Классический пример:

 open HANDLE, "filename"
        or die "Can't open: $!\n";
Re: Вместо if-ов
От: Сергей Мухин Россия  
Дата: 26.09.05 10:56
Оценка:
Здравствуйте, Chez, Вы писали:

C>Плюсы и минусы (ИМХО):

C>+++ меньше кода писать
C>+++ нет лишних табуляций, код получается проще
C>-- не очевидно
C>- не так удобно отлаживать

C>вместо then используется &&

C>вместо else — ||.
C>при желании можно комбинировать с другими операторами, заключать в скобки...

C>Ну как Вам?

C>Стоит ли мопед свеч?

НЕТ!

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

Минус — это уже половина плюса, а плюс — это, порой, целых два минуса...
---
С уважением,
Сергей Мухин
Re[3]: Вместо if-ов
От: Chez Россия  
Дата: 26.09.05 11:01
Оценка:
Здравствуйте, -MyXa-, Вы писали:

MX>В любом случае, по закону strong exception safety guarantee, желательно, чтобы созданная директория удалялась, буде не удастся скопировать файл. Так что мопед тот ещё

Ну, тут эти функции приведены только как пример. Они не имеют непосредственного отношения к вопросу.

Chez, ICQ#161095094

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

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

MX>Можно воспользоваться исключениями.

Конечно можно. Но как вам такая структура, применяемая как замен if-ам?
Ведь даже в exception-oriented-коде довольно часто встречаются такие вещи...

Chez, ICQ#161095094

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

Re[2]: Вместо if-ов
От: Chez Россия  
Дата: 26.09.05 11:12
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>НЕТ!


СМ>плюсы сомнительны, минусы огромны.

СМ>оставляй координаты для тех, кто такое будет сопровождать. Бить будут.

Аргументы?

СМ> Минус — это уже половина плюса, а плюс — это, порой, целых два минуса...

Chez, ICQ#161095094

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

Re[3]: Вместо if-ов
От: Сергей Мухин Россия  
Дата: 26.09.05 11:20
Оценка: +2
Здравствуйте, Chez, Вы писали:

C>Здравствуйте, Сергей Мухин, Вы писали:


СМ>>НЕТ!


СМ>>плюсы сомнительны, минусы огромны.

СМ>>оставляй координаты для тех, кто такое будет сопровождать. Бить будут.

C>Аргументы?


1. +++ меньше кода писать
на сколько меньше? на 5% и это пишется один раз, а читается десятки, еще отлаживается и еще сопровождается несколько лет
2. +++ нет лишних табуляций, код получается проще
какие табуляции? с чего вы взяли что проще? сделайте условие посложней и сами запутаетесь в скобках
3. -- не очевидно
см п.1
4. — не так удобно отлаживать
см п.1

много ли вы видели нормальных программ, написанных в таком стиле?
---
С уважением,
Сергей Мухин
Re[2]: Вместо if-ов
От: Глеб Алексеев  
Дата: 26.09.05 11:24
Оценка:
Здравствуйте, sch, Вы писали:

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


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


sch>Собственно говоря, все новое это хорошо забытое старое -- подобные конструкции довольно давно используются, например на Perl.

Еще это чем-то напоминает Пролог. Код на Прологе
foo() :-
    bar(),
    baz(),
    buz().
foo() :-
    bur(),
    buz().

примерно равносилен следующему коду на С (если вообще можно так сказать о С и Прологе):
bool foo() {
    return 
        ( bar() && baz() && buz() ) ||
        ( bur() && buz() );
}

Но на Прологе такое отлаживать гораздо проще (можно поставить breakpoint где угодно).
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Вместо if-ов
От: gear nuke  
Дата: 26.09.05 11:38
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>много ли вы видели нормальных программ, написанных в таком стиле?


Нет, не очень. ИМХО причина лучше всего раскрывается в следующей главе книги 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("%s", str ? str : "<пусто>");

гораздо элегантнее, чем:
if ( str == NULL )
  printf( "<пусто>" );
else
  printf( "%s", str );

Вы к тому же экономите на двух вызовах printf(). Мне также часто приходится видеть неправильное использование операций ++ и --. Весь смысл автоинкремента или автодекремента заключается в соединении этих операций с другими. Вместо:
while ( *p )
{
  putchar ( *p );
  ++p;
}

или:
for( ; *p ; ++p )
  putchar ( *p );
используйте:
while( *p )
  putchar ( *p++ );

Этот код вполне читаем для компетентного программиста на языке Си, даже если ему нет эквивалентной операции в ФОРТРАНе или Паскале.
Вы также никогда не должны прятать операторы в макросах из-за того, что вам просто не нравится, как они выглядят. Я однажды видел следующее в реальной программе:
struct tree_node
{
  struct tree_node *lftchld;
};
#define left_child(x) ((x)->lftchld)
//...
traverse( tree_node *root )
{
  if( left_child(root) )
    traverse( left_child( root ) );
// ...
}

Программист намеренно сделал определение структуры труднее читаемым для того, чтобы избежать конфликта имен между полем и совершенно необходимым макросом, и все из-за того, что ему не нравился внешний вид оператора ->. Для него было бы гораздо лучшим
Правила обычного программирования выходом просто назвать поле left_child и совсем избавиться от макроса.
Если вы действительно думаете, что программа должна внешне выглядеть как на Паскале, чтобы быть читаемой, то вы должны программировать на Паскале, а не на Си или Си++.


Ваш код вполне понятен и уместен в определённых случаях. Хотя, я бы использовал такой вариант записи:
_CreateDir(sFile)
  && (CopyFile(lpszTemp, sFile, FALSE))
  && _tcsicmp(m_lpszFile, sFile)
  ;
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[3]: Вместо if-ов
От: gear nuke  
Дата: 26.09.05 11:45
Оценка: :)
Здравствуйте, Глеб Алексеев, Вы писали:

ГА>
ГА>bool foo() {
ГА>    return 
ГА>        ( bar() && baz() && buz() ) ||
ГА>        ( bur() && buz() );
ГА>}

ГА>Но на Прологе такое отлаживать гораздо проще (можно поставить breakpoint где угодно).

Не только на Прологе .
int __forceinline bp() { __asm int 3 }

bool foo() {
    return 
        ( bar() && 
    bp(),
        baz() && buz() ) ||
        ( bur() && buz() );
}

По голове не бить! Это пример как можно, а не как нужно.
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-ов
От: Сергей Мухин Россия  
Дата: 26.09.05 11:47
Оценка:
Здравствуйте, gear nuke, Вы писали:


СМ>>много ли вы видели нормальных программ, написанных в таком стиле?


GN>Нет, не очень. ИМХО причина лучше всего раскрывается в следующей главе книги Alen I. Holub "Enough Rope to Shoot Yourself in the Foot":


GN>Если вы действительно думаете, что программа должна внешне выглядеть как на Паскале, чтобы быть читаемой, то вы должны программировать на Паскале, а не на Си или Си++.[/q]


совершенно лишняя огромная цитата. Никто не спорит, что надо писать на Паскале.

GN>Ваш код вполне понятен и уместен в определённых случаях. Хотя, я бы использовал такой вариант записи:

GN>
GN>_CreateDir(sFile)
GN>  && (CopyFile(lpszTemp, sFile, FALSE))
GN>  && _tcsicmp(m_lpszFile, sFile)
GN>  ;
GN>


а давайте теперь представим, что вам надо написать не курсовую, а реальную программу. Несколько вопросов:
1. Куда вставлять диагностику, если CreateDir выдал ошибку?
2. Куда вставлять другую диагностику, если CopyFile выдал ошибку?
3. Если хоть одно условие не сработало, то что произошло? не создалось оглавление или icmp не сравнилось?
---
С уважением,
Сергей Мухин
Re[6]: Вместо if-ов
От: gear nuke  
Дата: 26.09.05 12:00
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

GN>>
GN>>_CreateDir(sFile)
GN>>  && (CopyFile(lpszTemp, sFile, FALSE))
GN>>  && _tcsicmp(m_lpszFile, sFile)
GN>>  ;
GN>>


СМ>а давайте теперь представим, что вам надо написать не курсовую, а реальную программу. Несколько вопросов:

СМ>1. Куда вставлять диагностику, если CreateDir выдал ошибку?
СМ>2. Куда вставлять другую диагностику, если CopyFile выдал ошибку?

Re[3]: Вместо if-ов
Автор: gear nuke
Дата: 26.09.05


СМ>3. Если хоть одно условие не сработало, то что произошло? не создалось оглавление или icmp не сравнилось?


Re[3]: Вместо if-ов
Автор: Chez
Дата: 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: Вместо if-ов
От: Radmir Россия  
Дата: 26.09.05 12:00
Оценка: -1
Здравствуйте, Chez, Вы писали:

C>Ну как Вам?

C>Стоит ли мопед свеч?
ИМХО данная записть основана на том что при разборе логических выражений выхдй из отношения "&&" происходит сразу же если текущий оператор равен 0 (тек поступают большинство компиляторов). Но никто не запрещает компилятору разбирато логические выражения полностью. сооьветсвенно он вызовет все функции. А вот отловить этот баг в данном случае будет проблематично.
Лучше спросить дорогу чем заблудиться
Re[7]: Вместо if-ов
От: Сергей Мухин Россия  
Дата: 26.09.05 12:08
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Здравствуйте, Сергей Мухин, Вы писали:


GN>>>
GN>>>_CreateDir(sFile)
GN>>>  && (CopyFile(lpszTemp, sFile, FALSE))
GN>>>  && _tcsicmp(m_lpszFile, sFile)
GN>>>  ;
GN>>>


СМ>>а давайте теперь представим, что вам надо написать не курсовую, а реальную программу. Несколько вопросов:

СМ>>1. Куда вставлять диагностику, если CreateDir выдал ошибку?
ответа так и нет

СМ>>2. Куда вставлять другую диагностику, если CopyFile выдал ошибку?


GN>Re[3]: Вместо if-ов
Автор: gear nuke
Дата: 26.09.05

ответа так и нет

СМ>>3. Если хоть одно условие не сработало, то что произошло? не создалось оглавление или icmp не сравнилось?


GN>Re[3]: Вместо if-ов
Автор: Chez
Дата: 26.09.05


3. Если хоть одно условие не сработало, то что произошло? проблема то остается!



ps
очень неприятный стиль ответа. давать ссылки, да еще непонятно какое отношение имеет первая ссылка

зы
я отписываюсь от этого бреда, так что так и не узнаю новых веяний в написании программ
---
С уважением,
Сергей Мухин
Re[2]: Вместо if-ов
От: aton Россия http://ruby.inuse.ru
Дата: 26.09.05 12:14
Оценка:
Здравствуйте, sch, Вы писали:

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


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


sch>Собственно говоря, все новое это хорошо забытое старое -- подобные конструкции довольно давно используются, например на Perl. Классический пример:


sch>
sch> open HANDLE, "filename"
sch>        or die "Can't open: $!\n";
sch>


еще дольше — Bourn Shell, мой любиvый командный контейнер:

$make && make install
Re[6]: Вместо if-ов
От: Chez Россия  
Дата: 26.09.05 12:16
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>а давайте теперь представим, что вам надо написать не курсовую, а реальную программу. Несколько вопросов:

СМ>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). Из-за этого его реально проще читать.

Кстати. Подобное и так используется нередко и без особого осуждения, только немного в другом контексте:
BOOL result =
    _CreateDir(sFile) &&
    CopyFile(lpszTemp, sFile, FALSE) &&
    _tcsicmp(m_lpszFile, sFile) > 1;

Т.е. по сути я совсем немного новшеств предлагаю...

Chez, ICQ#161095094

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

Re[2]: Вместо if-ов
От: Chez Россия  
Дата: 26.09.05 12:19
Оценка: +1 -1
Здравствуйте, Radmir, Вы писали:

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


C>>Ну как Вам?

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

Chez, ICQ#161095094

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

Re[2]: Вместо if-ов
От: gear nuke  
Дата: 26.09.05 12:19
Оценка:
Здравствуйте, 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
Re[8]: Вместо if-ов
От: gear nuke  
Дата: 26.09.05 12:29
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

GN>>>>
GN>>>>_CreateDir(sFile)
GN>>>>  && (CopyFile(lpszTemp, sFile, FALSE))
GN>>>>  && _tcsicmp(m_lpszFile, sFile)
GN>>>>  ;

СМ>>>а давайте теперь представим, что вам надо написать не курсовую, а реальную программу. Несколько вопросов:
СМ>>>1. Куда вставлять диагностику, если CreateDir выдал ошибку?
СМ>ответа так и нет

Код по сылоке с адаптацией к коду, к которому относился вопрос:

int __forceinline bp() { __asm int 3 }

bp();
_CreateDir(sFile)
  && (CopyFile(lpszTemp, sFile, FALSE))
  && _tcsicmp(m_lpszFile, sFile)
  ;


СМ>>>2. Куда вставлять другую диагностику, если CopyFile выдал ошибку?


GN>>Re[3]: Вместо if-ов
Автор: gear nuke
Дата: 26.09.05

СМ>ответа так и нет

int __forceinline bp() { __asm int 3 }

_CreateDir(sFile)
  && 
bp(),
    (CopyFile(lpszTemp, sFile, FALSE))
  && _tcsicmp(m_lpszFile, sFile)
  ;


СМ>>>3. Если хоть одно условие не сработало, то что произошло? не создалось оглавление или icmp не сравнилось?


GN>>Re[3]: Вместо if-ов
Автор: Chez
Дата: 26.09.05


СМ>3. Если хоть одно условие не сработало, то что произошло? проблема то остается!


Какая проблема? Если о речь о изначальной проблеме конструкции if, то поведение кода не изменится.

СМ>ps

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

Прямое.

СМ>зы

СМ>я отписываюсь от этого бреда, так что так и не узнаю новых веяний в написании программ

Это не мои проблемы .

ЗЫ: Я остерегаюсь использовать слово "бред" для вещей мне непонятных. Возможно, дело всего-лишь в том, что я их не понимаю.
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[9]: Вместо if-ов
От: Сергей Мухин Россия  
Дата: 26.09.05 12:37
Оценка: :)
Здравствуйте, gear nuke, Вы писали:

GN>ЗЫ: Я остерегаюсь использовать слово "бред" для вещей мне непонятных. Возможно, дело всего-лишь в том, что я их не понимаю.


Я остерегаюсь использовать слово "бред" для вещей мне непонятных. Но здесь нет ничего не понятно, может быть был бы не понятен Пролог, но как раз я сейчас пишу компилятор с него.

ps
что-то отписка не сработала, попробую еще раз
---
С уважением,
Сергей Мухин
Re[8]: Вместо if-ов
От: gear nuke  
Дата: 26.09.05 12:41
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

GN>>>>
GN>>>>_CreateDir(sFile)
GN>>>>  && (CopyFile(lpszTemp, sFile, FALSE))
GN>>>>  && _tcsicmp(m_lpszFile, sFile)
GN>>>>  ;


СМ>>>а давайте теперь представим, что вам надо написать не курсовую, а реальную программу. Несколько вопросов:

СМ>>>1. Куда вставлять диагностику, если CreateDir выдал ошибку?
СМ>ответа так и нет

А теперь, позвольте рассавить все точки над Ё.
Что такое "диагностика" в контексте вопроса?
если под этим можно понять возможность указания breakpoints для отладки — я дал ответ;
если же под этим нужно понимать дополнительное ветвление в зависимости от результата _CreateDir
— вопрос некорректен.

СМ>зы

СМ>я отписываюсь от этого бреда, так что так и не узнаю новых веяний в написании программ
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-ов
От: gear nuke  
Дата: 26.09.05 12:51
Оценка:
Здравствуйте, Chez, Вы писали:

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[10]: offtop Вместо if-ов
От: gear nuke  
Дата: 26.09.05 12:51
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>>>зы

СМ>>>я отписываюсь от этого бреда, так что так и не узнаю новых веяний в написании программ

GN>>ЗЫ: Я остерегаюсь использовать слово "бред" для вещей мне непонятных. Возможно, дело всего-лишь в том, что я их не понимаю.


СМ>Я остерегаюсь использовать слово "бред" для вещей мне непонятных. Но здесь нет ничего не понятно, может быть был бы не понятен Пролог, но как раз я сейчас пишу компилятор с него.


СМ>ps

СМ>что-то отписка не сработала, попробую еще раз

Интересный способ ведения диалога — "слушайте меня, а мне наплевать на ответы"
Больше напоминает монолог. Разве на форумах пишут монологи ?
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-ов
От: Глеб Алексеев  
Дата: 26.09.05 13:07
Оценка: +1
Здравствуйте, Chez, Вы писали:


C>От себя скажу — в таком синтаксисе меня более всего привлекает то, что нет код не уходит вправо из-за табуляций

Стандартное решение — использовать цепочку else if:
//before
void foo_ugly() {
  if ( condition1 ) {
        if ( condition2 ) {
            if ( condition3 ) {
                do_actual_work();
            } else {
                cout << "Too bad, condition3 was false";
            }
        }    else {
            cout << "Too bad, condition2 was false";
        }
    } else {
        cout << "Too bad, condition1 was false";
    }
}
//after
void foo_much_better() {
    if(!condition1) {
        cout << "Too bad, condition1 was false";
    } else if(!condition2) {
        cout << "Too bad, condition2 was false";
    } else if(!condition3) {
        cout << "Too bad, condition3 was false";
    } else {
        do_actual_work();
    }
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Вместо if-ов
От: Pavel Dvorkin Россия  
Дата: 26.09.05 13:12
Оценка:
Здравствуйте, Chez, Вы писали:

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


<skipped>

1. А если хоть одна функция в этой последовательности void ?
2.
C>-- не очевидно
3.
C>- не так удобно отлаживать
With best regards
Pavel Dvorkin
Re[2]: Вместо if-ов
От: Pavel Dvorkin Россия  
Дата: 26.09.05 13:14
Оценка:
PD>1. А если хоть одна функция в этой последовательности void ?

Сорри, не совсем точно выразился. Я имею в виду, что внутри if ставится код в {}, и в нем вызываются void функции. Или что-то еще.
With best regards
Pavel Dvorkin
Re[3]: Вместо if-ов
От: Глеб Алексеев  
Дата: 26.09.05 13:28
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

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


Ну, можно еще и operator, припахать .

bool_func1() && bool_func2() || (void_func1(), void_func2(), bool_func3());
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[8]: Вместо if-ов
От: gear nuke  
Дата: 26.09.05 13:31
Оценка:
Здравствуйте, Глеб Алексеев, Вы писали:

ГА>
ГА>    if ( condition3 ) {
ГА>        do_actual_work();
ГА>    }

Кстати, раз уж в этом топике так остро затронуты проблемы читаемости условных конструкций языка...

Например, можно встретить такой стиль:
if ( condition3 )
    {
    //
    }

И есть такой код:

if ( condition() )
    {
    // здесь может быть, а может и не быть несколько строк кода.
    if ( some_other_complex_condition_that_does_a_lot_of_calculations_and_goes_out_of_the_screen() ) {
        do_actual_work();
    }

Внимание, вопрос:
К чему относится нижняя скобка?
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[9]: Вместо if-ов
От: Глеб Алексеев  
Дата: 26.09.05 13:38
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>
GN>if ( condition() )
GN>    {
GN>    // здесь может быть, а может и не быть несколько строк кода.
GN>    if ( some_other_complex_condition_that_does_a_lot_of_calculations_and_goes_out_of_the_screen() ) {
GN>        do_actual_work();
GN>    }
GN>

GN>Внимание, вопрос:
GN>К чему относится нижняя скобка?
Не вижу проблемы (пример не компилируется из-за отсутствия второй закрывающей скобки, а случайно добавить ее так, чтобы она была незаметна, ИМХО, трудно. И раз разговор зашел о стиле, то some_other_complex_condition_that_does_a_lot_of_calculations_and_goes_out_of_the_screen() — именно это корень зла, а не соглашение о расстановке скобок.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[10]: Вместо if-ов
От: gear nuke  
Дата: 26.09.05 14:07
Оценка:
Здравствуйте, Глеб Алексеев, Вы писали:

GN>>
GN>>if ( condition() )
GN>>    {
GN>>    // здесь может быть, а может и не быть несколько строк кода.
GN>>    if ( some_other_complex_condition_that_does_a_lot_of_calculations_and_goes_out_of_the_screen() ) {
GN>>        do_actual_work();
GN>>    }
GN>>

GN>>Внимание, вопрос:
GN>>К чему относится нижняя скобка?
ГА>Не вижу проблемы (пример не компилируется из-за отсутствия второй закрывающей скобки,

На самом деле скобка конечно же есть где-то ниже по тексту.

Тут дело не в поведении компилятра, а в том, что можно неправильно понять, к чему относится последующий else.

ГА>а случайно добавить ее так, чтобы она была незаметна, ИМХО, трудно.


Очень просто. Во вложенных if {} else {}, когда подбираемяся к 80й колонке.

ГА> И раз разговор зашел о стиле, то some_other_complex_condition_that_does_a_lot_of_calculations_and_goes_out_of_the_screen() — именно это корень зла


См. про 80ю колонку выше. Там и smplcndtn() запросто вылезет за пределы экрана. При последующем чтении листинга.

ГА>а не соглашение о расстановке скобок.


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

Прямо как сказал Будда:

Корень зла есть незнание истины. Из этого же корня вырастает дерево заблуждения с своими тысячными плодами страдания.

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-ов
От: Erop Россия  
Дата: 26.09.05 15:27
Оценка:
Здравствуйте, Chez, Вы писали:

C>Стоит ли мопед свеч?


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

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

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


И понятно, и отлаживать удобно и поддерживать и доп. диагностику есть куда вставлять -- идеальный вариант однако
(Всё ИМХО, ясень фуясень
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[11]: Вместо if-ов
От: Centaur Россия  
Дата: 26.09.05 16:13
Оценка: +2
Здравствуйте, gear nuke, Вы писали:

GN>>>
GN>>>if ( condition() )
GN>>>    {
GN>>>    // здесь может быть, а может и не быть несколько строк кода.
GN>>>    if ( some_other_complex_condition_that_does_a_lot_of_calculations_and_goes_out_of_the_screen() ) {
GN>>>        do_actual_work();
GN>>>    }
GN>>>

GN>>>Внимание, вопрос:
GN>>>К чему относится нижняя скобка?
ГА>>Не вижу проблемы (пример не компилируется из-за отсутствия второй закрывающей скобки,
ГА>>а случайно добавить ее так, чтобы она была незаметна, ИМХО, трудно.

GN>Очень просто. Во вложенных if {} else {}, когда подбираемяся к 80й колонке.


Если код подбирается к 80-й колонке, это значит, что он хочет разъехаться в много маленьких функций с не такой глубокой вложенностью конструкций.
Re[2]: Вместо if-ов
От: gear nuke  
Дата: 26.09.05 16:15
Оценка:
Здравствуйте, 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>И понятно, и отлаживать удобно и поддерживать и доп. диагностику есть куда вставлять -- идеальный вариант однако

Идеальный, если можно делать return;.
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[12]: Вместо if-ов
От: gear nuke  
Дата: 26.09.05 16:22
Оценка:
Здравствуйте, Centaur, Вы писали:

C>Если код подбирается к 80-й колонке, это значит, что он хочет разъехаться в много маленьких функций с не такой глубокой вложенностью конструкций.


Эх, если бы всё в жизни было бы как в сказке . Есть случаи, когда длинные функции на несколько страниц — единственный правильный способ реализации задачи в каких-то определённых условиях.

А длинными они получаются, когда есть много if {} else {}
Если использовать && есть шанс вместо 2х страниц получить 0.5.

Нет общего решения для всех случаев.
Где-то лучше одно, где-то — другое.
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[3]: Вместо if-ов
От: Radmir Россия  
Дата: 27.09.05 03:07
Оценка:
Здравствуйте, Chez, Вы писали:

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

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

А много ли ты знаешь компиляторов которые на 100% соответствуют стандарту?
Лучше спросить дорогу чем заблудиться
Re[3]: Вместо if-ов
От: Erop Россия  
Дата: 27.09.05 05:20
Оценка:
Здравствуйте, gear nuke, Вы писали:

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


Ну я вообще ратую за короткие и простые функции с ясной семантикой
Ну а для такого сложного действия, как обсуждается тут (там помнится речь шла о десятке if'ов ) совершенно точно стоит заводить отдельную функцию
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: Вместо if-ов
От: Erop Россия  
Дата: 27.09.05 05:26
Оценка:
Здравствуйте, Radmir, Вы писали:

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


R>>>Но никто не запрещает компилятору разбирато логические выражения полностью

C>>А вот выделенное жирным неверно — это запрещает Стандарт С++.
R>А много ли ты знаешь компиляторов которые на 100% соответствуют стандарту?

Не знаю ни одного, кто бы не соответсвовал.
Тем более, что что-то типа:


    assert( p!=0 && p->IsValid() );   //   Довольно общепринятая практика

Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: Вместо if-ов
От: Alex Alexandrov США  
Дата: 27.09.05 05:33
Оценка: +1
Здравствуйте, Radmir, Вы писали:

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


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

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

R>А много ли ты знаешь компиляторов которые на 100% соответствуют стандарту?


Думаю, проверка конкретно этого пункта стандарта есть в Test Suite любого современного компилятора. Я постоянно пишу код вида

if (ptr && ptr[0] == SOME_MAGIC_NUMBER)
{
    fprintf(stderr, "Bingo!");
}


и не сталкивался с проблемами. Или мне просто везло?
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
It's kind of fun to do the impossible (Walt Disney)
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...
Пока на собственное сообщение не было ответов, его можно удалить.