[C#] Чем плох инлайн ассайнмент?
От: Воронков Василий Россия  
Дата: 07.11.08 22:16
Оценка:
Собственно, сабж.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re: [C#] Чем плох инлайн ассайнмент?
От: Lloyd Россия  
Дата: 08.11.08 00:15
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Собственно, сабж.


А что это такое?
Re[2]: [C#] Чем плох инлайн ассайнмент?
От: Воронков Василий Россия  
Дата: 08.11.08 01:30
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>А что это такое?


Ну типа:

int x;

if ((x = MyFunc()) > 4 && x % 2 == 0)
{

}
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[3]: [C#] Чем плох инлайн ассайнмент?
От: mkizub Литва http://symade.tigris.org
Дата: 08.11.08 13:23
Оценка: 1 (1) +1
Здравствуйте, Воронков Василий, Вы писали:

ВВ>
if ((x = MyFunc()) > 4 && x % 2 == 0)


Тем, что чаще является опечаткой, чем действительно намеренным кодом программиста.
SOP & SymADE: http://symade.tigris.org , блог http://mkizub.livejournal.com
Re[4]: [C#] Чем плох инлайн ассайнмент?
От: Воронков Василий Россия  
Дата: 08.11.08 16:40
Оценка: +2
Здравствуйте, mkizub, Вы писали:

ВВ>>
M>if ((x = MyFunc()) > 4 && x % 2 == 0)
M>


M>Тем, что чаще является опечаткой, чем действительно намеренным кодом программиста.


Эээ... А каким образом можно так опечататься? В смысле вместо == поставить =? Ну так у тебя это не скомпилируется. Тебе придется все выражение еще в скобочки дополнительные взять — опять-таки и после этого оно не скомпилируется. Надо будет сравнить с чем-нибудь.

В общем что-то мне кажется, что сложновато так опечататься.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[5]: [C#] Чем плох инлайн ассайнмент?
От: prVovik Россия  
Дата: 08.11.08 17:47
Оценка: 7 (1)
Здравствуйте, Воронков Василий, Вы писали:

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


ВВ>>>
M>>if ((x = MyFunc()) > 4 && x % 2 == 0)
M>>


M>>Тем, что чаще является опечаткой, чем действительно намеренным кодом программиста.


ВВ>Эээ... А каким образом можно так опечататься? В смысле вместо == поставить =? Ну так у тебя это не скомпилируется. Тебе придется все выражение еще в скобочки дополнительные взять — опять-таки и после этого оно не скомпилируется. Надо будет сравнить с чем-нибудь.


А если x имеет логический тип?

ВВ>В общем что-то мне кажется, что сложновато так опечататься.


Я, например, неоднократно опечатывался так в С\С++.
лэт ми спик фром май харт
Re[3]: [C#] Чем плох инлайн ассайнмент?
От: prVovik Россия  
Дата: 08.11.08 17:50
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>
ВВ>int x;

ВВ>if ((x = MyFunc()) > 4 && x % 2 == 0)
ВВ>{

ВВ>}
ВВ>


Помимо сказанного про ошибки. Зачем всё лепить в кучу: вычисление предиката и действия? Какой смысл специально вводить в язык конструкции, предназначенные для создания предикатов с сайд-эффектами? Какой вообще смысл в предикатах с сайд-эффектами? Чтобы отлаживать было веселее?
лэт ми спик фром май харт
Re[4]: [C#] Чем плох инлайн ассайнмент?
От: Воронков Василий Россия  
Дата: 08.11.08 18:00
Оценка:
Здравствуйте, prVovik, Вы писали:

V>Помимо сказанного про ошибки. Зачем всё лепить в кучу: вычисление предиката и действия? Какой смысл специально вводить в язык конструкции, предназначенные для создания предикатов с сайд-эффектами? Какой вообще смысл в предикатах с сайд-эффектами? Чтобы отлаживать было веселее?


Так в чем сайд-эффекты? Только в том, что похоже на опечатку?
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[6]: [C#] Чем плох инлайн ассайнмент?
От: Воронков Василий Россия  
Дата: 08.11.08 18:05
Оценка:
Здравствуйте, prVovik, Вы писали:

V>Я, например, неоднократно опечатывался так в С\С++.


Ну хорошо, положим конкретный пример использования можно перепутать с опечаткой:

if ([bool]x = [bool]GetValue())
{
    ...
}


Что-нибудь еще?
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re: [C#] Чем плох инлайн ассайнмент?
От: IT Россия linq2db.com
Дата: 08.11.08 19:06
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

Это было актуально в C/C++.
Неясность изложения обычно происходит от путаницы в мыслях.
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: [C#] Чем плох инлайн ассайнмент?
От: IT Россия linq2db.com
Дата: 08.11.08 19:06
Оценка: +2
Здравствуйте, prVovik, Вы писали:

V>Зачем всё лепить в кучу: вычисление предиката и действия?


Я тебе даже больше скажу. В языках, где блок кода возвращает значение можно делать даже такое:

if ({ def x = MyFunc(); x + 1 } > 4)
{
}

Зачем вводить новые локальные переменные выше, если их scope ограничен только условием?
Неясность изложения обычно происходит от путаницы в мыслях.
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: [C#] Чем плох инлайн ассайнмент?
От: Воронков Василий Россия  
Дата: 08.11.08 20:02
Оценка:
Здравствуйте, IT, Вы писали:

IT>Это было актуально в C/C++.


А почему в С++ это актуально, а С#, как говорят некоторые, это плохо?
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[5]: [C#] Чем плох инлайн ассайнмент?
От: Воронков Василий Россия  
Дата: 08.11.08 20:02
Оценка:
Здравствуйте, IT, Вы писали:

IT>
IT>if ({ def x = MyFunc(); x + 1 } > 4)
IT>{
IT>}
IT>

IT>Зачем вводить новые локальные переменные выше, если их scope ограничен только условием?

Да уж, если эту тему развивать, то можно прийти к тому, что все будем писать по-старинке:

int x;
x = 3;


Ибо зачем "смешивать" инициализацию переменной и ассайнмент?

Про лямбды с замыканиями я вообще молчу.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[3]: [C#] Чем плох инлайн ассайнмент?
От: IT Россия linq2db.com
Дата: 08.11.08 20:37
Оценка: +2
Здравствуйте, Воронков Василий, Вы писали:

ВВ>А почему в С++ это актуально, а С#, как говорят некоторые, это плохо?


Некоторые в C# до сих пор пишут

if (0 == a)
{
}

полагая, что это помогает это им реально решать ту же саму проблему.

На самом деле это всё тот же копи--пейст, только не кода, а идей. Копирование первично, понимание сути вторично.
Неясность изложения обычно происходит от путаницы в мыслях.
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: [C#] Чем плох инлайн ассайнмент?
От: ili Россия  
Дата: 08.11.08 20:43
Оценка: 6 (1) +2
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Ну типа:


ВВ>
ВВ>int x;

ВВ>if ((x = MyFunc()) > 4 && x % 2 == 0)
ВВ>{

ВВ>}
ВВ>


вот полчаса думал что это тут написано... тем и плох.
код пишется не для компилятора, а для того кто его сопровождать будет.
Re[5]: [C#] Чем плох инлайн ассайнмент?
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 08.11.08 20:59
Оценка:
Здравствуйте, IT, Вы писали:

IT>Зачем вводить новые локальные переменные выше, если их scope ограничен только условием?


Локальные переменные нужны для наглядности кода. Не знаю как обстоят дела с компилятором С#, а современные С++ компиляторы очень многие локальные переменные (особенно в циклах) не создают — помещают значения сразу в регистр. Т.е. и наглядность сохраняется, и лишних сущностей фактически не создаётся.
Re[3]: [C#] Чем плох инлайн ассайнмент?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 08.11.08 21:01
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

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


L>>А что это такое?


ВВ>Ну типа:


ВВ>
ВВ>int x;

ВВ>if ((x = MyFunc()) > 4 && x % 2 == 0)
ВВ>

На мой взляд с if-ом этот пример не совместим. Вычисление x явно просится наружу. А вот с употреблением сабжа в цикле я бы согласился:
while ((x = MyFunc()) > 4 && x % 2 == 0)
{
   ...
}


Есть другие примеры, где сабж довольно удачно вписывается:
public Foo Foo
{ 
    get { return _foo ?? (_foo = new Foo()); } 
}
Re[5]: [C#] Чем плох инлайн ассайнмент?
От: prVovik Россия  
Дата: 08.11.08 21:07
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Так в чем сайд-эффекты? Только в том, что похоже на опечатку?


Сайд эффект в том, что после проверки условия у нас изменится переменная х. А согласно здравому смыслу, а также ожиданиям того, кто будет читать код, проверка условия не должна вообще ничего менять, она лишь проверяет истинность некоторого утверждения.
лэт ми спик фром май харт
Re[4]: [C#] Чем плох инлайн ассайнмент?
От: Воронков Василий Россия  
Дата: 08.11.08 21:07
Оценка:
Здравствуйте, IT, Вы писали:

Честно, не понял. Разве это:

IT>
IT>if (0 == a)
IT>{
IT>}
IT>


писалось не для того, чтобы бороться как раз с теми самыми "опечатками"?

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

int i = 3;

вместо

int i;
i = 3;
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[6]: [C#] Чем плох инлайн ассайнмент?
От: Воронков Василий Россия  
Дата: 08.11.08 21:11
Оценка:
Здравствуйте, prVovik, Вы писали:

V>Сайд эффект в том, что после проверки условия у нас изменится переменная х. А согласно здравому смыслу, а также ожиданиям того, кто будет читать код, проверка условия не должна вообще ничего менять, она лишь проверяет истинность некоторого утверждения.


Переменная x — "состояние" проверки, которое мы анализируем. Потому она меняется. Семантически

GetValue() != 3

и

(x = GetValue()) != 3

полностью аналогичны. Во втором случае я лишь "запоминаю" результат операции, для дальнейших с ним действий. Где здесь нарушение здравого смысла?
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.