As is или история о том как не надо писать код
От: Владислав Чистяков (VladD2) Российская Империя www.nemerle.org
Дата: 05.08.04 14:13
Оценка: 1078 (35) +8 -2 :))
Статья:
As is или история о том как не надо писать код
Автор(ы): Владислав Чистяков (VladD2)
Дата: 18.12.2004
Работая над открытыми проектами, автор заметил, что операторы as и is многими программистами зачастую используются ненадлежащим образом. Результатом очередного двухчасового поиска ошибки и стала эта статья.




Авторы:
Владислав Чистяков (VladD2)

Аннотация:
Работая над открытыми проектами, автор заметил, что операторы as и is многими программистами зачастую используются ненадлежащим образом. Результатом очередного двухчасового поиска ошибки и стала эта статья.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: As is или история о том как не надо писать код
От: Воронков Василий Россия  
Дата: 05.08.04 16:31
Оценка: :))) :)
Здравствуйте, Владислав Чистяков (VladD2), Вы писали:

ВЧV>Аннотация:

ВЧV>Работая над открытыми проектами, автор заметил, что операторы as и is многими программистами зачастую используются ненадлежащим образом. Результатом очередного двухчасового поиска ошибки и стала эта статья.

Круто Надо бы еще тех, за кем было замечено чрезмерное использование as, повесить на доску всеобщего презрения. А может, даже из партии исключить?
... << Rsdn@Home 1.1.4 beta 1 >>
Re[2]: As is или история о том как не надо писать код
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.08.04 04:45
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Круто Надо бы еще тех, за кем было замечено чрезмерное использование as, повесить на доску всеобщего презрения. А может, даже из партии исключить?


Ну, то проблемы работодателя.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Что означает понятие skills в резюме для работодателя?
От: Andy77 Ниоткуда  
Дата: 07.08.04 06:52
Оценка: 61 (3) -2 :))) :))) :))
Написать, что ли, статью про опасности, возникающие при неявных приведениях типов в С++, про использование using в С# или про то, что нужно проверять делитель на ноль
Re[2]: Что означает понятие skills в резюме для работодателя
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.08.04 19:29
Оценка: +1
Здравствуйте, Andy77, Вы писали:

A>Написать, что ли, статью про опасности, возникающие при неявных приведениях типов в С++, про использование using в С# или про то, что нужно проверять делитель на ноль


Напиши. Особенно интересно последнее.

PS

Не все что кажется тебе банальным и само собой разумеющимся расценивается так же другими. Вот ты думашь, что тебе мика столько оценок наставил? Это он не согласен с сутью статьи, но боится открыто поставить минус.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: As is или история о том как не надо писать код
От: TK Лес кывт.рф
Дата: 11.08.04 09:46
Оценка:
Здравствуйте, Владислав Чистяков (VladD2), Вы писали:

ВЧV>Авторы:

ВЧV> Владислав Чистяков (VladD2)

ВЧV>Аннотация:

ВЧV>Работая над открытыми проектами, автор заметил, что операторы as и is многими программистами зачастую используются ненадлежащим образом. Результатом очередного двухчасового поиска ошибки и стала эта статья.

На всякий случай — это пока не статья, а ее анонс в журнале. В какой-то степени она является следствием этого обсуждения здесь
Автор: AndrewVK
Дата: 22.06.04
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[2]: As is или история о том как не надо писать код
От: GuinPin  
Дата: 11.08.04 10:16
Оценка: :)
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Здравствуйте, Владислав Чистяков (VladD2), Вы писали:


ВЧV>>Аннотация:

ВЧV>>Работая над открытыми проектами, автор заметил, что операторы as и is многими программистами зачастую используются ненадлежащим образом. Результатом очередного двухчасового поиска ошибки и стала эта статья.

ВВ>Круто Надо бы еще тех, за кем было замечено чрезмерное использование as, повесить на доску всеобщего презрения. А может, даже из партии исключить?


Какой....
Автор: adontz
Дата: 05.08.04

... << RSDN@Home 1.1.3 stable >>
С уважением, Сошников Иван
Re: As is или история о том как не надо писать код
От: adventurer Израиль  
Дата: 07.11.04 13:34
Оценка:
Здравствуйте, Владислав Чистяков (VladD2), Вы писали:

ВЧV>Статья:



ВЧV>Авторы:

ВЧV> Владислав Чистяков (VladD2)

ВЧV>Аннотация:

ВЧV>Работая над открытыми проектами, автор заметил, что операторы as и is многими программистами зачастую используются ненадлежащим образом. Результатом очередного двухчасового поиска ошибки и стала эта статья.


Eto to chem ja polzuyus .
http://www.idesign.net/idesign/download/IDesign%20CSharp%20Coding%20Standard.zip
Ob operator(e) as na stranize 8. Ob avtore chitay zdes http://www.softwarelegends.com/legends.html
Re: As is или история о том как не надо писать код
От: dshe  
Дата: 20.12.04 09:15
Оценка: +3
Здравствуйте, Владислав Чистяков (VladD2), Вы писали:

ВЧV>Статья:



ВЧV>Авторы:

ВЧV> Владислав Чистяков (VladD2)

ВЧV>Аннотация:

ВЧV>Работая над открытыми проектами, автор заметил, что операторы as и is многими программистами зачастую используются ненадлежащим образом. Результатом очередного двухчасового поиска ошибки и стала эта статья.

Хорошая статья. Я согласен с ее идеей.

Что не понравилось:

1. Читая статью у меня возникло ощущение того, что один и тот же довод "пережевывается" несколько раз. Такая эмоциональная фраза, как "бессонные ночи", встречается в статье трижды.

2. В статью попал факт личностного конфликта в виде такого легкого намека:

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

В программе не было ни одного приведения типов, но постоянно встречались as. Мои попытки объяснить порочность данной практики были тщетны. Упорство, с которым отстаивалось применение as-ов, было воистину достойно лучшего применения.

Мне показалось, что это была попытка (возможно ненамеренная) кого-то уязвить.
--
Дмитро
Re[2]: As is или история о том как не надо писать код
От: Аноним  
Дата: 20.12.04 09:19
Оценка:
Здравствуйте, dshe, Вы писали:

D>Мне показалось, что это была попытка (возможно ненамеренная) кого-то уязвить.


Прочитай этот тред повнимательней и обрати внимание на имена
Re[3]: As is или история о том как не надо писать код
От: dshe  
Дата: 20.12.04 09:44
Оценка:
Здравствуйте, Аноним, Вы писали:

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


D>>Мне показалось, что это была попытка (возможно ненамеренная) кого-то уязвить.


А>Прочитай этот тред повнимательней и обрати внимание на имена


Мне это не интересно.
--
Дмитро
Re[4]: As is или история о том как не надо писать код
От: Mika Soukhov Stock#
Дата: 20.12.04 09:47
Оценка: +2
Здравствуйте, dshe, Вы писали:

D>Мне это не интересно.


Вообще, данный форум не для таких вещей. Здесь обсуждаются тенхические детали. Если хочешь пообщаться лично, пиши автору на мыло.
Re: As is или история о том как не надо писать код
От: Alik Украина  
Дата: 20.12.04 11:23
Оценка: +1
Не совсем понятно, почему так легко отметается все-таки основной аргумент — скорость, а упор делается на в общем-то практически и не аргумент (эстетизм).
Насколько я понимаю, использование as с обязательной проверкой на null не менее надежна, чем old-style type cast. По скорости тут выигрыш не только благодаря тому, что as отрабатывает быстрее, но и благодаря тому, что пробрасывание исключения — это более дорогая операция, чем проверка на null.
Я бы сказал, что сравнение as и old-style type cast по сути сводится к сравнению бросания исключения и возврата кода ошибки (скорость vs удобство и элегантность дизайна).
С уважением. Алик.
Re[2]: As is или история о том как не надо писать код
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 20.12.04 11:55
Оценка: +1 -1
Здравствуйте, Alik, Вы писали:

A>Насколько я понимаю, использование as с обязательной проверкой на null не менее надежна, чем old-style type cast.


Но кода при этом больше.

A> По скорости тут выигрыш не только благодаря тому, что as отрабатывает быстрее,


Только в 1.1. Там же для 2.0 тесты должны быть.

A> но и благодаря тому, что пробрасывание исключения — это более дорогая операция, чем проверка на null.


Исключение на то оно и исключение, что происходит в исключительной ситуации, а там скорость уже по барабану. Да и не так дорого это — выкидывать исключение. Я как то тест сюда кидал — за секунду можно сгенерить миллионы исключений. Представляешь сколько их надо выкинуть чтобы это сказалось на производительности?

A>Я бы сказал, что сравнение as и old-style type cast по сути сводится к сравнению бросания исключения и возврата кода ошибки (скорость vs удобство и элегантность дизайна).


Там в статье, насколько я помню так и сказано — as применять в том случае, если ошибка приведения это нормальная логика программы, а не исключительная ситуация. Заменять же исключительную ситуацию кодоб ошибки не очень умно.
... << RSDN@Home 1.1.4 beta 3 rev. 268>>
AVK Blog
Re[2]: As is или история о том как не надо писать код
От: _FRED_ Черногория
Дата: 20.12.04 13:18
Оценка:
Здравствуйте, Alik, Вы писали:
A>Не совсем понятно, почему так легко отметается все-таки основной аргумент — скорость, а упор делается на в общем-то практически и не аргумент (эстетизм).
В статье сказано:

Но можно ли жертвовать надежностью ПО ради скорости?

Help will always be given at Hogwarts to those who ask for it.
Re[3]: As is или история о том как не надо писать код
От: Mika Soukhov Stock#
Дата: 20.12.04 13:24
Оценка: :)
Здравствуйте, _FRED_, Вы писали:

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

A>>Не совсем понятно, почему так легко отметается все-таки основной аргумент — скорость, а упор делается на в общем-то практически и не аргумент (эстетизм).
_FR>В статье сказано:
_FR>

Но можно ли жертвовать надежностью ПО ради скорости?


Вообще, чтобы такое заявлять, нужно держать на руках список аналитических данных, в которых говорить, что С-привидние типов даст прирост в плане надежности ошибок больше, чем as. Без таких данных говорить о том, что лучше, а что хуже — поменьшей мере наивно.

Если гнаться за такими вещами, то рано или поздно написанный код скатиться к уровню параноидальному, ибо все ошибки отследить невозможно.
Re[4]: As is или история о том как не надо писать код
От: _FRED_ Черногория
Дата: 20.12.04 14:03
Оценка: 6 (1)
Здравствуйте, Mika Soukhov, Вы писали:
A>>>Не совсем понятно, почему так легко отметается все-таки основной аргумент — скорость, а упор делается на в общем-то практически и не аргумент (эстетизм).
_FR>>В статье сказано:

Но можно ли жертвовать надежностью ПО ради скорости?

MS>Вообще, чтобы такое заявлять, нужно держать на руках список аналитических данных, в которых говорить, что С-привидние типов даст прирост в плане надежности ошибок больше, чем as. Без таких данных говорить о том, что лучше, а что хуже — поменьшей мере наивно.
MS>Если гнаться за такими вещами, то рано или поздно написанный код скатиться к уровню параноидальному, ибо все ошибки отследить невозможно.

Очевидно, что сообщение в рантайме об ошибке приведения типов даст более правильную информацию, нежели ошибка обращения по нулевому поинтеру что позволит гораздо точнее локализовать место её возникновения и, соответственно, исправить.
Help will always be given at Hogwarts to those who ask for it.
Re[5]: As is или история о том как не надо писать код
От: Alik Украина  
Дата: 20.12.04 22:09
Оценка: +2 -1
Здравствуйте, _FRED_, Вы писали:

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

_FR>Очевидно, что сообщение в рантайме об ошибке приведения типов даст более правильную информацию, нежели ошибка обращения по нулевому поинтеру что позволит гораздо точнее локализовать место её возникновения и, соответственно, исправить.

Очевидно, что ошибка в production как в результате несловленного исключения, так и в результате не проверки на null — абсолютно неприемлемое поведение программы.
Посему, если мы будет говорить про написание качественного кода, т.е. кода, в котором предусматривается проверка на null или ловится исключение, надежность одинаковая, а по скорости выигрывает as. Вроде бы все очевидно. Совершенно не понятно, о чем спорить и это ИМХО тема вопроса в FAQ на 10-15 строк, а не статьи на несколько экранов.
С уважением. Алик.
Re[6]: As is или история о том как не надо писать код
От: _FRED_ Черногория
Дата: 20.12.04 22:48
Оценка: 18 (1) +1
Здравствуйте, Alik, Вы писали:
MS>>>Если гнаться за такими вещами, то рано или поздно написанный код скатиться к уровню параноидальному, ибо все ошибки отследить невозможно.
_FR>>Очевидно, что сообщение в рантайме об ошибке приведения типов даст более правильную информацию, нежели ошибка обращения по нулевому поинтеру что позволит гораздо точнее локализовать место её возникновения и, соответственно, исправить.
A>Очевидно, что ошибка в production как в результате несловленного исключения, так и в результате не проверки на null — абсолютно неприемлемое поведение программы.
  1. Ошибка может возникнуть и у бета-тестеров, не имеющих под рукой отладчика и исходников.
  2. Если нам всё-таки не повезло и она появилась у енд-юзера (что поделать, и такое бывает ), то найти её будет много проще.

A>Посему, если мы будет говорить про написание качественного кода, т.е. кода, в котором предусматривается проверка на null или ловится исключение, надежность одинаковая, а по скорости выигрывает as. Вроде бы все очевидно. Совершенно не понятно, о чем спорить и это ИМХО тема вопроса в FAQ на 10-15 строк, а не статьи на несколько экранов.


В FAQ не обосновывают выводы, не задаются сакраментальными вопросами, а говорят, как поступать в некоторой ситуации.
Когда наболело и требуется поспорить "10-15 строк" в стиле FAQ я счёл бы неуважением к оппонентам. Автор же не поленился написать тесты, вспомнить ссылки и поискать цитаты, добиться в редколлегии права провести свой взгляд в массы ...

P.S. Если кто считает тесты не справедливыми а ссылки и цитаты неуместными, то это отдельный разговор, для которого топик, по всей видимости, и создавался.
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Что означает понятие skills в резюме для работодателя
От: DuШes  
Дата: 21.12.04 06:25
Оценка: +1
Здравствуйте, Andy77, Вы писали:

A>Написать, что ли, статью про опасности, возникающие при неявных приведениях типов в С++, про использование using в С# или про то, что нужно проверять делитель на ноль


похоже на сарказм....лично по мне чем больше статей хороших, тем лучше....вот если бы вы взяли действительно и написали, хуже от этого не было бы....имхо...совсем неплохо, когда есть возможность поучиться у специалистов..
Re[3]: Что означает понятие skills в резюме для работодателя
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.12.04 07:00
Оценка:
Здравствуйте, DuШes, Вы писали:

DШ>лучше....вот если бы вы взяли действительно и написали,


Поддерживаю всеми руками и ногами.
... << RSDN@Home 1.1.4 beta 3 rev. 267>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: As is или история о том как не надо писать код
От: Mika Soukhov Stock#
Дата: 21.12.04 08:33
Оценка: +1 -2 :)
Здравствуйте, _FRED_, Вы писали:

