Pull to refresh
  • by relevance
  • by date
  • by rating

asp.net: полезные вещи, часть первая

.NET *
Хочу поделится некоторыми полезными для себя вещами, которые я использую в работе. Это первая часть статей, в планах написать несколько, развивая последовательно тему. Хочу заметить сразу, что не претендую на совершенный код, наоборот, с вашими замечаниями надеюсь сделать свои инструменты еще более производительными и полезными.

Первая статья скорее вводная, в ней я хочу определить несколько полезных extension методов для механизма отражений. Эти методы в дальнейшем пригодятся при построении моих инструментов. Данная статья может быть бесполезной для большинства программистов, поэтому не надеюсь на ее популярность. Но все же, думаю, что замечания и к ней возникнут тоже.
Читать дальше →
Total votes 12: ↑10 and ↓2 +8
Views 1.7K
Comments 26

Expression Trees и оптимизация Reflection

.NET *
В последней версии .NET Framework среди новых возможностей было добавлено средства метапрограммирования под названием Expression Trees. На базе этой технологии, а именно основываясь на том принципе, что выражения на "обычном" языке программирования могут автоматически преобразовываться в синтаксические деревья, была разработана технология LINQ.

Но в этом посте речь пойдет о другой области применения возможности динамически собирать expression trees и компилировать их в работоспособный код. И эта область — оптимизация Reflection.

кросс-пост с персонального блога
читать далее
Total votes 38: ↑29 and ↓9 +20
Views 5.7K
Comments 29

Визуальный PHP-рефлектор

PHP *
image
Представляю вниманию общественности визуальный PHP-рефлектор.

Скрипт индексирует все .php-файлы в указанной директории, кэширует информацию о найденных классах. Разбор .php файлов осуществляется с помощью Tokenizer. Кэшируются имена найденных классов, кэшируется сопоставление имя файла — класс для последующего использования в автолоадере.

Список классов представляется в виде дерева. Для каждого класса доступен список методов, свойств. Доступен просмотре базового класса и имплементированных интерфейсов. Данные о «составе» классов получаются на ходу через PHP reflection API. Данные подгружаются через AJAX.

Интерфейс выполнен на ExtJS. Этим обусловлена поддержка браузеров — работает в IE6+, FF1.5+, Safari 3+, Opera 9+ (PC, Mac)


Посмотреть PHPReflector в действии.
UPD: Исходники

В исходниках отсутствует Ext
Теперь Ext с минимальным набором компонентов подгружается из внешних источников через CDN (CacheFly)

Планы на будущее:
  • Причесать исходники;
  • Сделать поиск;
  • Сделать отображение не только базовых классов, но и классов, наследованных от данного;
  • Отображение DocBlock'ов для классов, методов, свойств
  • UPD: Добавить отображение штатных классов PHP
Total votes 58: ↑47 and ↓11 +36
Views 1.1K
Comments 36

C#-like cобытия для PHP. Reflection, closures…

PHP *
Задача — сделать на PHP эвенты а-ля C# т.е. произвольный объект может генерировать события. Другие объекты могут на эти события подписываться непосредственно у экземпляра генерирующего объекта.

Основное отличие от того что видел ранее — строгая проверка навешиваемого хука. Проверяется наличие метода, количество его аргументов, etc…
Читать дальше →
Total votes 19: ↑10 and ↓9 +1
Views 1.1K
Comments 17

Узнаем параметр Generic-класса в Java

Java *
Если вы не очень часто программируете на Java, то этот топик скорее всего будет для вас бесполезен. Не читайте его :)

Недавно понадобилось решить следующую задачу: определить класс, которым параметризован generic-класс.

Если кто-то сталкивался с подобной задачей, то наверное также сразу попробовал написать что-то вроде этого:
public class AbstractEntityFactory<E extends Entity> {
  public Class getEntityClass() {
    return E.class;
  }
}

Увы, IDE либо компилятор сразу укажут вам на ошибку («cannot select from a type variable» в стандартном компиляторе): " E.class" — не является допустимой конструкцией. Дело в том, что в общем случае во время исполнения программы информации о реальных параметрах нашего generic-класса может уже и не быть. Поэтому такая конструкция в Java не может работать.
Читать дальше →
Total votes 40: ↑36 and ↓4 +32
Views 95K
Comments 32

Имитация свойств для элементов перечислений (Enumerations) в .NET Framework 3.5

Lumber room
Уверен, многие периодически сталкивались с необходимостью указания каких-либо простых свойств для элементов перечислений в C#.

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

Я же хочу предложить вам несколько иной, более универсальный и изящный способ, основанный на атрибутах, методах расширения и рефлексии.
Читать дальше →
Total votes 15: ↑9 and ↓6 +3
Views 378
Comments 22

Делаем reflection быстрой как прямые вызовы

Java *
Translation
Большинство программистов знают о reflection, которая (она — рефлексия) упрощает добавление динамических возможностей в статические языки, такие как Java/C#. Однако reflection упрекают в том, что вызовы работают очень медленно — до 500 раз медленнее. Все же это можно c легкостью исправить — покажем в этой статье как сделать reflection-вызов таким же быстрым, как и прямой (direct) вызов.
Читать дальше →
Total votes 58: ↑54 and ↓4 +50
Views 49K
Comments 15

«Танцы с бубном» вокруг Thread

Java *

При разработке cloud платформы веб-приложений был реализован сервис серверной логики на базе java scripting технологии для более гибкого управления другими сервисами платформы.

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

Изначально предполагалось что задача тривиальна и что в Java есть стандартные для этого средства. Но ожидания не оправдались.
Читать дальше →
Total votes 26: ↑23 and ↓3 +20
Views 7K
Comments 40

Быстрый Reflection через DynamicMethod

Lumber room
Одной из «вкусных» возможностей .NET, а в частности C#, является Reflection(рефлекшн) — богатый набор классов для работы с типами данных, их свойствами, методами, полями во время выполнения.
Но за такой широкий функционал приходится платит производительностью.
Вызов метода из кода выполняется практически в сто раз быстрее чем вызов через рефлекшн.
А если мы заранее не знаем какой конкретный класс будет использоваться и какой метод будет вызван или не хотим привязываться к конкретной библиотеке, то работа через рефлекшн может сильно снизить производительность приложения.

В данной статье я хотел бы рассказать об использовании динамических методов для таких целей.

Читать дальше →
Total votes 19: ↑16 and ↓3 +13
Views 976
Comments 7

Реализуем DI-контейнер на PHP5 с помощью Reflections

Lumber room
Этот топик для тех, кто представляет, что такое DI (Dependency Injection) но никогда не задумывался «как оно там унутре все работает».
Прочитать, что такое DI, можно например тут или тут

Не ставилось целью разработать свой Production DI-фреймворк. Хотелось разобраться как можно реализовать подобную функциональность наиболее удобно (Phemto, упомянутый выше, показался менее удобным, чем, например, способ от Microsoft Unity)

Реализованный вариант конфигурируется в коде (не через XML, как некоторые другие реализации, хотя это кому как удобнее).
Каждый используемый тип должен быть предварительно зарегистрирован, но не надо перечислять его аргументы, как например в Phemto — контейнер сам выяснит типы аргументов конструктора через Reflection.

Посмотреть код реализации...
Total votes 8: ↑4 and ↓4 0
Views 390
Comments 4

Передача аргументов функции по имени в PHP

PHP *
При рефакторинге кода возникла одна небольшая идея относительно вызова методов. Иногда возникает потребность передать функции аргумент по имени. Например тогда, когда невозможно (или неудобно) передать список в нужном порядке. Такими случаями могут быть вызовы динамических блоков из шаблонизаторов: в шаблоне у нас {{mymodule action=foo second=124322 fourth='catalog' first='name' third='foo'}} и в коде есть следуйщая синатура функции — function foo($first, $second, $third, $fourth). подобный подход используеться в системе Magento для вызова блоков из лей-аутов; или нужно передать методу даные на основе фильтра в каком-нибуть асоциативном масиве. В PHP4 возможным решением было помещение всего списка аргументов в масив. В PHP версии 5 есть же Reflection API, с помощью которого возможно проделать подобное. Perl, Python (, ...) могут, так почему ж ето должно быть невозможно в PHP?:)
смотреть на ето простое решение
Total votes 24: ↑13 and ↓11 +2
Views 5.9K
Comments 18

Автоматизация тестирования Windows-приложений с использованием .Net

.NET *

Автоматизация тестирования.


Тестирование – деятельность, выполняемая для оценки и улучшения качества программного обеспечения. Эта деятельность, в общем случае, базируется на обнаружении дефектов и проблем в программных системах.
Тестирование программных систем состоит из динамической верификации поведения программ на конечном (ограниченном) наборе тестов, выбранных соответствующим образом из обычно выполняемых действий прикладной области и обеспечивающих проверку соответствия ожидаемому поведению системы.
Основным подходом при тестировании программного обеспечения является тестирование «черного ящика». При данном подходе тестировщику неизвестно внутреннее устройство программы. Тестировщик взаимодействует с программой: вводит данные, нажимает кнопки, манипулирует другими визуальными компонентами и оценивает результаты.
Читать дальше →
Total votes 26: ↑16 and ↓10 +6
Views 8.8K
Comments 17

