プログラマの生産性 ✖ メタプログラミング

#はじめて
前回はDBFluteについて簡単に説明しましたが、そもそもDBFluteっていうフレームワークがどういうものか、ソースコードをどうやって自動作成ができるのか？
今回は先にDBFluteのフレームワークの中の仕組みをのぞみましょう。

#[DBFlute Module]
[DBFlute Module]
 |-ant                // Apache Ant 1.7.0
 |-etc                // various resources
 |  |-client-template // template files of DBFlute client
 |  |-cmd             // scripts for DBFlute generator
 |  |-license         // license files for dependencies
 |  |-logprop         // settings for DBFlute generator's logging
 |-lib                // libraries DBFlute generator depends on
 |-templates          // velocity templates to generate classes
 |  |-doc                   // templates for documents 
 |  |  |-html               // templates for HTML documents
 |  |  |  |-datamodel.vm    // template file for SchemaHTML
 |  |  |  |-diffmodel.vm    // template file for HistoryHTML or other difference 
 |  |  |  |-table.vm        // template file for tables of SchemaHTML 
 |  |  |-ControlDocument.vm // velocity control file for documents
 |  |-om                    // templates for classes (object models)
 |  |  |-csharp             // templates for C# classes
 |  |  |-java               // templates for Java classes
 |  |  |-ControlGenerateCSharp.vm    // velocity control file for generate task of C#
 |  |  |-ControlGenerateJava.vm      // velocity control file for sql2entity task of Java
 |  |  |-ControlSql2EntityCSharp.vm  // velocity control file for generate task of C#
 |  |  |-ControlSql2EntityJava.vm    // velocity control file for sql2entity task of Java
 |-build-torque.xml              // setting for ant task (DBFlute task)

上記はDBFluteのファイル構造となりますが、まとめると以下の2点となります。
・テンプレートエンジン: velocity 
　※テンプレートエンジンとはデータとテンプレートを合体させ、文字列を作る仕組みのことです。
・起動コマンド：cmd

# 本題入り
上記はDBFluteのことですが、生産性とはどんな関係がありますか？
今回は生産性の話にもどります。
#### 生産性について
（１）かかった時間に対する、成果物だ。
（２）同じ事を達成するのに要する時間の差があること。
（３）プログラマの生産性10倍～100倍の差を持つ人がいるといわれる。
#### なぜ生産性に大きな差がある？
（１）仕様理解ズレ、やらなくていいことをやっている。
（２）古いものを捨てるべき、無理に再利用。
（３）不必要な設計、コード
（４）よりよい手法・ツール（※）が知らずに、利用しない。
　※上記の方が一番が生産性の差が出るのは手法・ツールのことと思います。
　なので、メタプログラミングの手法・ツールを紹介したいと思います。
#### メタプログラミングについて
（１）メタプログラミングはプログラムを扱うプログラム。
（２）生産性はメタプログラミングはバランスの良い抽象化をやる手段のひとつ。

# DBFlute・メタプログラミングの関係
DBFluteの原理はメタプログラミングの一つで、O/Rマッパーフレームワークを実現するのに欠かせない存在と思います。では、簡単なメタプログラミングの例を紹介したいと思います。

####　メタプログラミングの例

この記事ではvelocityとJAVA7を使っています。

（１）initVecocity.vm
     ```#set($surname="Hello")```
     ```#set($name="World!")```
     ```#set($fullname="$surname $name")```
     ```${fullname}```

（2）VelocityDemo.java
 ```public class VelocityDemo { ```
	 ```public void initVecocity() { ```
		 ```VelocityEngine ve = new VelocityEngine(); ```
		 ```ve.setProperty(Velocity.RESOURCE_LOADER, "class"); ```
		 ```ve.setProperty("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");```  
		```  try {```
			```  ve.init();```
			```  Template t = ve.getTemplate("cn/wujianbo/api/initVecocity.vm", "gbk");```
			```  VelocityContext context = new VelocityContext();```
			```  PrintWriter writer = new PrintWriter("C:\\out/helloword.html");```
			```  t.merge(context, writer);```
			```  writer.close();```
		```  } catch (Exception e) {```
			```  e.printStackTrace();```
		```}```
	```}```
```}```

（3）helloword.html (出力)
 ```Hello World!```

#まとめ
上記の例は簡単ですが、業務上に合わせて、設計書からのソースコード自動生成まで実現であれば、
従来の方法と比べて開発や保守のコストをかなり、削減できると思います。
プログラミングスキルに依存しないシステムの構築と保守が実現すると、生産性と品質が担当できると言えるでしょう。