_FR>Очевидно, что сообщение в рантайме об ошибке приведения типов даст более правильную информацию, нежели ошибка обращения по нулевому поинтеру что позволит гораздо точнее локализовать место её возникновения и, соответственно, исправить.


А если мы передадим null и прикастим его C-like привидением? Будет тот же NullReferenceException. В том то и дело, что проверка на null нужна. Тогда, раз она нужна, почему бы не использовать сразу as, ведь он намного быстрее.
Re[3]: Что означает понятие skills в резюме для работодателя
От: Mika Soukhov Stock#
Дата: 21.12.04 08:36
Оценка:
Здравствуйте, DuШes, Вы писали:

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


A>>Написать, что ли, статью про опасности, возникающие при неявных приведениях типов в С++, про использование using в С# или про то, что нужно проверять делитель на ноль


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


Чисто мое мнение и сужу только по себе.

Специалисты обычно в журналы не пишут, у них своей работы много. И честно говоря, читать статью, где редактор журнала (а не именно специалист) учит меня как правильно писать код, мягко говоря, выглядит смешным. Это все равно что слушать, как нужно проектировать системы от архитектора, не закончившего удачно ни одного проекта.
Re[4]: Что означает понятие skills в резюме для работодателя
От: DuШes  
Дата: 21.12.04 09:31
Оценка: 5 (2) +6
Здравствуйте, Mika Soukhov, Вы писали:

MS>Здравствуйте, DuШes, Вы писали:


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


A>>>Написать, что ли, статью про опасности, возникающие при неявных приведениях типов в С++, про использование using в С# или про то, что нужно проверять делитель на ноль


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


MS>Чисто мое мнение и сужу только по себе.


MS>Специалисты обычно в журналы не пишут, у них своей работы много. И честно говоря, читать статью, где редактор журнала (а не именно специалист) учит меня как правильно писать код, мягко говоря, выглядит смешным. Это все равно что слушать, как нужно проектировать системы от архитектора, не закончившего удачно ни одного проекта.


да речь не об этом...ваше личное мнение о Владе Чистякове меня вообще не интересует, это очень круто, что Вы специалист, есть законченные проекты (без всякого сарказма), но если человек нашел возможность поделиться опытом, то я считаю что это достойно по крайней мере уважения, а не насмешек и тем более проявления неуважения, и совсем не причем тут кто и кем работает и у кого сколько свободного времени (кстати, времени свободного ни у кого нет)...если Вы считаете, что в статье есть изъяны, никто же не запрещает написать отдельную статью и опровергнуть (опять таки аргументировано) те доводы, которые приведены в статье Влада Чистякова...

От себя скажу, что всегда очень внимательно читаю статьи, посвященные некоторым тонкостям программирования под .net (пока не имею опыта в написании проектов под .net, но думаю, со времением это компенсируется), и для себя отметил, что статьи Влада отличаются очень глубоким подходом и анализом (достаточно сравнить статьи Prashant Sridharan(ms) о будущих возможностях языка C#, опубликованный перевод на gotdotnet, и статью Vlad2 о generic-типах, неполных типах, анонимных методах и пр.., опубликованную в rsdn mag)

ps: далеко не факт, что главный редактор журнала понимает меньше чем какой-либо трижды заслуженный специалист с готовыми проектами, даже наоборот, в связи со спецификой работы у специалиста наврядли найдется время уделить внимание проведению анализа кода, его чистоте, правильности и пр..., в то время как человек, конкретно изучающий чисто технологию программирования (не конкретный проект) уделит таким вопросам и тонкостям гораздо больше внимания....имхо...
pps: не хотел кого-либо упрекнуть в непроффесиональности...
Re[5]: Что означает понятие skills в резюме для работодателя
От: Mika Soukhov Stock#
Дата: 21.12.04 09:41
Оценка: 16 (1) :)
Здравствуйте, DuШes, Вы писали:

DШ>От себя скажу, что всегда очень внимательно читаю статьи, посвященные некоторым тонкостям программирования под .net (пока не имею опыта в написании проектов под .net, но думаю, со времением это компенсируется), и для себя отметил, что статьи Влада отличаются очень глубоким подходом и анализом (достаточно сравнить статьи Prashant Sridharan(ms) о будущих возможностях языка C#, опубликованный перевод на gotdotnet, и статью Vlad2 о generic-типах, неполных типах, анонимных методах и пр.., опубликованную в rsdn mag)


Сама по себе статья читается легко. Это все же заслуга автора. А смысл... Вообще-то это перевод спецификации, причем не детальный (некоторые важный на мой взгляд моменты упущены).

DШ>pps: не хотел кого-либо упрекнуть в непроффесиональности...


Ты меня тоже не правильно понял. Я никого не упрекал. Я лишь предостеригаю, что не стоит верить всему на слово.
Re: As is или история о том как не надо писать код
От: feanor_ka  
Дата: 21.12.04 14:09
Оценка:
Здравствуйте, Владислав Чистяков (VladD2), Вы писали:

Теперь о скорости. В Framework 1.0 и 1.1 скорость операторов была следующей: самым быстрым был оператор is, за ним шел as и последним шел оператор приведения типов (). Причем is и as отличались очень незначительно, а () был медленнее приблизительно на 10-20%. Даже применение as с последующей проверкой на null было заметно быстрее, чем оператор ------>присвоения.<----

Это не ошибка??? Может быть имелось ввиду "оператор приведения"
Re[2]: As is или история о том как не надо писать код
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.12.04 15:31
Оценка:
Здравствуйте, feanor_ka, Вы писали:

_>Это не ошибка??? Может быть имелось ввиду "оператор приведения"


Да, несомненно. Имелось в виду "оператор приведения итипов".

Спасибо, за замечание.
... << RSDN@Home 1.1.4 beta 3 rev. 267>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Что означает понятие skills в резюме для работодателя
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.12.04 15:15
Оценка:
Здравствуйте, DuШes, Вы писали:

...

Спасибо за добрые слова.
... << RSDN@Home 1.1.4 beta 3 rev. 267>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Что означает понятие skills в резюме для работодателя
От: DuШes  
Дата: 23.12.04 15:59
Оценка: :))
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, DuШes, Вы писали:


VD>...


VD>Спасибо за добрые слова.


вот как раз сейчас и
Re: As is или история о том как не надо писать код
От: AlLucky Беларусь Qulix Systems
Дата: 24.12.04 08:40
Оценка: :)
Здравствуйте, Владислав Чистяков (VladD2), Вы писали:

Извините, что потревожил Вас.
В статье было сказаноо неэстетичности оператора приведения типов типа (toType) myObject.
А чем Вам такое не нравится?
Почему это не есть хорошо?
И что Вы тогда скажете о ВБшном CType (fromObject, toType)?

Спасибо. А то я так не любил сиппшные приведения и так любил сишные, а тут на тебе — говорят, что это чуть ли не полный отстой с точки зрения эстетики.....
Sincerely Mine ... AlLucky Sly << RSDN@Home 1.1.4 Слушаю болтовню коллег ...>>
Aleksandr Sly
Re[2]: As is или история о том как не надо писать код
От: DuШes  
Дата: 24.12.04 08:46
Оценка: +1
Здравствуйте, AlLucky, Вы писали:

AL>Здравствуйте, Владислав Чистяков (VladD2), Вы писали:


AL>Извините, что потревожил Вас.

AL>В статье было сказаноо неэстетичности оператора приведения типов типа (toType) myObject.
AL>А чем Вам такое не нравится?
AL>Почему это не есть хорошо?
AL>И что Вы тогда скажете о ВБшном CType (fromObject, toType)?

AL>Спасибо. А то я так не любил сиппшные приведения и так любил сишные, а тут на тебе — говорят, что это чуть ли не полный отстой с точки зрения эстетики.....


лично я для себя в статье уловил одну (не самую важную мысль): для приведения value-type типов все равно приходится использовать оператор приведения (), для reference-type типов можно использовать и () и as...то есть получаем два стиля оформления? зачем это нужно? лучше использовать один тип оформления по старому (), чем сочетать два стиля для различных типов...

Насчет эстетичности..мне лично все же ближе старый добрый ().
Re[5]: As is или история о том как не надо писать код
От: TK Лес кывт.рф
Дата: 24.12.04 23:13
Оценка: 30 (2) :))) :))
Здравствуйте, Mika Soukhov, Вы писали:

MS>Вообще, данный форум не для таких вещей. Здесь обсуждаются тенхические детали. Если хочешь пообщаться лично, пиши автору на мыло.


думаю, что стоит ждать очередной нетленки для сишников — dynamic_cast<T&> vs dynamic_cast<T*> а то, получается, что они без своей доли просвящения остались...
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[2]: As is или история о том как не надо писать код
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.12.04 00:49
Оценка: 8 (2) +1
Здравствуйте, AlLucky, Вы писали:

AL>Извините, что потревожил Вас.


Да, ничего, ничего. Этот форум для того и создан, чтобы треваожить.

AL>В статье было сказаноо неэстетичности оператора приведения типов типа (toType) myObject.

AL>А чем Вам такое не нравится?

Если не ошибаюсь, я в статье оговорился, что это дело вкуса. О эстетике я в основном говорил, так как это один из основных аргументов тех кто заменяет приведение типов на as.

AL>Почему это не есть хорошо?


В принципе можно попытаться привести несколько аргументов против "(type)":
1. Оператор () приводит к неоднозначностям которые разрешаются в C# не совсем честными методами. Например, вот такой код будет верным приведением типов:
int i = (int)-1.2;

А вот это не верное:
System.Int32 i = (System.Int32)-1.2;

И это соответственно тоже (даже если A — это алиас типа или тип реализующий приведение типов):
A i = (A)-1.2;

А вот так:
System.Int32 i  = (System.Int32)(-1.2);
int          i1 = (int)(-1.2);
A            i2 = (A)(-1.2);

все будет считаться нормальным для любого типа поддерживающего данное приведение.
Причем разница в первом случае заключается только в том, что int является встроенным типом языка, а System.Int32 и A нет.
Дело в том, что для упрощения парсинга разработчики языка ввели ряд эвристический методов разрешения грамматических конструкций. Обычно это не приводит к проблемам, но в некоторых случаях способно усложнить восприятие кода.

Естественно, что неоднозначности приходится разрешать не только компилятору, но и человеку. Так что процесс чтения кода несколько усложняется.

2. Если после приведения типов требуется обратиться к членам типа к которому приведен объект, то требуется брать выражение приведения в дополнительные скобки, так как доступ к членам (точка) имеет более высокий приоритет:
((B)a).SomeMethod();

Это само по себе выглядит не очень хорошо, а будучи наложенным на другие приведения портит читаемость кода очень сильно:
((D)((C)((B)a).Xxx).Yyy).SomeMethod();

Пойди разберись в этом нагромаждении скобок.
И тут некий другой синтаксис приведения выглядил бы лучше. Нарпмер, с as это будет выглядить так:
(((a as B).Xxx as C).Yyy as D).SomeMethod();

В принципе, по-моему, так более читабельно. Однако было бы еще лучше если можно было писать так:
D(С(B(a).Xxx).Yyy).SomeMethod();

К сожалению, создатели C# взяли пример с С, а не С++ или Дельфи.

AL>И что Вы тогда скажете о ВБшном CType (fromObject, toType)?

CType в сочетании с СХхх мне кажется действительно более красивым решением. Однако оно несколько громоздкое. Лучшим вариантом мне кажется просто функциональная запись. Тогда ко всему прочему еще и упростился бы синтаксис операторов приведения типов (implicit и explicit).

AL>Спасибо. А то я так не любил сиппшные приведения и так любил сишные, а тут на тебе — говорят, что это чуть ли не полный отстой с точки зрения эстетики.....


Откровенно говоря мне по фигу чистая эстетика, но не по фигу читаемость кода и простота его написания. Исходя из этого можно сказать, что явное приведение типов — это вообще зло. Так что лучше пользоваться такими вещами как виртуальные методы, паттерны доступа вроде Visitor-а и обобщенными контейнерами. При грамотном дизайне зачастую удается создать очень красивые решения, вообще не прибегающие к приведению типов. При этом так же улучшаются возможности расширения (рефакторинга) кода, так как явные приведения очень часто приводят к проблемам при изменении дизайна (везде где они использовались может потребоваться внести изменения).
... << RSDN@Home 1.1.4 beta 3 rev. 267>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: As is или история о том как не надо писать код
От: Аноним  
Дата: 25.12.04 10:05
Оценка: +2 :)
Здравствуйте, Владислав Чистяков (VladD2), Вы писали:


int    i = 123;
void*  p = &i;
double d = *(double*)p;
printf("i = %f", d);


Ха-ха.. ишь чё MS.NET придумал чтобы очернить чистый Си..

Делать надо так:

int    i = 123;
void*  p = &i;
double d = ((double)*p);
printf("i = %f", d);


И не страдать от надуманных проблем.
Re[3]: As is или история о том как не надо писать код
От: tarkil Россия http://5209.copi.ru/
Дата: 27.12.04 06:02
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Исключение на то оно и исключение, что происходит в исключительной ситуации, а там скорость уже по барабану. Да и не так дорого это — выкидывать исключение. Я как то тест сюда кидал — за секунду можно сгенерить миллионы исключений. Представляешь сколько их надо выкинуть чтобы это сказалось на производительности?


Запустил я однажды под отладчиком в седьмой студии C++'ную процедуру, которая в нормальной ситуации работает меньше секунды, но генерит около пяти тысяч исключений (и сама же их ловит). Ой, мама... Минут пять работала.
--
wbr, Peter Taran
Re: As is или история о том как не надо писать код
От: tarkil Россия http://5209.copi.ru/
Дата: 27.12.04 06:09
Оценка: +1
Здравствуйте, Владислав Чистяков (VladD2), Вы писали:

ВЧV>Аннотация:

ВЧV>Работая над открытыми проектами, автор заметил, что операторы as и is многими программистами зачастую используются ненадлежащим образом. Результатом очередного двухчасового поиска ошибки и стала эта статья.

Хорошая статья, спасибо, Владислав. Простая и полезная.

Одно замечание про аварию с Ариал 5. Много раз слышал эту историю как аргумент в пользу проверки всего и вся. Однако, почему-то никто из авторов ещё не отмечал тот факт, что, независимо от любых проверок, алгоритма для управление ракетой с таким вот неожиданным параметром не было. Даже если бы программисты вставили проверку, ракета погибла бы — чем бы ей помог exception вида "value out of expected bounds"? Оно б помогло только локализовать ошибку и исправить её в софте для следующей ракеты (если ракета передаёт такую информацию в ЦУП )
--
wbr, Peter Taran
Re[4]: As is или история о том как не надо писать код
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 27.12.04 08:50
Оценка: 1 (1)
Здравствуйте, tarkil, Вы писали:

T>Запустил я однажды под отладчиком в седьмой студии C++'ную процедуру, которая в нормальной ситуации работает меньше секунды, но генерит около пяти тысяч исключений (и сама же их ловит). Ой, мама... Минут пять работала.


