Когда использовать информацию о типах во время выполнения?

Некоторые вещи, которые Вы сделали бы с LINQ, могут быть сделаны с пониманиями списка:

[myFunc(i) for i in numbers if i > 3]

Или можно использовать карту, уменьшить, и фильтр:

map(myFunc, filter(lambda x: x > 3, numbers))

, Но понимания списка намного больше "Pythonic", чем использование конструкций функционального программирования. Для сокращения вещей рассмотрите использование "" .join или сумма . И можно проверить, что значение истинности всего iterables при помощи [1 110] любой и весь

Просто помнит эти переводы:

Select -> map
Where -> filter
Aggregate -> reduce

И Вы хорошо будете на пути!

5
задан ChrisW 5 October 2009 в 14:40
поделиться

5 ответов

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

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

5
ответ дан 14 December 2019 в 01:12
поделиться

Эти конструкции («есть» и «как») хорошо знакомы разработчикам Delphi, поскольку обработчики событий обычно приводят объекты к общему предку. Например, событие OnClick передает единственный аргумент Sender: TObject независимо от типа объекта, будь то TButton, TListBox или любой другой. Если вы хотите узнать больше об этом объекте, вы должны получить к нему доступ через «as», но чтобы избежать исключения, вы можете проверить его с помощью «is» раньше. Это понижающее преобразование позволяет привязать объекты и методы к типу проекта, что невозможно при строгой проверке типов классов. Представьте, что вы хотите сделать то же самое, если пользователь нажимает кнопку или ListBox, но если они предоставляют нам разные прототипы функций, их невозможно будет привязать к одной и той же процедуре.

В более общем случае объект может вызывать функцию, которая уведомляет, например, об изменении объекта. Но заранее оставляет место назначения возможность узнать его «лично» (через как и есть), но не обязательно. Он делает это, передавая себя как наиболее распространенного предка всех объектов (TObject в случае Delphi)

1
ответ дан 14 December 2019 в 01:12
поделиться

В C ++, среди некоторых других малоизвестных случаев (которые в основном имеют дело с второстепенным выбором дизайна), RTTI - это способ реализации так называемых мульти-методов .

3
ответ дан 14 December 2019 в 01:12
поделиться

dynamic_cast <>, если я правильно помню, зависит от RTTI. Некоторые неясные внешние интерфейсы могут также полагаться на RTTI, когда объект передается через указатель void (по какой-либо причине , что могло произойти).

При этом я не видел typeof () в диких за 10 лет профессиональной работы по обслуживанию C ++. (К счастью.)

0
ответ дан 14 December 2019 в 01:12
поделиться

Вы можете обратиться к более эффективному C # для случая, когда проверка типа во время выполнения допустима.

Правило 3. Специализируйте общие алгоритмы. Использование проверки типа во время выполнения

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

Все это здорово, потому что вы пишете меньше кода. Однако иногда будучи более общий означает не принимать преимущество более конкретного, но явно превосходящий алгоритм. C # языковые правила учитывают это. Все, что вам нужно, это признать что ваш алгоритм может быть больше эффективен, когда параметры типа иметь большие возможности, а затем напишите этот конкретный код. Более того, создание второго универсального типа, который определяет различные ограничения не всегда работает. Общий экземпляры основаны на тип объекта во время компиляции и не тип среды выполнения. Если ты не сможешь учти, ты можешь пропустить возможная эффективность.

Например, предположим, что вы пишете класс, который обеспечивает перечисление в обратном порядке для последовательности элементов, представленных через IEnumerable . Чтобы перечислить его в обратном порядке, вы можете перебрать его и скопировать элементы в промежуточную коллекцию с доступом к индексатору, например List , а затем перечислить эту коллекцию, используя обратный доступ к индексатору. Но если ваш исходный IEnumerable является IList, почему бы не воспользоваться им и не предоставить более эффективный способ (без копирования в промежуточную коллекцию) для итерации элементов в обратном направлении. Так что в основном это особенность, которой мы можем воспользоваться, но при этом обеспечиваем то же поведение (повторение последовательности в обратном направлении).

Но в целом вам следует внимательно рассмотреть проверку типов во время выполнения и убедиться, что она не нарушает принцип подстановки Лискова.

0
ответ дан 14 December 2019 в 01:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: