minimize

事業拡大のため、新しい仲間を募集しています。
→詳しくはこちら

ここでは、コードの自動生成について考えていきます。
Javaのような静的型付け言語では、必須課題とも言えるでしょう。

なぜ自動生成するのか

コードを自動生成するのには、いくつかの理由があります。

手間を減らす

例えばフィールドのアクセッサ(Getter/Setter)などは、
決まったルールによって記述されます。
よって、これは自動化することが可能です。
これによってタイピングに掛かる手間を減らすことができます。

ミスを減らす

これは、タイピング量を減らす事と密接な関係があります。
人間は必ずミスをします。
単純作業の繰り返しは、可能な限り避けることが重要なのです。

つまり、コードを自動生成することによって
時間を節約し、精度を高め、プログラマに掛かるストレスを減らすことが出来るのです。

これと比べ、Rubyなどの動的言語ではコードの自動生成を
「プログラム実行中に」行うことが可能となります。
Ruby on Rails などはまさにこの仕組みを使っています。
しかしJavaにこのような仕組みは無い為、自動生成という手段が有効となってくるのです。

確かに、最初にその枠組みを用意するために
多少の初期コストが必要になります。
しかし、ほとんど全ての場合において
そのコストは手作業を繰り返すことによって掛かるコストを遥かに下回るのです。
僕は今まで、自動生成をして損だったと感じた事は一度もありません。
逆は数多く経験しましたが。

どうやって自動生成するのか

コードの自動生成には、いくつかの手法があります。

XDocletなどの既存ツールを使う他、自作するのも手です。
Rubyなどのスクリプト言語、XSLTなどのスキーマ言語、Velocityなどのテンプレートエンジン、
Excelのマクロ…は絶対にお勧めしませんが(笑)。

自動生成の一般的な流れは、
元となるソースがあり、それを解析してコードを出力するというものです。

元ソース ---(解析)---> 自動生成コード

こうすることによって、管理するのは元ソースだけで良くなります。
自動生成したコードをさらに手修正するという行為は、
なるべくなら止めた方がいいです。

いつ自動生成を使うか

例えば、ある一つの修正(もしくは追加)をするとしましょう。
そのとき、二つ以上の修正箇所があり
その修正内容がパターン化できるようならば自動生成を考えるべきでしょう。

わかりやすいところで言えば、データベースのO/Rマッピングクラスです。
あるテーブルにカラムを一つ追加する場合、
コード上修正が必要な事は

* カラムに対応するフィールドを追加
* そのフィールドに対応するアクセッサを追加
* フィールドおよびアクセッサのJavadoc記述を追加

こんな感じになります。
こういう場合、自動生成を使えば修正や追加が非常に楽になります。

自動生成をしない理由

しかし、実際にはこういった自動生成をしているプロジェクトは
僕の経験上あまり多くありません。
理由にはいくつかあると思います。

自動生成用のコードを書く技術が無い

これが最大の理由ではないでしょうか。
「そんな馬鹿な」と思う人もいるかもしれませんが
こういったテキスト処理を得意とするプログラマは意外に少ないのです。

特に、Javaからプログラムを始めたような人には
こういった技術が備わっていないことが多いです。
ディレクトリ操作、文字コードを意識したファイル入出力、正規表現…
せいぜいこの位の事がわかっていればいいんですが。

それによるメリットを理解していない

これも致命的な問題です。
そう考えるのは、実際に開発をしない上の人間たちです。
コードを書くプログラマは、自動生成ツールがあれば
どんなに便利なことか、と常に思っているはずです。

根本的な原因として「コードは一度書いたら修正しないもの」
という認識があると思います。
しかしこれは大きな間違いです。
コードは常に修正されます。どんな完璧な仕様書があったとしても。
修正しやすいコードを書く重要性を理解しましょう。

自動生成を採用しているプロジェクトでは、積極的にコードを修正することが可能になり
これによって開発効率が高まります。