И какое отношение имеет скорость работы исключений в С++ в отладчике к скорости работы онных в дотнете без отладчика?
... << RSDN@Home 1.1.4 beta 3 rev. 268>>
AVK Blog
Re[5]: As is или история о том как не надо писать код
От: tarkil Россия http://5209.copi.ru/
Дата: 27.12.04 08:58
Оценка: +2
Здравствуйте, AndrewVK, Вы писали:

AVK>И какое отношение имеет скорость работы исключений в С++ в отладчике к скорости работы онных в дотнете без отладчика?


Ответ содержится в вопросе: и то и то является "скоростью работы"

А если серьёзно, то не надо много исключений кидать. Ибо скажет много неласковых слов тот, кому придётся этот код дебажить. Это как с as/() — "у меня всё работает", а коллеги с горя могут и повеситься.
--
wbr, Peter Taran
Re[6]: As is или история о том как не надо писать код
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 27.12.04 10:49
Оценка:
Здравствуйте, tarkil, Вы писали:

T>А если серьёзно, то не надо много исключений кидать. Ибо скажет много неласковых слов тот, кому придётся этот код дебажить. Это как с as/() — "у меня всё работает", а коллеги с горя могут и повеситься.


Так я ж не предлагаю много исключений кидать. Речь о другом — замене исключений на коды возврата. Причем признается что это убогий дизайн и оправдывается скоростью.
... << RSDN@Home 1.1.4 beta 3 rev. 268>>
AVK Blog
Re[2]: As is или история о том как не надо писать код
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.12.04 10:55
Оценка:
Здравствуйте, tarkil, Вы писали:

T>Хорошая статья, спасибо, Владислав. Простая и полезная.


Спасибо за добрые слова.

T>Одно замечание про аварию с Ариал 5. Много раз слышал эту историю как аргумент в пользу проверки всего и вся. Однако, почему-то никто из авторов ещё не отмечал тот факт, что, независимо от любых проверок, алгоритма для управление ракетой с таким вот неожиданным параметром не было. Даже если бы программисты вставили проверку, ракета погибла бы — чем бы ей помог exception вида "value out of expected bounds"? Оно б помогло только локализовать ошибку и исправить её в софте для следующей ракеты (если ракета передаёт такую информацию в ЦУП )


Я привел этот пример не в целях убедить всех проверять все и вся. Оснавная цель этого примера была наглядно продемонстрировать пагубность рассуждений типа "в данных условиях все ОК". Черт кроется в деталях и надо стараться делать так чтобы этих самых деталей было как можно меньше, ну, или чтобы как можно меньше от них зависить.
... << RSDN@Home 1.1.4 beta 3 rev. 267>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: As is или история о том как не надо писать код
От: tarkil Россия http://5209.copi.ru/
Дата: 27.12.04 11:11
Оценка: 10 (1) +2
Здравствуйте, VladD2, Вы писали:

VD>Я привел этот пример не в целях убедить всех проверять все и вся. Оснавная цель этого примера была наглядно продемонстрировать пагубность рассуждений типа "в данных условиях все ОК". Черт кроется в деталях и надо стараться делать так чтобы этих самых деталей было как можно меньше, ну, или чтобы как можно меньше от них зависить.


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

P.S. Вспоминается один препод. Был у него имидж такого импозантного прилизанного всё знающего и понимающего мужика. Крутого бизнесмена. После вторых выборов Ельцина он нам старательно втирал, что выбор был неправильный, что выбрали не того и последствия будут конченые. При этом заданный несколько раз вопрос — "а кого?" — он деликатно игнорировал. Серьёзно воспринимать его после этого было совершенно невозможно. Цель этого примера: продемонстрировать пагубность указания плохого пути без указания хорошего. А вовсе не наезд, как могло кому-то показаться
--
wbr, Peter Taran
Re[4]: As is или история о том как не надо писать код
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.12.04 22:00
Оценка:
Здравствуйте, tarkil, Вы писали:

T>Ну, с моей т.з. пояснение пагубности без указания правильного пути практически бесполезно. Как надо было-то поступать разработчикам софта для ракеты? А то у читателя возникает закономерный вопрос: может другие пути-то ничем не лучше?


Правильный путь — не закладываться на частности. Что тут не ясно?

T>Цель этого примера: продемонстрировать пагубность указания плохого пути без указания хорошего.


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

T>А вовсе не наезд, как могло кому-то показаться


А кто-то воспринял твои слова как наезд?
... << RSDN@Home 1.1.4 beta 3 rev. 267>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: As is или история о том как не надо писать код
От: Аноним  
Дата: 28.12.04 03:55
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Правильный путь — не закладываться на частности. Что тут не ясно?


Неясна расшифровка этой фразы — "закладываться на частности". Это значит считать, что ракета может летать под любыми углами? А если сложность алгоритма от этого увеличивается втрое (а значит время разработки и тестирования — девятикратно)? А возможность полёта вертикально вниз тоже учитывать? Ну мало ли что взбредёт в голову инженерам в следущей версии...

T>>Цель этого примера: продемонстрировать пагубность указания плохого пути без указания хорошего.

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

Я никогда и ни на кого не обижаюсь. Но если ребёнку интересна розетка, то его лучше занять чем-то другим, нежели просто говорить "нельзя". Интерес-то никуда не денется. Из моего детства:
— Мама, выйди из комнаты.
— Зачем?
— Я вот это (показываю карандаш) в розетку засуну.

VD>А кто-то воспринял твои слова как наезд?


Могли.
Re[6]: As is или история о том как не надо писать код
От: TK Лес кывт.рф
Дата: 28.12.04 04:22
Оценка: +1 :))) :))) :))
Hello,
>
> Неясна расшифровка этой фразы — "закладываться на частности". Это значит считать, что ракета может летать под любыми углами?

Это значит, что ракета выдала-бы assert и зависла. После этого переключившись в режим отладки можно было-бы изменить траекторию руками.
Posted via RSDN NNTP Server 1.9 delta
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[6]: As is или история о том как не надо писать код
От: DuШes  
Дата: 28.12.04 06:36
Оценка:
Здравствуйте, Аноним, Вы писали:

[...]

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

ps: нинакого не хотел наехать, просто накипело....
Re[7]: As is или история о том как не надо писать код
От: Mika Soukhov Stock#
Дата: 28.12.04 08:34
Оценка: :)))
Здравствуйте, DuШes, Вы писали:

DШ>ps: нинакого не хотел наехать, просто накипело....


Э-э-э... а где записываются в космонавтов?
Re[6]: As is или история о том как не надо писать код
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.12.04 10:02
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Неясна расшифровка этой фразы — "закладываться на частности". Это значит считать, что ракета может летать под любыми углами?


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

А> А если сложность алгоритма от этого увеличивается втрое (а значит время разработки и тестирования — девятикратно)?


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

Так от замены (x as y) на ((y)x) ничего меняться не должно. При этом (x as y) закладовалось на частность (предпологалось, что х никогда недолжно содежать объект другого типа). Это и была главная мысль.

А> А возможность полёта вертикально вниз тоже учитывать? Ну мало ли что взбредёт в голову инженерам в следущей версии...


Мне кажется, ты слишком много внимания уделяешь частностям данной аналогии. Цель ее проведения — проилюстрировать суть ситуации. Если без нее у тебя и так не возникает никаких вопросов, то просто опусти ее.

А>Я никогда и ни на кого не обижаюсь. Но если ребёнку интересна розетка, то его лучше занять чем-то другим, нежели просто говорить "нельзя".


Дык, статья все же рассчитана на разумных, взрослых людей. Пусть уж они сами выбирают куда им совать их пальцы.

А> Интерес-то никуда не денется. Из моего детства:

