Позволю небольшой оффтопик. Мне кажется, что до тех пор, пока производители планшетов/смартфонов, вместо того, чтобы придумать новую концепцию портативного устройства(связывающую железо, ОС и прикладной софт в единый пакет услуг, удобный как пользователю, так и стороннему разработчику), будут заниматься бессмысленными попытками сделать очередного «убийцу» ipad/iphone, ситуация на рынке не изменится и эппл как лидировали, так и будут лидировать. В силу это статьи, с заголовком вроде «7 причин, почему лучше <что-то там> лучше ipad» вызывают довольно сильный скептицизм.
Опечатку поправил, спасибо. А за «сленг» — извиняюсь, привык за годы. «Добавить к методу установки значения свойства вызов события об изменении значения данного свойства» — так будет лучше?
Спасибо за ссылку =) Насчет тормозов — я использовал этот подход для построение визуального редактора абстрактного синтаксического дерева некого упрощающего диалекта питона(в нем описывались формулы преобразования одного значения в другое). При общем количестве нод в графе порядка 50 никаких тормозов не видел. Впрочем ничего не берусь утверждать, все зависит от задачи и проекта.
Честно говоря, основная причина написания статьи — продемонстрировать возможности dynamic type. Но если интересно, то быстродействие я мерил — dynamic выигрывает на создании, ибо кастоловский прокси компилирует объект на лету с emit-апи, но зато потом в моей реализации идут проигрыши на вызове методов реального объекта, поскольку я дергаю их через рефлексию. Впрочем в дата-объекте особо методов быть не должно. Вызов свойств по времени вполне сравним, ибо там я прикрутил вызов через компилируемые лямбда-функции. Что касается решений типа T4 или посташарпа, то там конечно все быстрее, т.к. все нужные действия происходят на компиляции, но зато удобство написания явно ниже(особенно это касается Т4).
Ага, спасибо за ссылку. Но Clay позволяет делать вот так IPerson lou = people[0]; за счет использования DynamicProxy от Castle, а он может перехватывать только вызовы виртуальных методов либо методов интерфейса. Т.е. если у меня есть свойство Name и я хочу во вью-модели при сеттере добавить добавить какую-то валидацию на него(которая возможно мне совершенно не нужна или даже вредна в обычной дата-модели), то мне придется сделать свойство виртуальным. Это, конечно, не очень страшно, но мне было интересно сделать решение, которое позволяет не модифицировать сами модельные классы.
Возможно я чего-то не понимаю, поправьте, если ошибаюсь, но, как я понял, схема такая: есть ключ, с помощью него дешифрует система команд виртуальной машины, затем машина запускается и выполняет нужные инструкции, который производят полезное действие(«например печатают Hello World»). Вопрос — что мешает нам поставить отладчик уровня ядра(привет DDK) и получить дамп всех инструкций 86-го процессора, которые сделала виртуальная машина? Допустим среди них есть какие проверки(взятие системного времени, для проверки, что мы еще можем работать или проверка CPUID). Такую команду вполне реально обнаружить, и заменить на нопы, после чего сделать из полученного дампа запускаемый exe, лишенный всякой защиты. Пример со скайп не корректен, т.к. можно привести аргумент «неуловимого Джо» — зачем кому-то взламывать бесплатную программу для ip-телефонии? Разве что для попытки узнать протокол и получить возможность прослушивать разговоры(сомнительно, что осуществимо в принципе), но в таком случае на месте этого взломщика я бы хранил полное молчание.
Ну на хабре таже история:
IPerson lou = people[0];за счет использования DynamicProxy от Castle, а он может перехватывать только вызовы виртуальных методов либо методов интерфейса. Т.е. если у меня есть свойство Name и я хочу во вью-модели при сеттере добавить добавить какую-то валидацию на него(которая возможно мне совершенно не нужна или даже вредна в обычной дата-модели), то мне придется сделать свойство виртуальным. Это, конечно, не очень страшно, но мне было интересно сделать решение, которое позволяет не модифицировать сами модельные классы.