【问题标题】:Is there a term for this concept, and does it exist in a static-typed language?这个概念是否有一个术语,它是否存在于静态类型语言中?
【发布时间】:2011-02-18 22:33:24
【问题描述】:

最近我开始注意到我的一些代码中有重复。当然,一旦你注意到重复,它就会变得刺耳。这就是我问这个问题的原因。

这个想法是这样的:有时你编写同一个类的不同版本:原始版本、锁定版本、只读外观版本等。这些对类来说是常见的事情,但翻译是高度机械的。用锁获取/释放等包围所有方法。在动态语言中,您可以编写一个对类的实例执行此操作的函数(例如,迭代所有函数,用获取/释放的版本替换它们锁。)。

我认为我的意思是一个很好的术语是“反思类”。您创建一个转换,它接受一个类,并返回一个以期望方式修改的类。同步是最简单的情况,但还有其他情况:使类不可变[包装方法以便它们克隆,变异克隆,并将其包含在结果中],使类只读[假设您可以识别变异方法],创建类似乎适用于 A 型而不是 B 型等。

重要的是,理论上,这些转换在编译时是有意义的。尽管 ActorModel 具有根据 T 改变的方法,但它们以编译时已知的特定方式依赖于 T(ActorModel 方法将返回原始结果类型的未来)。

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

【问题讨论】:

    标签: types theory naming


    【解决方案1】:

    如果我理解得很好,您希望能够通过现有类型的转换来生成新的类/类型。类似的东西

    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 或自定义类加载器可以实现其中的一部分,但我想说,在精神上最接近的匹配是动态代理。动态代理的代码看起来确实很糟糕,类似于我上面写的。 Hereherehere 是我使用动态代理解决的情况。当然,动态代理不是静态的,而是顾名思义,是动态的。

    我担心您描述的一般问题——如何创建现有类型的变体——过于宽泛。已经针对特定情况提出了类型系统扩展的建议,例如如何创建从接口 X 到 Y 的适配器,以便 X 的所有具体实现也可以视为 Y 的实现。

    也许看看这些论文(我还没有全部阅读,但我打算):

    对于最后一个,摘要说:

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

    ,这是你的问题之一。

    很酷的问题顺便说一句,我希望您的问题有一个通用的解决方案。我不假装是这方面的专家,所以可能会有,但我不知道。

    【讨论】:

      【解决方案2】:

      【讨论】:

      • 听起来确实很相似,并且涵盖了一些情况。但是,使用方面,我可以获取一个类并让方法返回期货而不是正常值吗?
      • 您通常不能使用 AOP 更改返回类型,有一点是使用它的代码不知道这些方面。
      【解决方案3】:

      你不能用模板来做这件事吗?这会有点骇人听闻,但类似于:

      #define LOCKED = true;
      #define UNLOCKED = false;
      
      template<bool lock>
      void doStuff(){
          if(lock){
              // get lock
          }
          // other code
          if(lock){
              // release lock
          }
      }
      

      【讨论】:

      • 我不知道。我从未真正探索过 C++ 模板的局限性。他们可以创建一个方法基于子类方法的类吗?
      • 您可以创建一个子类的实例作为成员变量,然后使用它的方法吗?或者如果它们是静态函数,您可以将它们用作SubclassName::functionName()
      【解决方案4】:

      Python 有 decorators 与您正在谈论的内容相关。

      【讨论】:

      • 我认为装饰器适用于类的定义,而不是实例化。另外,我特别询问了静态情况,因为动态语言使这些转换相对容易。
      • @Strilanc:我阅读你的问题的速度比那时要快。但是装饰器只是应用于类的函数,原则上你可以装饰一个类并在本地实例化一个对象。
      猜你喜欢
      • 2012-12-12
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多