Никогда не используйте отражение в производственном коде! А как насчет Python? - PullRequest
8 голосов
/ 20 января 2011

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

Теперь я начинаю писать серьезный код на Python, и мне интересно, применяется ли тот же принцип. Кажется, что Python разработан с учетом размышлений. Модули и классы хранят членов в легко доступном словаре. Мета-классы моделей Django, например, принимают строки для ссылки на члены.

Я мог бы написать C # / Java на Python, но я действительно не хочу. Я все еще твердо верю в «отсутствие отражения» для указанных языков. Путь Python просто принципиально отличается?

Ответы [ 5 ]

16 голосов
/ 20 января 2011

Как динамический язык, Python принципиально отличается от языков со статической типизацией, поэтому в нем все отражается :-) Также никогда не использует отражение в производственном коде (для статических языков) мне кажется немного экстремальным

6 голосов
/ 20 января 2011

Я думаю, что «отсутствие отражения в производственном коде» не правильно в c #.
Отражение часто позволяет программисту совершать невозможные вещи.код "и" используйте отражение с осторожностью! "если не использовать правильно, вы можете потерять производительность.Правильное использование может повысить производительность (просто подумайте о статическом отражении). Не используйте отражение для массивно вызываемого кода.
Вместо этого Python - динамический языкВсе понятия разные.Нормальным (и правильным способом сделать это) является использование техничек, о которых вы говорите.

2 голосов
/ 20 января 2011

Да, в этом аспекте развитие Python является фундаментально другим.

Отражение в C # / Java относится к способности среды выполнения знать вещи о коде, который он выполняет, ипринимать решения на основе этой информации.

Поскольку Python использует динамическую типизацию, обнаружение любого типа делегируется во время выполнения, а не во время компиляции, поэтому в основном это означает, что любая программа Python должна использоватьОтражение для того, чтобы работать, только это не называется отражением, оно называется выполнением программы:)
Кроме того, философия Python охватывает динамический характер выполнения, поэтому не стесняйтесь использовать его в своих интересах.

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

0 голосов
/ 20 января 2011

Отражение - очень продвинутая и мощная технология.Но это медленно.Вы можете использовать отражение, но не часто.Поэтому разработчики CLR добавили еще один классный тип в .NET 4.0 - динамический тип .Я настоятельно рекомендую вам обратиться к некоторым документам или книгам для получения дополнительной информации.Например, CLR через C #.

dynamic a = SomeFooInterface.GetsomeObjectWithUnknownInterface(); 
// returns object, for example, from another assembly. or some unknown instance.
// But you know that there is method int GetValue() inside. 
// So you can call this method without any casts!
int myValue = a.GetValue();
// This method is much faster then reflection!

CLR через C #:

Во многих случаях программе приходится работать с информацией, о которой она не знает, покаБег.В то время как вы можете использовать безопасные для типов языки программирования (такие как C #) для взаимодействия с этой информацией, синтаксис имеет тенденцию быть неуклюжим, тем более что вы склонны много работать со строками, а производительность также снижается.Если вы пишете приложение на чистом C #, то единственный случай, когда вы работаете с информацией, определенной во время выполнения, - это когда вы используете рефлексию (см. Главу 23). Однако многие разработчики также используют C # для взаимодействия с компонентами, которые не реализованы в C #.Некоторые из этих компонентов могут быть .NET-динамическими языками, такими как Python или Ruby , или COM-объектами, которые поддерживают интерфейс IDispatch (возможно, реализованный в собственном C или C ++), или объектами объектной модели HTML (DOM) (реализованными с использованиемразличные языки и технологии).Связь с объектами HTML DOM особенно полезна при создании приложения Microsoft Silverlight.Чтобы облегчить разработчикам использование отражений или взаимодействие с другими компонентами, компилятор C # предлагает вам пометить тип выражения как динамический.Вы также можете поместить результат выражения в переменную и пометить тип переменной как динамический.Это динамическое выражение / переменная может затем использоваться для вызова члена, такого как поле, свойство / индексатор, метод, делегат и унарные / двоичные / операторы преобразования.Когда ваш код вызывает член, используя динамическое выражение / переменную, компилятор генерирует специальный код IL, который описывает желаемую операцию.Этот специальный код называется полезной нагрузкой. Во время выполнения код полезной нагрузки определяет точную операцию для выполнения на основе фактического типа объекта, на который теперь ссылается динамическое выражение / переменная.

0 голосов
/ 20 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...