А>- Мама, выйди из комнаты.
А>- Зачем?
А>- Я вот это (показываю карандаш) в розетку засуну.



Я сувал в розетку наушники. 5 раз в раио-розетку и один в 220 вольт. Весело было...

VD>>А кто-то воспринял твои слова как наезд?

А>Могли.

Ну, я вроде не воспринял. Остальные пускай сами разбираются со своими тараканами.
... << RSDN@Home 1.1.4 beta 3 rev. 267>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: As is или история о том как не надо писать код
От: tarkil Россия http://5209.copi.ru/
Дата: 28.12.04 10:16
Оценка: :)))
Здравствуйте, VladD2, Вы писали:

VD>Это значит, что не стоит задвавать параметры в виде константы на том лишь основании, что пока не предвидится его изменение. В более общем случае не нужно при проектировании закладываться на частности. Нужно стараться делать код более асбтрактным и универсальным.


VD>Так от замены (x as y) на ((y)x) ничего меняться не должно. При этом (x as y) закладовалось на частность (предпологалось, что х никогда недолжно содежать объект другого типа). Это и была главная мысль.


VD>Мне кажется, ты слишком много внимания уделяешь частностям данной аналогии. Цель ее проведения — проилюстрировать суть ситуации. Если без нее у тебя и так не возникает никаких вопросов, то просто опусти ее.


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

Ха! Вспоминается анекдот: "И не пиши слишком общего алгоритма! Что это у тебя за константа SCREEN_DIMENSION = 2? Размерность экрана монитора?..."

VD>Дык, статья все же рассчитана на разумных, взрослых людей. Пусть уж они сами выбирают куда им совать их пальцы.


А со взрослыми людьми всё то же самое, не обольщайся.
--
wbr, Peter Taran
Re: As is или история о том как не надо писать код
От: Аноним  
Дата: 31.12.04 23:07
Оценка:
Здравствуйте, Владислав Чистяков (VladD2), Вы писали.

А можно ведь было обойтись 2мя абзацами... с тем же кол-вом информации.
Re[2]: As is или история о том как не надо писать код
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.01.05 13:43
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>А можно ведь было обойтись 2мя абзацами... с тем же кол-вом информации.


Вот здесь: Re[2]: Что означает понятие skills в резюме для работодателя
Автор: VladD2
Дата: 07.08.04
я уже отвечал на похожий вопрос.
... << RSDN@Home 1.1.4 beta 3 rev. 267>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: As is или история о том как не надо писать код
От: adontz Грузия http://adontz.wordpress.com/
Дата: 16.08.05 21:31
Оценка: 31 (2) :))
Здравствуйте, Владислав Чистяков (VladD2), Вы писали:

Вот сейчас прочитал стать. Странная она какая-то. врорде бы всё правильно, но как вглядишь то там, то тут огрехи.

Ну водичку в начале мы пропустим



int    i = 123;
void*  p = &i;
double d = *(double*)p;
printf("i = %f", d);
При попытке повторить этот код в безопасном режиме C#:
int    i  = 123;
object p  = i;
double d = (double)p;
Console.WriteLine("value = {0}", d);

Надо заметить, что это не идентичные куски кода, хотя так и кажется с певого взгляда. Тип object это не аналог нетипизированного указателя. Собственно C# сообще не позволяет сделать то, что написано на Си++ в приведённом выше коде. Более того, если уж упоминается Си++, то почему не упоминания об операторе dymanic_cast некотором аналоге оператора as?


Довольно странный пример
class A { }

class B : A
{
  public void SomeMethod() { }
}

class Test
{
  static B _b;

  static void Init(A a)
  {
    _b = a as B;
  }

  static void Main()
  {
    Init(new A());
    // ...
    _b.SomeMethod();
  }
}
не ясно что пришло в голову программиста который описал параметр с типом A только для того чтобы потом сделать upcast до типа B. Пример создаёт впечатление весьма надуманного и совершенно не убеждает в чём-либо.


Ещё более странный пример от Ткачёва, не буду его приводить полностью, он довольно крупный.

Естественно, в таком простом коде не составит труда быстро найти настоящую причину. Но представим, что этот класс занимает тысячу строк витиеватого кода, да ещё, может быть, это реализуется не один классом, это может быть целый фреймворк. Найти истинную причину в этом случае может оказаться не совсем просто.

Но всё-таки после нескольких бессонных ночей я выхожу на A.CreateInstance и выясняю, что проблема в моём собственном коде, и понимаю, что сам дурак. Далее, чтобы избежать длительных поисков подобных ошибок в будущем, я привожу за ухо того, кто писал этот код и прошу его заменить as на cast. Но его аргументы такие: ошибка не в его коде, она уже исправлена мной самим в моём коде, и, главное, он не знает к чему приведут такие изменения, т.к. писал он это давно и уже не помнит, завязана ли его логика на возможный null или нет. Всё остается, как есть, и впоследствии на эти грабли наступают другие разработчики, тратя на борьбу с ними много времени.

Сказать что подобная ситуация странная, значит ничего не сказать. Во-первых, если речь идёт о реальных событиях, а не о надуманых примерах, программист не выйдет на код A.CreateInstance просто потому что его у него не будет. Во-вторых, тут мягко говоря сгущены краски. Проблема тут вовсе не в операторе приведения типа, а в полном отсутствии документации. Если бы разработчик позаботился написать пару страниц на тему "Интерфейсы которые класс-плагин должен реализовать", а программист-жертва имел свободный доступ к этом документу, то проблемы бы просто не было. И если уж такое случилось, то надо не код менять, а писать к нему документацию. А то исходя из подобных идей можно выкинуть всё WinAPI, COM и т.д. Ситуация на самом деле ничем не отличается от передачи нулевого (невалидного) указателя на callback-функцию. И тут нет и не может быть другого правильного решения, чем вовремя писать и читать документацию. Тем более удивительно её отсутствие, что речь шла о некотором фреймворке. Совершенно невозможно контролировать правильность входных данных везде и всегда. И тут замена оператора ничем не поможет. Довольно часто надо сказать, что будешь ждать такие-то данные и точка. Если данные другие, то поведение не определено. Это некоторый внутренний контракт. Следуя подобным принципам гипертрофирования проверок можно будет писать код
a = b;
if (a != b) ReportRAMError();



Использование штатного оператора приведения типов «()» не делает код правильнее автоматически и не защищает от ошибок. С точки зрения функциональности код останется точно таким же. Оператор () позволит локализовать ошибку в месте, наиболее близком к ее появлению. А это в свою очередь позволит сэкономить немало вашего (и не только) драгоценного времени.

Ещё одно странное утверждение. В примере выше ошибка была в коде плагина, который не реализовывал нужный интерфейс. Применение () вместо as всё равно указало бы на код фреймворка как ошибочный. Учитывая, что "этот класс занимает тысячу строк витиеватого кода, да ещё, может быть, это реализуется не один классом, это может быть целый фреймворк" (я уже говорил, что этого кода может вообще не быть?) мы имеем замену шила на мыло. Всё равно ошибка будет в незнакомом участке чужого кода. Скорее всего мы даже не поймём тип чьего указателя приводился, переданного нами и какого-то из используемых внутри. Соответственно никакого полезного вывода вроде "О! Я ведь забыл реализовать интерфейс" тоже не будет сделано.


Среди оснований за использование оператора as забыто самое главное. Он не кидает исключения. А ведь его надо ловить. А это лишняя пара try-catch и, что важнее, головная боль — а что делать внутри catch? С одной стороны очень хочется поймать все свои ошибки, с другой не стоит ловить чужие.
try
{
  ((B)a).SomeMethod();
}
catch(Exception e)
{
}