Рейтрейсер на JavaScript

Algorithms *
TitleImage

Знаете ли вы что такое рейтрейсер? Это программа которая рисует трёхмерную сцену на экране так, как её бы увидели вы. Конечно, не совсем так, но некоторые рейтрейсеры умеют рисовать очень правдоподобные картинки, например как в "Аватаре".

Идея рейтрейсера очень простая и в этой статье я раcскажу как устроен этот алгоритм и даже напишу его на JavaScript. Картинки и пример прилагаются.

Читать дальше →
Total votes 249: ↑247 and ↓2 +245
Views 19K
Comments 102

Сервлеты и Reflection

Java *
Sandbox
Совсем недавно, в статье Сервлеты — маленький трюк с Reflection, разбирался прием, с помощью которого можно получить url вида:
host/servletName/methodName.

Если пойти дальше, то с помощью Reflection можно реализовать конструкцию следующего вида:
Controllers


Где, у нас в проекте есть несколько классов контроллеров, и у каждого из них свои действия. А самое главное, в методы контроллеров мы можем передавать параметры из URI. Например:
host/servletName/projects/add?title=hello

Читать дальше →
Total votes 6: ↑5 and ↓1 +4
Views 5.5K
Comments 7

Организация кода с интроспекцией в контексте обфускации и рефакторинга

Lumber room
Sandbox
Платформа .NET предоставляет богатый API для доступа к метаданным во время выполнения программы. Но механизм интроспекции предполагает позднее связывание с программными элементами посредством задания их имён и сигнатуры через соответствующие структуры данных. Подобный код может привести к изменению логики работы программы на неверную после проведения рефакторинга(переименование, изменение порядка параметров) или обфускации метаданных. Решение этой проблемы заключается в применении синтаксического сахара, доступного в рамках технологии Expression Trees и языка C#.
Читать дальше →
Total votes 5: ↑4 and ↓1 +3
Views 234
Comments 0

Снова используем Unmanaged С++ код в .NET программах

.NET *
.NET C++

Около года назад я писал статью о том, как можно вызывать методы классов написанных на чистом Си++ из любой .NET программы не прибегая к регистрации COM библиотек, C++/CLI и т.п.

Сегодня я расскажу об еще одном оригинальном и весьма удобном подходе, а, кроме того, этот топик будет интересен всем хаброчитателям которые хотят побольше узнать о замечательном инструменте Reflection.Emit (на мой взгляд эта тема на хабре недостаточно хорошо освещена).

Читать дальше →
Total votes 70: ↑61 and ↓9 +52
Views 4.2K
Comments 7

Пишем модульное приложение на .Net Framework

.NET *
Sandbox
Современные тенденции в разработке информационных систем требуют от проектировщиков закладывать в архитектуру систем возможность динамического расширения их функционала. И не смотря на существование огромного количества наработок в этом направлении, единого решения структуры модульного приложения нет. Использование же готового решения не всегда возможно в силу специфики языка программирования или разрабатываемой системы. Так же, готовые решения модульных систем не всегда доступны для изучения, а иногда излишне сложны.

Модули в разных системах, зачастую, имеют разные границы функциональности. В системе могут быть выделены некоторые, строго определенные точки расширения – некоторый функционал, дополняемый сторонними разработчиками. Или система может представлять собой лишь механизм управления модулями, а весь ее функционал реализуется отдельными модулями.
Читать дальше →
Total votes 47: ↑38 and ↓9 +29
Views 15K
Comments 43

Как получить доступ ко всем свойствам объекта, не используя «отражение»

PHP *
Для чего получать доступ ко всем свойствам объекта и при этом не менять его интерфейс? Например, для того, чтобы написать свою сериализацию. Или чтобы передать объект в приемлемом виде используя http. Или для чего-нибудь ещё.
Читать дальше →
Total votes 23: ↑13 and ↓10 +3
Views 11K
Comments 21

Возможности PHP Reflection

PHP *
Всё написанное не претендует на идеологическую верность, не является рабочим примером контроллера и не рекомендуется для бездумного копирования 1 в 1.

Идею прописывать необходимые параметры передаваемые в URL прямо в аргументах функции я подглядел в Symfony2. Там же использовались комментарии PHPdoc для определения маршрутов.

Для примера, мы хотим видеть наш контроллер таким:
class Controller {
    /**
     * Тестовое действие
     * @a /^[0-9]+$/i
     * @b /^[0-9a-z]+$/i
     */
    function testAction ( $a, $b = 'something' ) {
        echo 'a: '.$a.', b: '.$b;
    }
}

Как это можно сделать?
Total votes 25: ↑12 and ↓13 -1
Views 20K
Comments 39