Существует ли термин для этого понятия, и это существует на статическом типизированном языке?

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

Идея - это: иногда Вы пишете различные версии того же класса: необработанная версия, заблокированная версия, версия фасада только для чтения, и т.д. Это общие вещи сделать к классу, но переводы являются очень машинными. Окружите все методы блокировкой, получает/выпускает, и т.д. На динамическом языке Вы могли записать функцию, которая сделала это к экземпляру класса (например, выполните итерации по всем функциям, заменив их версией, которая получает/выпускает блокировку.).

Я думаю хороший термин для того, что я имею в виду, 'отраженный класс'. Вы создаете преобразование, которое посещает урок и возвращает modified-in-a-desired-way класс. Синхронизация является самым легким случаем, но существуют другие: сделайте класс неизменным [переносят методы, таким образом, они клонируют, видоизменяют клон и включают его в результат], сделайте класс только для чтения [предположение, что можно определить методы видоизменения], заставить класс, казаться, работать с типом A вместо типа B, и т.д.

Важная часть - то, что в теории эти преобразования имеют смысл во время компиляции. Даже при том, что ActorModel <T> имеет методы, которые изменяются в зависимости от T, они зависят от T в особенном методе, узнаваемом во время компиляции (методы ActorModel <T> возвратили бы будущее исходного типа результата).

Я просто задаюсь вопросом, было ли это реализовано на языке, и чем это называют.

6
задан Craig Gidney 13 May 2010 в 03:50
поделиться

3 ответа

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

class Synchronized<T> {
    Object invocation( Object ... args ) {
        synchronize( this ) {
            return original.invocation( args );
        } 
    }
}
...
Foo f;
Synchronized<Foo> f2;
f.bar();
f2.bar(); // would be valid for the type-system

, где invocation и original будут ключевыми словами для этой новой абстракции.

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

В то время как инструментарий байтового кода, АОП или пользовательский загрузчик классов могут частично решить эту задачу, я бы сказал, что по духу наиболее близким соответствием является динамический прокси. Код динамического прокси выглядит ужасно похожим на то, что я написал выше. Здесь , , здесь и , здесь - ситуации, которые я решил с помощью динамических прокси. Конечно, динамические прокси не статические, а, как следует из названия, динамические.

Боюсь, что описываемая вами общая проблема - как создавать вариации существующих типов - слишком широка. Предложение о расширении системы типов было сделано для конкретных ситуаций, например. как создать адаптер от интерфейса X к Y, чтобы вся конкретная реализация X также могла рассматриваться как реализация Y.

Может быть, взгляните на эти документы (я еще не читал их все, но планирую):

Для последнего в аннотации говорится:

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

, что было одним из ваших вопросов.

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

2
ответ дан 17 December 2019 в 18:11
поделиться

Не могли бы вы сделать это с помощью шаблонов? Это было бы немного хакерским, но что-то вроде:

#define LOCKED = true;
#define UNLOCKED = false;

template<bool lock>
void doStuff(){
    if(lock){
        // get lock
    }
    // other code
    if(lock){
        // release lock
    }
}
0
ответ дан 17 December 2019 в 18:11
поделиться
Другие вопросы по тегам:

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