Как определить когда сгенерированно исключение, при конвертации типа или при вызове метода SomeMethod()? В нём ведь тоже может случиться неудачная конвертация, которую однако надо обрабатывать в другом месте.
Либо же надо заводить отдельную переменную.
B b = null;
try
{
  b = ((B)a);
}
catch(Exception e)
{
}
b.SomeMethod();

и это всё вместо
if (a is B)
{
 (a as B).SomeMethod();
}

Тут речь идёт уже не о красоте отдельного оператора, а о громоздкости кода вообще.


Одним из аргументов в пользу применения оператора as вместо приведения типов, является слова «в этом случая я могу доказать, что приведение всегда будет проходить успешно». Все мы люди и можем ошибиться, не учитывать каких-то еще не известных в данный момент нюансов, да и попросту могут произойти какие-то изменения.

Аргумент мимо кассы. Я уже говорил о некоторых внутрених контрактах. Я ничего не могу доказать, когда речь идёт о входных данных, но я могу сказать "Либо давайте мне корректные данные, либо идите на фиг".
Если as может вызвать NullReferenceException, то () InvalidCastException. В целом же, если вернутся к теме фреймворка и плагинов, то дело обстоит так. Сперва пишется приложение хостер и 1-2 важных плагина, потом уже все остальные. На момент написания большинства плагинов основное приложение уже написано. Так что это проблема плагина чтобы он был написан корректно и не валил основное приложение. Как я уже говорил поменять as на () в смысле удобства отладки шило на мыло. Зато любое непойманое исключение в готовой программе явно не вызовет восторга пользователя.


Расследование показало, что в данном программном модуле присутствовало целых семь переменных, вовлеченных в операции преобразования типов. Оказалось, что разработчики проводили анализ всех операций, способных потенциально генерировать исключение, на уязвимость. И это было их вполне сознательным решением – добавить надлежащую защиту к четырем переменным, а три – включая BH – оставить незащищенными. Основанием для такого решения была уверенность в том, что для этих трех переменных возникновение ситуации переполнения невозможно в принципе. Уверенность эта была подкреплена расчетами, показывающими, что ожидаемый диапазон физических полетных параметров, на основании которых определяются величины упомянутых переменных, таков, что к нежелательной ситуации привести не может. И это было верно – но для траектории, рассчитанной для модели Ariane 4. А ракета нового поколения Ariane 5 стартовала по совсем другой траектории, для которой никаких оценок не выполнялось. Между тем она (вкупе с высоким начальным ускорением) была такова, что "горизонтальная скорость" превзошла расчетную (для Ariane 4) более чем в пять раз.

Это мягко говоря неверная информация, хотя и достаточно популярная версия.
http://www.cs.unibo.it/~laneve/papers/ariane5rep.html
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: As is или история о том как не надо писать код
От: dshe  
Дата: 17.08.05 07:44
Оценка: +2
Здравствуйте, adontz, Вы писали:

A>... Во-вторых, тут мягко говоря сгущены краски. Проблема тут вовсе не в операторе приведения типа, а в полном отсутствии документации. Если бы разработчик позаботился написать пару страниц на тему "Интерфейсы которые класс-плагин должен реализовать", а программист-жертва имел свободный доступ к этом документу, то проблемы бы просто не было. И если уж такое случилось, то надо не код менять, а писать к нему документацию.


К сожалению, документация -- не панацея. Просто потому, что часто она не адекватна; потому, что проверить ее адекватность так же сложно как и написать ее заново. Конечно, проблем бы не было, если бы в адекватной документации четким языком было написано что-то вроде: "Внимание, если вы используете этот код, то там, там и вот там у вы слокнетесь с такими граблями. Других граблей в коде нет." Но такое не пишут, потому что разработчики еще не знают о граблях, которые они расставляют. А если бы знали, то часто им было бы проще их убрать и ничего в документации не писать.

Что касается операторов as и (), то ошибки в обоих подходах проявляются в виде исключений. В одном случае в виде NullReferenceException, а в другом InvalidCastException. Но InvalidCastException проявится раньше и ближе к источнику ошибки, и, следовательно, ошибку легче будет исправить.
--
Дмитро
Re[2]: As is или история о том как не надо писать код
От: fuurin  
Дата: 17.08.05 08:52
Оценка: 1 (1)
A>и это всё вместо
A>
A>if (a is B)
A>{
A> (a as B).SomeMethod();
A>}
A>


Неправильные, дядя Фёдор, у вас бутерброды. Испокон веков fxcop учит нас писать
B b = a as B;
if( b != null )
  b.SomeMethod();


2VladD:
Статью прочитал и забыл, уж много там воды не по теме. Но разобраться в вопросе использования операторов она таки заставила, спасибо.

Предлагаю внести в фак и забыть:

Правила:
1. Если необходимо реализовать дополнительную логику работы с объектом, приведеным к другому типу, то используется оператор as:

X x = o as X;
if( x == null )
  return;
x.DoWork();

2. Если необходимо проверить, является ли объект определённого типа, но нет необходимости работать с приведеным объектом, то используется оператор is:
if( o is X )
  SomeLogic();

3. И наконец, если с объектом нужно работать только как с объектом определённого типа, то используется оператор приведения ():
X x = (X)o;
x.DoWork();


Исключения:
4. Value-типы не поддерживают оператор as, поэтому вместо (1) используется комбинация (2) и (3):
if( v is X )
  ((X)v).DoWork();

5. Оператор as не поддерживает приведения типов, определённые пользователем.


Все доводы по эстетике, читабельности и быстродействию идут лесом. И попробуйте меня сбить с пути истинного
Garbage In Garbage Out
Re[3]: As is или история о том как не надо писать код
От: adontz Грузия http://adontz.wordpress.com/
Дата: 17.08.05 09:57
Оценка: 1 (1) -1 :)
Здравствуйте, fuurin, Вы писали:

F>Предлагаю внести в фак и забыть:

F>Правила:
F>1. Если необходимо реализовать дополнительную логику работы с объектом, приведеным к другому типу, то используется оператор as:
F>2. Если необходимо проверить, является ли объект определённого типа, но нет необходимости работать с приведеным объектом, то используется оператор is:
F>3. И наконец, если с объектом нужно работать только как с объектом определённого типа, то используется оператор приведения ():
F>4. Value-типы не поддерживают оператор as, поэтому вместо (1) используется комбинация (2) и (3):

F>Все доводы по эстетике, читабельности и быстродействию идут лесом. И попробуйте меня сбить с пути истинного

Вот будь в статье написано что-то вроде этого она была бы полезной. А так получился наезд на as с попутным унижением С++ Идея на пять, а вот реализация на трояк.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[3]: As is или история о том как не надо писать код
От: adontz Грузия http://adontz.wordpress.com/
Дата: 17.08.05 10:06
Оценка: +1 -1
Здравствуйте, dshe, Вы писали:

D>Что касается операторов as и (), то ошибки в обоих подходах проявляются в виде исключений. В одном случае в виде NullReferenceException, а в другом InvalidCastException. Но InvalidCastException проявится раньше и ближе к источнику ошибки, и, следовательно, ошибку легче будет исправить.


К сожалению это миф. На деле это будет ближе, но как 999 и 1000 метров. Один хрен киллометр шагать надо.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[3]: As is или история о том как не надо писать код
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.08.05 11:16
Оценка:
Здравствуйте, fuurin, Вы писали:

F>2VladD:

F>Статью прочитал и забыл, уж много там воды не по теме. Но разобраться в вопросе использования операторов она таки заставила, спасибо.

Пожалуй это главное. Значит цель достигнута. Просто верить авторитету — это не верный подход. Нужно именно что вникать.

F>Предлагаю внести в фак и забыть:...


