makotan _at_ gmail dot com

ジェネレータ

自動生成といえば絶対に必要なもの
すべてのジェネレータの共通点
入力があって、出力があること。
入力の取得方法と出力の対象の量と動作方法を基準にしていくつかの種類に分類ができる


入力の取得方法

  • 専用のエディタなどで入力する方法
  • ExcelXMLyamlなどの定義情報から入力する方法
  • ソースコードRDBのテーブルなどから入力する方法


出力の対象の量


動作方法

  • ジェネレータ type1

シンプルなジェネレータは比較的単純な入力から単純な出力を得るようなもの
たとえば、Excelにテーブル定義を書くとそこからDDLとかEntityを出力する位のもの
テンプレートを独自に持たずに単純な変換作業で出力する
開発が最も簡単で生産性もピンポイントで向上するのが特徴

  • ジェネレータ type2

もう少し高機能なジェネレータ
比較的単純な入力から割と多くの種類の出力を得るようなもの
DB定義を読み込んで、DB関係の定義やコードのほかそれに対応した画面とかも生成するもの
開発の難易度は実はそれほど高くないし、画面の生成結果がそのまま使えるようなら生産性が高まる特徴がある

  • ジェネレータ type3

複数種類の入力データから多くの種類の出力を得るようなもの
単純なDB定義だけでなく、画面やビジネスルールなどを読み込んでそこから多くの種類のソースコードを出力する
type2までと比べればジェネレータの開発難易度は高くなる。
生成するものが最終的に使われる可能性も高くなる

  • ジェネレータ type4

複数種類の情報をすべてリポジトリに入れてそこから各種ソースコードなどを生成するようなもの
ある程度大規模な生成をする場合には非常に効果的な方法
ジェネレータの開発難易度はほぼ通常のアプリと変わらないくらいまで高くなる
ただし、複数人での編集などがしやすくなる特徴があるので比較的大規模向きな特徴が多い


入力方法

  • 汎用ツールでの入力

Excelが多いけど、そこに定義を入力してジェネレータに渡すタイプ

  • 特定フォーマットでの入力

XMLyamlなどのスキーマを独自に定義するなどしてそれをジェネレータが読み込むタイプ

  • 専用ツールでの入力

専用のツールを作ってそこからジェネレータへ情報が伝わるタイプ
type4はほぼこのパターン


ほぼすべてのジェネレータはこの組み合わせに収まると思う
ジェネレータを選ぶときはどれが良い、悪いではなくて用途と目的とアーキテクチャに合わせて使うのが良い選択方法


ジェネレータの良いところ

  • 定義情報を変更すれば低いコストで修正が可能
  • 常に同じコードが生成されるので品質が安定する
  • 効果的な使い方ができれば生産性が飛躍的に向上する

ジェネレータの悪いところ

  • 生成結果に手を入れた場合に定義情報との食い違いが発生する可能性がある
  • そもそも生成結果に手を入れることを考慮されていない場合がある
  • 生成以外は普通に作るよりものすごく大変な作業が待っている場合がある


比較的大きなジェネレータで一般的にはあまり言われない大事なこと
#たぶんtype3かtype4のジェネレータが常に抱えてる話
ほとんどは何かしらの手法などを元に作られることが多い。たとえばDOAだったりOOAだったり手法とは言わないけどBPMだったり画面中心だったりする。
これらの手法などが元々持ってる欠点をジェネレータがそのまま引き継ぐことが多い。
ジェネレータを作る場合も、ジェネレータを使う場合もそのジェネレータがどういう手法に基づいて作られているのか、その問題点は何かなどは注意することが大事
「何か」でツール作りの話はせず設計の話ばかりなのは「何か」はDOAでもOOAでもBPMでも画面中心でもないため
さらに重要なこと
ジェネレート結果のコードなどにどういう風に手を入れるのかが重要
これはほぼすべてのジェネレータが持ってる話
生成した結果のコードに手を入れなければジェネレータの効果は最大限に発揮されるものの、もし手を入れることになったときの方法と再生成でその手を入れた結果がどうなるか?に関しては要注意な部分
一度生成して2度と生成しないコードジェネレータはあんまり使いやすいとはいえない。


ジェネレータと手作業について
#世の中には100%自動生成&多様な言語を出力可能なジェネレータがいくつかあってそういうジェネレータについての個人的見解も含む
自動生成は入力量と作業削減量がどういう比率なのか?が一番重要だと思ってる
業務システムの自動生成で入力量を抑えようとすると必然的にRDBの定義情報が使われるけど、それでは作業削減量には限界がある
逆に自動生成を100%にするべく入力ツールを強化していくとあるところで手作業&軽めの自動生成でやった方が楽だと思える事になる
ジェネレータの作者はこのバランスをどうやってとるのか?ってのが一番重要
プログラマの単純作業を最大限カバーして、明確にカバーできない部分は動作の変更に対していろんな手法を使ってオープンにする。生成結果のコードが見やすく、よく使われている技術を元に作られてて、さらに非単純作業な部分についてもある程度サポートできるようなツールが良いんじゃないかなと思う今日この頃
この辺は自動生成だけじゃなくてライブラリとかにも同じようなことがいえると思うんだけどね



ジェネレータ長かった・・・やっぱ2回くらいに分ければよかったかなぁ〜