Re[3]: [C#] Чем плох инлайн ассайнмент?
От: prVovik Россия  
Дата: 08.11.08 21:12
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

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


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


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


В С++ это ещё более плохо, чем в С#. Просто там значением условия может быть не только логический тип, но и ещё куча других типов (все численные, указатели).
лэт ми спик фром май харт
Re: [C#] Чем плох инлайн ассайнмент?
От: EyeOfHell Россия eyeofhell.habr.ru
Дата: 08.11.08 21:12
Оценка:

Чем плох инлайн ассайнмент?
if ((x = MyFunc()) > 4 && x % 2 == 0)


В конкретном случае — ничем. Но Дьявол — он в деталях. Зачем такое используют? Чтобы сэкономить строчку. Но код имеет обыкновение рости и меняться. Эволюционировать. Усложняться. Если codestyle допускает inline assignment в целях экономии строчки, то через годик-другой в коде начнут появляться вот такие милые конструкции ( пример, не компилируется ):

if( RET_OK == ( result = MyFunc() ) && ( result % LOW_BOUND < MIN_LOW || result % HI_BOUND > MAX_BOUND ) &&
    ( ( RET_OK == ( add_check = MyFunc( PRECISE ) ) || RET_STRANGE == ( add_check = MyFunc( PRECISE ) ) ) || RET_OK == TryValidate( result ) ) ) ||
    result == RESERVED_INT && RET_STRANGE == TryValidate( result ) ) ) )
{
  result += LOW_BOUND;
}


А такие милы конструкции череповаты последствиями в дальнейшей поддержке проекта .

