Динамическая типизация [re: А какие технологии сейчас модные?]

Dasar

> Т.е. если микроскопом не забивать гвоздей, а использовать все по назначению, то джава удобней.
С этим - полностью согласен.
ps
Но вот в Java-е часто хочется иметь нормальную динамическую типизацию - при написании всяких проксей, адаптеров и т.д. Сейчас обычно это решается, через написание большого числа генераторов кода.

6yrop

нормальную динамическую типизацию

что это? можно объяснить для непосвященных на пальцах

Dasar

Это когда в языке есть объекты, которые можно менять по ходу работы, т.е. добавлять/удалять интерфейсы, методы, поля и т.д.
При этом экземпляр остается тем же самым, но у объекта меняется тип.
ps
Под типом понимается совокупность поддерживаемых интерфейсов, методов и т.д.

6yrop

это не ограничивается приведением типа?

Dasar

Вопрос не понял. Переформулируй его чуть-чуть по другому, пожалуйста.

6yrop

Динамическая типизация это больше чем

a=(Type2)b;

? (или вообще a=b; в зависимости от того, кто от кого отнаследован)

Dasar

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

Dasar

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

bansek

Возможно, то, что я сейчас скажу - глупость, но разве это делается не при помощи Map и какой-то матери?

Dasar

И чем поможет Map?
зы
Напиши, например, с помощью Map адаптер на типизированную коллекцию , адаптер например должен отфильтровывать все отрицательные элементы

Hastya

Это когда в языке есть объекты, которые можно менять по ходу работы, т.е. добавлять/удалять интерфейсы, методы, поля и т.д.
При этом экземпляр остается тем же самым, но у объекта меняется тип.

Какая-то очень странная фича, зачем это нужно?
В JDK 1.5 кстати гораздо более интересная возможность - bytecode transformation.

Dasar

Поищи, например, в интернете на Java Code Generator.
Большая часть таких генераторов - генерят код для всяких разных адаптеров (адаптер к базе, адаптер к сохранению/Загрузке, адаптер к web-сервису и т.д.)
Все эти адаптеры пишутся в пару строчек, если есть возможность динамически обслуживать внешние запросы.
ps
"bytecode transformation" - нацелен на оптимизацию быстродействия работы программы, а не на ускорение написания программ.

Hastya

Адаптер или прокси? Динамические прокси в Java существуют уже года 3. Что касается адаптеров, то для них есть такая штука как CGLIB. Bytecode transformation - это именно CGLIB на уровне JDK.

Dasar

> Адаптер или прокси?
Разница между адаптером и прокси чисто логическая.
Единственная разница - Адаптер - адаптирует прикладной функционал, а прокси - системный функционал (например, поддерживая какой-либо транспорт).
> Динамические прокси в Java существуют уже года 3
Они не динамические, они скорее просто runtime-овые - но это не интересно, это можно сделать и руками.

Hastya

Единственная разница - Адаптер - адаптирует прикладной функционал, а прокси - системный функционал (например, поддерживая какой-либо транспорт).
huh? это принципиально разные вещи
> Динамические прокси в Java существуют уже года 3
Они не динамические, они скорее просто runtime-овые - но это не интересно, это можно сделать и руками.
В runtime хрен что руками сделаешь.

Dasar

> huh? это принципиально разные вещи
И что же в ниже указанном коде такого разного?
Код для прокси:


class UserProxy: IUser
{
public string GetName
{
return Transport.GetString;
}
}


Код для адаптера:


class UserAdapter: IUser
{
public string GetName
{
return Какой-тоДругойUser.GetName;
}
}


> В runtime хрен что руками сделаешь.
Генерить текстовые файлы Java умеет.
Компилировать текстовые файлы тоже умеет
Загружать скомпилированные сборки тоже умеет
Все это вместе позволяет генерить в runtime-е все что угодно.
Поэтому я не понял твое высказывание.

Hastya

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

В том числе и то, чего тебе изначально хотелось типа самомодифирующихся классов

Dasar

> Читай классиков. Кстати, примеры для адаптера и для прокси у тебя перепутаны.
В честь чего это они перепутаны?
Все это вместе позволяет генерить в runtime-е все что угодно.

> В том числе и то, чего тебе изначально хотелось типа самомодифирующихся классов
И как? Тип уже созданного экземпляра же менять нельзя....

bastii

а можно про bytecode transformation подробнее

Hastya

Это новый пакет java.lang.instrumentation. Фактически позволяет создавать нечто вроде плагинов (ClassFileTransformer) к любым ClassLoader-ам, т.е. при загрузке класса можно его каким-то хитрым образом поменять. Что сильно упрощает использование таких библиотек как CGLIB.

Hastya

> И как? Тип уже созданного экземпляра же менять нельзя....
Ясное дело, это же не Smalltalk. Но это решается, например, агрегацией.

bastii

прикольно

Dasar

> Но это решается, например, агрегацией.
Да, можно, но только придется тогда придумывать свою конструкцию приведения типов и полностью неиспользовать стандартые приведения типов.

bastii

ну в ATL есть CComQIPtr
CComQIPtr<IUnknown> p;
CComQIPtr<IStorage> q = p; // вызывается QueryInterface
еще один + в пользу VC++ 2005

Dasar

Это можно и на Generic-ах сделать.

Dasar

> еще один + в пользу VC++ 2005
Я восхищаюсь возможностями связки .Net+C++, но меня просто в дрожь бросает, когда я вспоминаю, что C++ является однопроходным (может быть двухпроходным) языком....

bastii

нет, нельза
по крайней мере в C#, там операторы статические, а с ним дженерики не работают
хотя может с помощью конструкторов
можно думаю в С++ если сделать вируальный оперетор приведения (хотя не уверен, что можно в ref class иметь виртуальные опереаторы)

Dasar

Так проще что-то такое сделать


public class Cast
{
public static T From<T>(IServiceProvider provider)
{
return (T)provider.GetService(typeof(T;
}
}
void main
{
IA2 a2 = Cast<IA2>.From(a1);
}


Зачем в .Net-е заводить такой класс, как CComQIPtr?

bastii

но это не тоже самое
там smart указатели
ptr<IA1> a1 = ....
ptr<IA2> a2 = ....
...
a2 = a1; // конвертация, здесь даже не нужно знать как конветрить

Dasar

Самое главное, что все это работает только на уровне компилятора.
А маза в том, что иногда хочется полной свободы во время runtime-а.
Оставить комментарий
Имя или ник:
Комментарий: