« 柔軟に | トップページ | 姿勢には気を使うべし »

2017年3月24日 (金)PCにもプログラムを書かせよう

日中は少しずつ暖かい日が増えてきました。
日本の春は三寒四温を繰り返しながら暖かくなると言いますが、
4日も暖かい日が続いている気がしないですね。
おはようございます、本日のブログ当番M.Iです。

皆さんはプログラムで同じようなコードを書く時、どういう風に書きますか?
例えばC++ならマクロやテンプレートといった技術を使うかもしれません。
これらの技術だとソースは短くなる代わりに、
複雑なマクロを定義するとどんな展開のされ方をするのかがわからなくなりがちです。
VisualStudioでもマクロを展開した後のコードを出す、
ということができるらしいのですが、ここでは置いておきます。

今回紹介するのはT4テンプレートというコード生成機能です。
VisualStudio2010から標準で実装されています。

さっそくコード例を紹介します。
なお、生成するファイルの拡張子を指定するコードなども必要なのですが、
このエントリでは省略しています。
あらかじめご了承ください。

<# for (int i = 0; i < 3; i++){ #>
i = <#=i#>;
<#}#>


このようにすれば

i = 0;
i = 1;
i = 2;

といった文字列を生成することができます。
<#と#>で囲まれた部分はC#のコードとして無視され、
<#=と#>で囲まれた部分を評価した値が出力されます。
<#+と#>で囲まれた個所にクラスやenumが作れます。
囲まれていない部分はそのまま出力されます。

この場合iが0~2なので、iを評価した値が出力されています。
forで似たようなプログラムを連続して出力ができるわけです。
ただ、同じようなコードが出力されるため、冗長なコードになります。

また、色分けやインテリセンスも効かないので、
それらを使用できるようにする拡張機能を導入したほうが捗るかと思います。

https://marketplace.visualstudio.com/items?itemName=tangibleengineeringGmbH.tangibleT4Editor230plusmodelingtoolsforVS2013

現在個人的に使用しているのが上の拡張機能です。

できることはprintfなどでコンソールに吐き出したものをリダイレクトするのと変わりませんが、
こちらだと変更後保存すればすぐに出力先ファイルに反映されます。

実用例として、例えばUE4だとUE4で管理できるクラスや構造体を宣言する場合
クラスならUCLASS、構造体ならFSTRUCTという文言をクラス宣言の前に書くという風に決まっており、
命名もクラスならUHogeHoge、構造体ならFHogeHogeという風にしないといけません。
こういったテンプレートを作っておくとクラスから構造体に変えたいといった時に変更しやすくなります。
どう定義するのか忘れた場合の備忘録、タイプミスで起こる分かりにくいエラーを防ぐこともできます。
タイプ量も節約できます。

<#
  var className = "HogeData";
  var type = UTypes.Class;
  var prefix = type == UTypes.Class ? "U" : "F" ;
  var typeString = type == UTypes.Class ? "UCLASS" : "USTRUCT";
#>
<#= typeString #>(BlueprintType)
<#= Util.LowerAndDeleteHead(typeString) #> GAME_API <#=prefix#><#= className#>
{
  GENERATED_BODY()
  int Hoge = 0;

  bool operator ==(const <#=prefix#><#= className#>& rhs ) const
  {
    return Hoge == rhs.Hoge;
  }

};

<#+
    static class Util
    {
        // 最初の一文字を消し、すべて小文字にして返す
        public static string LowerAndDeleteHead(string input)
        {
            if (String.IsNullOrEmpty(input)) return "";
            return input.Substring(1).ToLower();
        }
    }
    enum UTypes
    {
      Class,
      Struct,
    }
#>

と入れると

UCLASS(BlueprintType)
class GAME_API UHogeData
{
  GENERATED_BODY()
  int Hoge = 0;

  bool operator ==(const UHogeData& rhs ) const
  {
    return Hoge == rhs.Hoge;
  }

};

と出力されます。
var type = UTypes.Class;

var type = UTypes.Struct;
に変えればclass部分がstructになり、名前もFHogeDataになるかと思います。

リフレクションも使えるので、.netアセンブリ内にあるクラスを列挙し、
クラス内のメソッド情報をとり、コードを書く、といったことも可能です。

自動生成で作れるものならこういった技術を使えば生産性を上げていけるかもしれません。

follow us in feedly
result = encodeURIComponent( "http://www.accessgames-blog.com/blog/2017/03/pc-50c4.html" );document.write( "result = " , result );&media=https%3A%2F%2Ffarm8.staticflickr.com%2F7027%2F6851755809_df5b2051c9_z.jpg&description=Next%20stop%3A%20Pinterest">

| | コメント (0) | トラックバック (0)

« 柔軟に | トップページ | 姿勢には気を使うべし »

プログラマー」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: PCにもプログラムを書かせよう:

« 柔軟に | トップページ | 姿勢には気を使うべし »