P.S. Некоторые вещи, абсолютно адекватные в примерах уровня "Hello world" приводят к жутким последствиям в долгих проектах с миллионами строчек кода .
Re[6]: [C#] Чем плох инлайн ассайнмент?
От: prVovik Россия  
Дата: 08.11.08 21:13
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

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


ВВ>
ВВ>int x;
ВВ>x = 3;
ВВ>


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


ВВ>Про лямбды с замыканиями я вообще молчу.


Аналогии идут лесом.
лэт ми спик фром май харт
Re[4]: [C#] Чем плох инлайн ассайнмент?
От: prVovik Россия  
Дата: 08.11.08 21:15
Оценка:
Здравствуйте, samius, Вы писали:

S>На мой взляд с if-ом этот пример не совместим. Вычисление x явно просится наружу. А вот с употреблением сабжа в цикле я бы согласился:

S>
S>while ((x = MyFunc()) > 4 && x % 2 == 0)
S>{
S>   ...
S>}


Но только при условии, что за границами этого условия х не виден.
лэт ми спик фром май харт
Re[7]: [C#] Чем плох инлайн ассайнмент?
От: prVovik Россия  
Дата: 08.11.08 21:18
Оценка:
Здравствуйте, Воронков Василий, Вы писали:


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


ВВ>GetValue() != 3


ВВ>и


ВВ>(x = GetValue()) != 3


ВВ>полностью аналогичны. Во втором случае я лишь "запоминаю" результат операции, для дальнейших с ним действий. Где здесь нарушение здравого смысла?


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

Ну я привел пример немного "от балды". В действительности инлайн ассайнмент рулит в тех случаях, когда нужно совершить несколько операций — в результате вместо того, чтобы городить огород из локальных переменных, заводишь одну и используешь ее для хранения промежуточного значения. Типа такого:

(stub = GetData(key1)) != null && !(stub is DBNull) && ...
(stub = GetData(key2)) != null && !(stub is DBNull) && ...

Мне вот лично проще такой код читать чем полуметровый листинг. Поэтому и всякие ?: и ?? тоже в общем рулят ибо позволяют не расписывать все до соплей.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[5]: [C#] Чем плох инлайн ассайнмент?
От: prVovik Россия  
Дата: 08.11.08 21:22
Оценка:
Здравствуйте, prVovik, Вы писали:

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


S>>На мой взляд с if-ом этот пример не совместим. Вычисление x явно просится наружу. А вот с употреблением сабжа в цикле я бы согласился:

S>>
S>>while ((x = MyFunc()) > 4 && x % 2 == 0)
S>>{
S>>   ...
S>>}


V>Но только при условии, что за границами этого условия х не виден.


Прочитал собственную фразу и чуть не завис. Слава Богу, стек вовремя переполнился.
лэт ми спик фром май харт
Re[7]: [C#] Чем плох инлайн ассайнмент?
От: Воронков Василий Россия  
Дата: 08.11.08 21:24
Оценка:
Здравствуйте, prVovik, Вы писали:

V>Аналогии идут лесом.


Ну в таком случае давай философию в стиле "зачем лепить в одну кучу вычисление предиката и действия" тоже пошлем лесом, ок?
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[8]: [C#] Чем плох инлайн ассайнмент?
От: Воронков Василий Россия  
Дата: 08.11.08 21:24
Оценка:
Здравствуйте, prVovik, Вы писали:

V>Это только при условии, что х больше нигде не используется, кроме как в условии. Если используется, то будут проблемы.


Какие проблемы? Я еще ни одной проблемы не услышал.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[2]: [C#] Чем плох инлайн ассайнмент?
От: Воронков Василий Россия  
Дата: 08.11.08 21:24
Оценка:
Здравствуйте, EyeOfHell, Вы писали:

EOH>
EOH>if( RET_OK == ( result = MyFunc() ) && ( result % LOW_BOUND < MIN_LOW || result % HI_BOUND > MAX_BOUND ) &&
EOH>    ( ( RET_OK == ( add_check = MyFunc( PRECISE ) ) || RET_STRANGE == ( add_check = MyFunc( PRECISE ) ) ) || RET_OK == TryValidate( result ) ) ) ||
EOH>    result == RESERVED_INT && RET_STRANGE == TryValidate( result ) ) ) )
EOH>{
EOH>  result += LOW_BOUND;
EOH>}
EOH>


Напиши пожалуйста аналог этого код так, как он должен выглядеть правильно на твой взгляд и поставь их вместе. Как раз и сравним читабельность.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[8]: [C#] Чем плох инлайн ассайнмент?
От: prVovik Россия  
Дата: 08.11.08 21:28
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

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


V>>Аналогии идут лесом.


ВВ>Ну в таком случае давай философию в стиле "зачем лепить в одну кучу вычисление предиката и действия" тоже пошлем лесом, ок?


Это ещё почему?
Если уж тебе так хочется использовать аналогии, то докажи сначала, что аналогия корректна.
лэт ми спик фром май харт
Re[2]: [C#] Чем плох инлайн ассайнмент?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 08.11.08 21:30
Оценка:
Здравствуйте, 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" приводят к жутким последствиям в долгих проектах с миллионами строчек кода .


Если миллион строчек вставить в одну — то конечно так и будет!
Re[9]: [C#] Чем плох инлайн ассайнмент?
От: Воронков Василий Россия  
Дата: 08.11.08 21:32
Оценка:
Здравствуйте, prVovik, Вы писали:

V>Это ещё почему?

V>Если уж тебе так хочется использовать аналогии, то докажи сначала, что аналогия корректна.

Слушай, давай ты мне не будешь говорить, что я могу использовать, а что нет. Если нечего сказать, то лучше ничего и не говорить. А вести пустопорожние беседы я не намерен.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[4]: [C#] Чем плох инлайн ассайнмент?
От: IT Россия linq2db.com
Дата: 08.11.08 21:41
Оценка: +1
Здравствуйте, prVovik, Вы писали:

V>В С++ это ещё более плохо, чем в С#.


То, что это плохо в C++ как раз понятно. ВВ хочет понять чем это плохо в C#. Кроме сомнительного аргумента про читабельность пока ничего не прозвучало.
Неясность изложения обычно происходит от путаницы в мыслях.
Если нам не помогут, то мы тоже никого не пощадим.
Re[9]: [C#] Чем плох инлайн ассайнмент?
От: prVovik Россия  
Дата: 08.11.08 21:42
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

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


V>>Это только при условии, что х больше нигде не используется, кроме как в условии. Если используется, то будут проблемы.


ВВ>Какие проблемы? Я еще ни одной проблемы не услышал.


http://en.wikipedia.org/wiki/Side_effect_(computer_science)

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.


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

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


V>>Это ещё почему?

V>>Если уж тебе так хочется использовать аналогии, то докажи сначала, что аналогия корректна.

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


Иначе получается демагогия. С чего ты взял, что присвоения в условиях аналогичны инициализации переменных? С таким же успехом я могу сказать, присвоения в условиях аналогичны поеданию младенцев.
лэт ми спик фром май харт
Re[3]: [C#] Чем плох инлайн ассайнмент?
От: EyeOfHell Россия eyeofhell.habr.ru
Дата: 08.11.08 21:47
Оценка: 7 (1)

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


Пример, из головы, 1 минута, не компилируется, не полностью соответствует первому примеру, без стилей:

Экономим строчки:

if( RET_OK == ( result = MyFunc() ) && ( result % LOW_BOUND < MIN_LOW || result % HI_BOUND > MAX_BOUND ) &&
    ( ( RET_OK == ( add_check = MyFunc( PRECISE ) ) || RET_STRANGE == ( add_check = MyFunc( PRECISE ) ) ) || RET_OK == TryValidate( result ) ) ) ||
      result == RESERVED_INT && RET_STRANGE == TryValidate( result ) ) ) )
{
  result += LOW_BOUND;
}


Злобно не экономим строчки, один из возможных стилей, не самый лучший:

result = MyFunc();

if( RET_OK != result )
{
  result = MyFunc( PRECISE );
}

if( RET_OK != result && RET_STRANGE != result )
{
  result = TryValidate( result );
}

bool overbounds = false;
if( RET_OK == result )
{
  overbounds = result % LOW_BOUND < MIN_LOW || result % HI_BOUND > MAX_BOUND;
}

if( overbounds && ( RET_OK == result || RET_STRANGE == result ) )
{
  result += LOW_BOUND;
}
Re[10]: [C#] Чем плох инлайн ассайнмент?
От: Воронков Василий Россия  
Дата: 08.11.08 21:54
Оценка:
Здравствуйте, 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, самый смысл выполнения которой в том, чтобы вернуть результат.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[4]: [C#] Чем плох инлайн ассайнмент?
От: Lloyd Россия  
Дата: 08.11.08 21:55
Оценка: +1
Здравствуйте, samius, Вы писали:


S>Есть другие примеры, где сабж довольно удачно вписывается:

S>
S>public Foo Foo
S>{ 
S>    get { return _foo ?? (_foo = new Foo()); } 
S>}
S>


get, меняющий состояние — нафик, нафик.
Re[11]: [C#] Чем плох инлайн ассайнмент?
От: prVovik Россия  
Дата: 08.11.08 22:04
Оценка:
Здравствуйте, Воронков Василий, Вы писали:
факт вычисления условия не изменит состояния программы.

ВВ>С чего ты решил, что можешь провести аналогию между


ВВ>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, самый смысл выполнения которой в том, чтобы вернуть результат.


Взгляни на код:


ВВ>
ВВ>int x = 10;

ВВ>if (...куча условий...x=MyFunc()...куча условий...)
ВВ>{
    Console.WriteLine(x);
ВВ>}
ВВ>


Что будет выведено на экран?
лэт ми спик фром май харт
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.