有没有一种语言使用代码模板?

7

有没有一种语言具有代码模板的形式?让我解释一下我的意思... 今天我在做一个C#项目,其中一个类非常重复,一系列属性的getter和setter。

    public static int CustomerID
    {
        get
        {
            return SessionHelper.Get<int>("CustomerID", 0); // 0 is the default value
        }
        set
        {
            SessionHelper.Set("CustomerID", value);
        }
    }

    public static int BasketID
    {
        get
        {
            return SessionHelper.Get<int>("BasketID", 0); // 0 is the default value
        }
        set
        {
            SessionHelper.Set("BasketID", value);
        }
    }

... and so forth ...

我意识到这可以基本上分解为一种类型、一个名称和一个默认值。
我看到了这篇文章,与我所设想的类似,但没有参数(默认)的空间。 在C#中的通用属性 但我在想,有很多时候代码会被分解成模板。
例如,语法可以如下所示:
public template SessionAccessor(obj defaultValue) : static this.type this.name
{
     get
     {
          return SessionHelper.Get<this.type>(this.name.ToString(), defaultValue);
     }
     set
     {
          SessionHelper.Set(this.name.ToString(), value);
     }
}

public int CustomerID(0), BasketID(0) with template SessionAccessor;
public ShoppingCart Cart(new ShoppingCart()) with template SessionAccessor; // Class example

我觉得这会在编写简洁、DRY代码方面有很多可能性。通过反射,c#可以实现这种类型的功能,但是速度较慢,因此应该在编译期间完成。
问题是:是否有任何现有的编程语言可以实现这种类型的功能?

8
对我来说,这似乎是T4的工作... - Marc Gravell
2
C++有模板可以接近你想要的东西:http://www.cplusplus.com/doc/tutorial/templates/ - Todd Moses
如果您的主要问题是输入样板文件的繁琐性(而不是样板文件可能发生变化的可能性),Resharper有一个很好的Live Templates功能,可以真正帮助解决这个问题。T4更强大(您可以更新模板定义并使用更新后的模板重新生成文件),但它也增加了一些额外的复杂性。Vanilla VS有Code Snippets,也可以帮助解决问题。 - Dan Bryant
2
请查看http://nemerle.org/About/。 - SK-logic
2个回答

9

正如Marc Gravell所评论的那样,这对于T4(文本模板转换工具包)来说是一项容易的工作,它是Visual Studio内置的模板处理器,可与C#或VB一起使用,并可以生成任何内容。但它只是一个工具,而不是内置的语言特性。

将Text Template文件(.tt)添加到您的项目中,模板将非常简单:

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".generated.cs" #>
<#
var properties = new[] {
    new Property { Type = typeof(int), Name = "CustomerID", DefaultValue = 0 },
    new Property { Type = typeof(int), Name = "BasketID", DefaultValue = 0 },
};
#>
namespace YourNameSpace {
    public partial class YourClass {
<# foreach (Property property in properties) { #>
        public static <#= property.Type.FullName #> <#= property.Name #> {
            get { return SessionHelper.Get<<#= property.Type.FullName #>>("<#= property.Name #>", <#= property.DefaultValue #>); }
            set { SessionHelper.Set("<#= property.Name #>", value); }
        }
<# } #>
    }
}
<#+
public class Property {
    public Type Type { get; set; }
    public string Name { get; set; }
    public object DefaultValue { get; set; }
}
#>

T4非常适合这种代码生成。我强烈推荐T4 Toolbox,可以轻松地为每个模板生成多个文件,访问EnvDTE以直接在Visual Studio中解析现有的C#代码和其他好处。

1
一个不错的入门博客:http://www.olegsych.com/2007/12/text-template-transformation-toolkit/ - Just another metaprogrammer
只是提供信息;T4可以生成C#,C ++,C,ObjectiveC,XML,基本上任何文本。它为我节省了数月繁琐可怕的重复工作。 - Just another metaprogrammer

9

...你已经发现了元编程的奇妙世界。欢迎!:-)

典型的元编程语言是Lisp,或者任何其他能够在代码中表示自己结构的语言。

其他语言也尝试在某种程度上复制这一点;C中的就是一个著名的例子。

更近期支持这种程度的语言的著名候选者包括C++通过其模板Ruby


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接