+1
... << RSDN@Home 1.2.0 alpha rev. 591>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: As is или история о том как не надо писать код
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.08.05 11:16
Оценка:
Здравствуйте, adontz, Вы писали:

A>Вот будь в статье написано что-то вроде этого она была бы полезной. А так получился наезд на as с попутным унижением С++ Идея на пять, а вот реализация на трояк.


Творички мыслящий челове скорее воспротивится от такого запихивания правил без объяснений. Но одно другому не мешает. Можно сделать ФАК и дать на него ссылку из статьи (и на оборот).
... << RSDN@Home 1.2.0 alpha rev. 591>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: As is или история о том как не надо писать код
От: Soul Россия  
Дата: 20.09.06 11:57
Оценка: +1
Здравствуйте, Владислав Чистяков (VladD2), Вы писали:

ВЧV>Статья:

ВЧV>As is или история о том как не надо писать код
Автор(ы): Владислав Чистяков (VladD2)
Дата: 18.12.2004
Работая над открытыми проектами, автор заметил, что операторы as и is многими программистами зачастую используются ненадлежащим образом. Результатом очередного двухчасового поиска ошибки и стала эта статья.




ВЧV>Авторы:

ВЧV> Владислав Чистяков (VladD2)

ВЧV>Аннотация:

ВЧV>Работая над открытыми проектами, автор заметил, что операторы as и is многими программистами зачастую используются ненадлежащим образом. Результатом очередного двухчасового поиска ошибки и стала эта статья.


Вопрос: по-моему, оператор is возможно применять не только к ссылочным типам или я не права?
"Следует упомянуть, что операторы as и is предназначены для приведения типов ссылок, т.е. для работы исключительно со ссылочными типами данных."

Спасибо за статью.
Soul
Re[2]: As is или история о том как не надо писать код
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.09.06 13:59
Оценка:
Здравствуйте, Soul, Вы писали:

S>Вопрос: по-моему, оператор is возможно применять не только к ссылочным типам или я не права?


Прав. Это я тут по контексту нечаяно написал. "is" прекрасно работает с влэью-типами если они забоксены. Чего нельзя сказать о as.

S>"Следует упомянуть, что операторы as и is предназначены для приведения типов ссылок, т.е. для работы исключительно со ссылочными типами данных."


S>Спасибо за статью.


Пожалуйста.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: As is или история о том как не надо писать код
От: Константин Л. Франция  
Дата: 20.09.06 16:46
Оценка:
Здравствуйте, Владислав Чистяков (VladD2), Вы писали:

ВЧV>Статья:

ВЧV>As is или история о том как не надо писать код
Автор(ы): Владислав Чистяков (VladD2)
Дата: 18.12.2004
Работая над открытыми проектами, автор заметил, что операторы as и is многими программистами зачастую используются ненадлежащим образом. Результатом очередного двухчасового поиска ошибки и стала эта статья.




ВЧV>Авторы:

ВЧV> Владислав Чистяков (VladD2)

ВЧV>Аннотация:

ВЧV>Работая над открытыми проектами, автор заметил, что операторы as и is многими программистами зачастую используются ненадлежащим образом. Результатом очередного двухчасового поиска ошибки и стала эта статья.

ну ниче статейка, только можно было покороче. Еще смущает обложка журнала — неужели такая банальность заслуживает чтобы красоваться на обложке, да еще и зачеркнутой?
Ничего серьезнее не нашел?
А вообще тут
Автор: fuurin
Дата: 17.08.05
товарисчь привел хорошую инструкцию по этому поводу.
Re: As is или история о том как не надо писать код
От: Аноним  
Дата: 03.09.09 06:38
Оценка: :)
Здравствуйте, Владислав Чистяков (VladD2), Вы писали:

ВЧV>Статья:

ВЧV>As is или история о том как не надо писать код
Автор(ы): Владислав Чистяков (VladD2)
Дата: 18.12.2004
Работая над открытыми проектами, автор заметил, что операторы as и is многими программистами зачастую используются ненадлежащим образом. Результатом очередного двухчасового поиска ошибки и стала эта статья.




Прошу прощения за комментарий, не связанный с программированием, но по правилас русского языка заголовок должен выглядеть так: "As is, или История о том как не надо писать код". Для примера можете обратить внимание на фильм "Ирония судьбы, или С лёгким паром" или на классику ("Тартюф, или Обманщик").
Re[2]: As is или история о том как не надо писать код
От: _FRED_ Черногория
Дата: 03.09.09 07:00
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:

ВЧV>>Статья:

ВЧV>>As is или история о том как не надо писать код
Автор(ы): Владислав Чистяков (VladD2)
Дата: 18.12.2004
Работая над открытыми проектами, автор заметил, что операторы as и is многими программистами зачастую используются ненадлежащим образом. Результатом очередного двухчасового поиска ошибки и стала эта статья.




А>Прошу прощения за комментарий, не связанный с программированием, но по правилас русского языка …


По правилам данного форума,

…указывать на орфографические и синтаксические ошибки и т. д. запрещается.


Если очень уж неймётся, можно написать автору в личку, не отвлекая пустой (не связанной с тематикой форума) болтовнёй обчество.
Help will always be given at Hogwarts to those who ask for it.
Re[3]: As is или история о том как не надо писать код
От: Аноним  
Дата: 03.09.09 12:11
Оценка:
_FR>Если очень уж неймётся, можно написать автору в личку, не отвлекая пустой (не связанной с тематикой форума) болтовнёй обчество.
Не "обчество", а общество.
Re[4]: As is или история о том как не надо писать код
От: _FRED_ Черногория
Дата: 03.09.09 12:26
Оценка:
Здравствуйте, Аноним, Вы писали:

_FR>>Если очень уж неймётся, можно написать автору в личку, не отвлекая пустой (не связанной с тематикой форума) болтовнёй обчество.

А>Не "обчество", а общество.

Читайте больше классики, изучайте русский язык, наслаждайтесь процессом и полученными знаниями

Уважайте собеседников! Проявите толику терпения и проверьте, действительно ли не прав ваш оппонент, а не вы.

Про "обчество" здесь и здесь.
Help will always be given at Hogwarts to those who ask for it.
Re[2]: As is или история о том как не надо писать код
От: L.Long  
Дата: 03.09.09 14:55
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Владислав Чистяков (VladD2), Вы писали:


ВЧV>>Статья:

ВЧV>>As is или история о том как не надо писать код
Автор(ы): Владислав Чистяков (VladD2)
Дата: 18.12.2004
Работая над открытыми проектами, автор заметил, что операторы as и is многими программистами зачастую используются ненадлежащим образом. Результатом очередного двухчасового поиска ошибки и стала эта статья.




А>Прошу прощения за комментарий, не связанный с программированием, но по правилас русского языка заголовок должен выглядеть так: "As is, или История о том как не надо писать код". Для примера можете обратить внимание на фильм "Ирония судьбы, или С лёгким паром" или на классику ("Тартюф, или Обманщик").


Ну тогда уж "As is, или История о том, как не надо писать код". А не лень было докапываться до статьи пятилетней давности?
Чем совершеннее технически средство, тем более примитивные, никчемные и бесполезные сведения при его помощи передаются.(с)Станислав Лем
Re[6]: As is или история о том как не надо писать код
От: Ziaw Россия  
Дата: 07.09.09 03:30
Оценка:
Здравствуйте, Mika Soukhov, Вы писали:

MS>А если мы передадим null и прикастим его C-like привидением? Будет тот же NullReferenceException. В том то и дело, что проверка на null нужна. Тогда, раз она нужна, почему бы не использовать сразу as, ведь он намного быстрее.


А если мы проверим null через as, что мы выясним, как будем реагировать?
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.