Здравствуйте, Воронков Василий, Вы писали:
ВВ>Здравствуйте, IT, Вы писали:
IT>>Это было актуально в C/C++.
ВВ>А почему в С++ это актуально, а С#, как говорят некоторые, это плохо?
В С++ это ещё более плохо, чем в С#. Просто там значением условия может быть не только логический тип, но и ещё куча других типов (все численные, указатели).
Чем плох инлайн ассайнмент?
if ((x = MyFunc()) > 4 && x % 2 == 0)
В конкретном случае — ничем. Но Дьявол — он в деталях. Зачем такое используют? Чтобы сэкономить строчку. Но код имеет обыкновение рости и меняться. Эволюционировать. Усложняться. Если codestyle допускает inline assignment в целях экономии строчки, то через годик-другой в коде начнут появляться вот такие милые конструкции ( пример, не компилируется ):
Здравствуйте, samius, Вы писали:
S>На мой взляд с if-ом этот пример не совместим. Вычисление x явно просится наружу. А вот с употреблением сабжа в цикле я бы согласился: S>
ВВ>Переменная x — "состояние" проверки, которое мы анализируем. Потому она меняется. Семантически
ВВ>GetValue() != 3
ВВ>и
ВВ>(x = GetValue()) != 3
ВВ>полностью аналогичны. Во втором случае я лишь "запоминаю" результат операции, для дальнейших с ним действий. Где здесь нарушение здравого смысла?
Это только при условии, что х больше нигде не используется, кроме как в условии. Если используется, то будут проблемы.
Ну я привел пример немного "от балды". В действительности инлайн ассайнмент рулит в тех случаях, когда нужно совершить несколько операций — в результате вместо того, чтобы городить огород из локальных переменных, заводишь одну и используешь ее для хранения промежуточного значения. Типа такого:
Здравствуйте, prVovik, Вы писали:
V>Здравствуйте, samius, Вы писали:
S>>На мой взляд с if-ом этот пример не совместим. Вычисление x явно просится наружу. А вот с употреблением сабжа в цикле я бы согласился: S>>
Здравствуйте, prVovik, Вы писали:
V>Это только при условии, что х больше нигде не используется, кроме как в условии. Если используется, то будут проблемы.
Какие проблемы? Я еще ни одной проблемы не услышал.
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Здравствуйте, prVovik, Вы писали:
V>>Аналогии идут лесом.
ВВ>Ну в таком случае давай философию в стиле "зачем лепить в одну кучу вычисление предиката и действия" тоже пошлем лесом, ок?
Это ещё почему?
Если уж тебе так хочется использовать аналогии, то докажи сначала, что аналогия корректна.
Здравствуйте, EyeOfHell, Вы писали:
EOH>В конкретном случае — ничем. Но Дьявол — он в деталях. Зачем такое используют? Чтобы сэкономить строчку. Но код имеет обыкновение рости и меняться. Эволюционировать. Усложняться. Если codestyle допускает inline assignment в целях экономии строчки, то через годик-другой в коде начнут появляться вот такие милые конструкции ( пример, не компилируется ):
EOH>
EOH>if( RET_OK == ( result = MyFunc() ) && ( result % LOW_BOUND < MIN_LOW ||
EOH>...
EOH>
EOH>А такие милы конструкции череповаты последствиями в дальнейшей поддержке проекта .
Тут уже не сабж виноват, а тот кто забыл про рефакторинг.
EOH>P.S. Некоторые вещи, абсолютно адекватные в примерах уровня "Hello world" приводят к жутким последствиям в долгих проектах с миллионами строчек кода .
Если миллион строчек вставить в одну — то конечно так и будет!
Здравствуйте, prVovik, Вы писали:
V>Это ещё почему? V>Если уж тебе так хочется использовать аналогии, то докажи сначала, что аналогия корректна.
Слушай, давай ты мне не будешь говорить, что я могу использовать, а что нет. Если нечего сказать, то лучше ничего и не говорить. А вести пустопорожние беседы я не намерен.
Здравствуйте, prVovik, Вы писали:
V>В С++ это ещё более плохо, чем в С#.
То, что это плохо в C++ как раз понятно. ВВ хочет понять чем это плохо в C#. Кроме сомнительного аргумента про читабельность пока ничего не прозвучало.
Неясность изложения обычно происходит от путаницы в мыслях.
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Здравствуйте, prVovik, Вы писали:
V>>Это только при условии, что х больше нигде не используется, кроме как в условии. Если используется, то будут проблемы.
ВВ>Какие проблемы? Я еще ни одной проблемы не услышал.
Side effects often make a program's behavior more difficult to predict. A "Safe" operation is one that is guaranteed to be free of side-effects, i.e., it may be relied upon to leave the state of the system unchanged. Queries are the canonical safe transactions. Safe operations are also idempotent, although the reverse is not necessarily true.
Основываясь на вышевыделенном, я вправе ожидать, что факт вычисления условия не изменит состояния программы.
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Здравствуйте, prVovik, Вы писали:
V>>Это ещё почему? V>>Если уж тебе так хочется использовать аналогии, то докажи сначала, что аналогия корректна.
ВВ>Слушай, давай ты мне не будешь говорить, что я могу использовать, а что нет. Если нечего сказать, то лучше ничего и не говорить. А вести пустопорожние беседы я не намерен.
Иначе получается демагогия. С чего ты взял, что присвоения в условиях аналогичны инициализации переменных? С таким же успехом я могу сказать, присвоения в условиях аналогичны поеданию младенцев.
Здравствуйте, prVovik, Вы писали:
V>Здравствуйте, Воронков Василий, Вы писали:
ВВ>>Здравствуйте, prVovik, Вы писали:
V>>>Это только при условии, что х больше нигде не используется, кроме как в условии. Если используется, то будут проблемы.
ВВ>>Какие проблемы? Я еще ни одной проблемы не услышал.
V>http://en.wikipedia.org/wiki/Side_effect_(computer_science) V>
V>Side effects often make a program's behavior more difficult to predict. A "Safe" operation is one that is guaranteed to be free of side-effects, i.e., it may be relied upon to leave the state of the system unchanged. Queries are the canonical safe transactions. Safe operations are also idempotent, although the reverse is not necessarily true.
V>Основываясь на вышевыделенном, я вправе ожидать, что факт вычисления условия не изменит состояния программы.
С чего ты решил, что можешь провести аналогию между
Queries are the canonical safe transactions.
и
int x;
if ((x = MyFunc()) > 4 && x % 2 == 0)
{
}
Где ты здесь видишь "queries"? И каким образом вышеприведенный код нарушает правило "leave the state of the system unchanged"? Что вообще изменяет это код? Он проводит инициализацию переменной x результатом выполнения функции MyFunc, самый смысл выполнения которой в том, чтобы вернуть результат.
Здравствуйте, Воронков Василий, Вы писали:
факт вычисления условия не изменит состояния программы.
ВВ>С чего ты решил, что можешь провести аналогию между
ВВ>Queries are the canonical safe transactions.
ВВ>и
ВВ>
С того, что предикат, это и есть запрос, у которого результат имеет логический тип.
ВВ>И каким образом вышеприведенный код нарушает правило "leave the state of the system unchanged"? Что вообще изменяет это код?
Значение переменной х
ВВ>Он проводит инициализацию переменной x результатом выполнения функции MyFunc, самый смысл выполнения которой в том, чтобы вернуть результат.