![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| amarenkov |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 183 Регистрация: 21.2.2008 Где: Воронеж Репутация: нет Всего: нет |
Добрый день.
Есть разные классы от одного предка (SomeClass). Внутри функции необходимо определить, какой из этих классов был передан через параметр типа SomeClass. Вопрос в следующем - что будет производительнее: проверять переданный object при помощи оператора is на соответствие всем этим классам по-очереди, или создать у класса SomeClass поле перечеслимого типа (которое содержало бы "идентификаторы" всех дочерних классов) и проверить это поле через switch? Вопрос можно переформулировать еще проще - что производительнее: an_object is SomeClass2 или an_object.OurType == OurTypes.SomeClass2? Заранее спасибо |
|||
|
||||
| DVariuS |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 200 Регистрация: 10.2.2009 Где: Ukraine Репутация: 5 Всего: 8 |
amarenkov, быстрее будет конечно-же
но правильнее все-таки
т.к. более наглядно отображает смысл. P.S. А еще лучше приведи фрагмент кода, где ты хочешь использовать такую проверку. Это сообщение отредактировал(а) DVariuS - 25.6.2009, 13:45 |
||||
|
|||||
| archeg |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 612 Регистрация: 6.1.2007 Где: Киев Репутация: 11 Всего: 27 |
Это зависит от архитектуры и зачем оно нужно. Например если у тя много класов, то для каждого создавать перечислимое поле - геморно. Тем более информация будет повторяться - уже есть тип класа, то зачем же его еще прописывать в поле?
Но перечисляемые поля имеют свой "+". Где-то можно добавить какую-то гибкость, не усложняя при этом иерархию:
Добавлено @ 14:08 И вообще помойму is будет быстрее ==. Ток вопрос на самом деле не в скорости, а удобстве. Я надеюсь) Это сообщение отредактировал(а) archeg - 25.6.2009, 14:09 -------------------- ИМХО задница есть универсальный интерфейс. Ибо через задницу можно сделать абсолютно ВСЕ (bash.org.ru) Дядька всегда можно спросить в аське, если не задалбывать - не откажет И вообще, на самом деле я студент, и ненавижу обращение на "Вы") Тут все свои ;) |
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 13 Всего: 49 |
amarenkov, быстрее - и правильнее - не писать switch или цепочку if-else по типам, а вынести типозависымый код в виртуальные функции.
Это классический Switch Code Smell, вот пример с картинкой: https://elearning.industriallogic.com/gh/su...evLanguage=Java |
|||
|
||||
| amarenkov |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 183 Регистрация: 21.2.2008 Где: Воронеж Репутация: нет Всего: нет |
Не получится Задача (если сильно упростить) сводится к работе с графическими объектами. Есть базовый Figure, и есть наследники: Point, Line, Polygon и т.п. И есть функция отрисовки. Вне этих классов. Вносить эту функцию в них я категорически не хочу, т.к. это было бы некорректно с точки зрения модели Вот, собственно, и все. В функцию отрисовки передается Figure. Функция должна узнать, что это за фигура такая и отрисовать ее. |
|||
|
||||
| amarenkov |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 183 Регистрация: 21.2.2008 Где: Воронеж Репутация: нет Всего: нет |
В принципе, вопрос снимается.
Сделал простой тест, и на 1 000 000 объектов проверка через перечислимый тип дает 156 250 тиков, а через is - 312 500. Жаль |
|||
|
||||
| KelTron |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 745 Регистрация: 8.10.2006 Где: Красноярск Репутация: 9 Всего: 38 |
Хоть это и банально, но
"Преждевременная оптимизация - корень всех зол" Вот если после написания прога будет тормозить, и профайлер покажет, что данная проверка это слабое место по производительности, тогда и оптимизируй. Хотя многие опытные люди говорят, что обычно слабое место оказывается совсем не там где предполагали разработчики, а от оптимизации второстепенных(в плане производительности) кусков кода толку будет мало и читабельность программы ухудшится. -------------------- Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог. Эвенгар Салладорский, основатель Школы Тьмы. |
|||
|
||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 18 Всего: 67 |
amarenkov, Что мешает в каждый из классов добавить виртуальный метод Render, когда каждый элемент сам знает как себя нарисовать? -------------------- СУВ, Partizan. |
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 13 Всего: 49 |
Это вообще-то корректно с точки зрения модели, более того - пример с фигурами и функцией отрисовки есть практически в любой книжке по ООП, в главе про полиморфизм. Настолько корректно, что пример даже есть в MSDN, в топике Полиморфизм (руководство по программированию в C#). Figure по ненашему Shape, кстати. А если включить саму отрисовку, то результат будет 300 и 301. 1 тик стоит жертвы. |
|||
|
||||
| mihryak |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 731 Регистрация: 28.4.2007 Где: С-Пб Репутация: 19 Всего: 36 |
не хочешь в классе делать (например, если класс этот представляет из себя нечто вроде DTO) - вынеси в стратегию
только тогда придётся параллельно вести две иерархии, что само по себе не очень удобно, но порой оправдано
Это сообщение отредактировал(а) mihryak - 26.6.2009, 11:27 |
|||
|
||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 18 Всего: 67 |
mihryak, сорри...не очень ясно с какой целью Figure ака Shape в метод Render передавать надобно?
а то получается какая-то циклическая зависимость... Figure содержит IRenderStrategy...а потом в Render этого интерфейса тоже надо передать Figure... просто сугубо интересно - зачем? -------------------- СУВ, Partizan. |
|||
|
||||
| mihryak |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 731 Регистрация: 28.4.2007 Где: С-Пб Репутация: 19 Всего: 36 |
хм, это вполне обычный ход
конкретная фигура имеет собственную стратегию отрисовки, а стратегия общая для всех фигур определённого класса это может позволить, например, держать один инстанс стратегии на все её фигуры, позволяет сделать её stateless |
|||
|
||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 18 Всего: 67 |
mihryak, ok, идея ясна
-------------------- СУВ, Partizan. |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |