Есть ли какой-нибудь язык, который использует шаблонизацию кода? - PullRequest
7 голосов
/ 09 сентября 2011

Есть ли язык, который имеет форму шаблонного кода?Позвольте мне объяснить, что я имею в виду ... Сегодня я работал над проектом на C #, в котором один из моих классов был очень повторяющимся, набор методов получения и установки свойств.

    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

Я чувствую, что у этого было бы много возможностей в написании краткого, СУХОГО кода.Этот тип вещей может быть несколько достижим в C # с помощью рефлексии, однако это медленно, и это должно быть сделано во время компиляции.

Итак, вопрос: возможен ли такой тип функциональности в любом существующем языке программирования?

Ответы [ 2 ]

9 голосов
/ 09 сентября 2011

Как заметил Марк Гравелл, это простая работа для T4 (Набор инструментов преобразования текстовых шаблонов) , который представляет собой шаблонизатор, интегрированный в Visual Studio, который может использоваться с C # или VB и может генерировать что угодно. Это инструмент, а не встроенная языковая функция.

Добавьте файл текстового шаблона (.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 для анализа существующего кода C # непосредственно в Visual Studio и другие преимущества.

9 голосов
/ 09 сентября 2011

… и вы открыли чудесный мир метапрограммирования .Добро пожаловать!: -)

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

Другие языкипытался скопировать это до некоторой степени; макросы в C являются ярким примером.

Более поздние известные кандидаты на языки, которые поддерживают это в некоторой степени, являются C ++ через шаблоны и Ruby .

...