2010-05-13 59 views
6

最近我开始注意到我的一些代码中有重复。当然,一旦你注意到重复,它就会变成光栅。这就是为什么我问这个问题。这个概念是否有一个术语,它是否存在于静态类型语言中?

想法是这样的:有时你写同一类的不同版本:原始版本,锁定版本,只读外观版本等。这些是对类的常见事情,但翻译是机械强度高。使用锁定获取/释放等方法来环绕所有的方法。在动态语言中,你可以编写一个函数,这个函数对一个类的实例做了这样的事情(例如迭代所有的函数,用一个获取/释放锁。)。

我认为我的意思是一个很好的术语是'反映阶级'。你创建一个接受一个类的转换,并返回一个想要修改的类。同步是最简单的情况,但还有其他一些:使一个类不可变[包装方法,以便它们克隆,变异克隆,并将其包含在结果中],使类只读[假定您可以识别变异方法],创建一个类似乎与类型A而不是类型B一起工作等。

重要的部分是,理论上这些转换在编译时是有意义的。即使ActorModel具有依赖于T而改变的方法,但它们以在编译时可知的特定方式依赖于T(ActorModel <T >方法将返回原始结果类型的未来)。

我只是想知道这是否已经实现了一种语言,它叫什么。

回答

2

如果我没有理解好了,你想能够通过现有类型的转换来生成新的类/类型。像

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 

,其中invocationoriginal东西将是这本小说抽象的关键词。

新的类型可以被看作是一个代理/包装/适配器周围的原始类型。那么新型是否仍然代表原件的一个子类型是另一个问题。提取多少支持改变返回类型也是另一个问题。

虽然字节码检测,AOP或自定义类加载器可以实现这一部分,但我认为精神上最接近的匹配是动态代理。动态代理的代码看起来非常糟糕,类似于我上面写的代码。 Here,herehere是我用动态代理解决的情况。当然,动态代理不是静态的,而是如名称所示,是动态的。

我担心您描述的一般问题 - 如何创建现有类型的变体 - 太宽泛。类型系统扩展的命题已经针对特定情况进行了,例如,如何从接口X创建一个适配器到Y,这样X的所有具体实现也可以看作是Y的实现。

也许看看这些文章(我没有看过他们所有,但我打算):

对于最后一个,抽象的说:

我们讨论的介绍, 标准术语的确切好处和我们的扩展的 成本,并说明 均匀可用 代理的有效性通过实现未来的方法 安全地调用和 透明。

,这是你的问题之一。

酷问题btw,我希望你的问题的一个通用的解决方案存在。我不会假装成为这个主题的专家,所以甚至可能会有一个,但我不知道。

1
+0

它听起来很相似,涵盖了一些情况。但是,使用方面,我可以参加一个班,让方法返回期货而不是正常值吗? – 2010-05-13 15:55:30

+0

您通常不能用AOP更改返回类型,有一点重要的是使用它的代码不知道这些方面。 – 2010-05-26 13:10:21

0

难道你不能用模板做到这一点吗?这将是轻微的hackish,但类似:

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

template<bool lock> 
void doStuff(){ 
    if(lock){ 
     // get lock 
    } 
    // other code 
    if(lock){ 
     // release lock 
    } 
} 
+0

我不知道。我从来没有真正探索过C++模板的极限。他们可以创建一个其方法基于子类方法的类吗? – 2010-05-13 15:53:21

+0

你可以创建一个你的子类的实例作为成员变量,然后使用它的方法?或者如果它们是静态函数,你可以使用它们作为SubclassName :: functionName()' – 2010-05-15 22:37:08

0

Python有decorators这与您所谈论的内容有关。

+0

我认为装饰器适用于类的定义而不是实例化。另外,我特别询问了静态情况,因为动态语言使这些转换变得相对容易。 – 2010-12-11 21:25:05

+0

@Strilanc:我比我应该更快地阅读你的问题。但装饰器只是适用于类的函数,你原则上可以装饰一个类并在本地实例化一个对象。 – 2010-12-11 21:31:06

相关问题