top / index / prev / next / target / source

2006-03-16 diary: blanco Frameworkのソースコード自動生成などに関して、改善したいこと

いがぴょん画像(小) 日記形式でつづる いがぴょんコラム ウェブページです。

old-v2

blanco Frameworkのソースコード自動生成などに関して、改善したいこと

blanco Frameworkというオープンソースは、主たる機能として Java/C#.NETソースコード自動生成をもっています。blanco Frameworkを実際に作ってみて、ソースコード自動生成に関して改善したいと考えていることをメモします。

blanco Frameworkのソースコード自動生成に関して、改善したいこと

blanco Frameworkというオープンソースは、主たる機能として Java/C#.NETソースコード自動生成をもっています。blanco Frameworkを実際に実装したうえでの経験をもとに、ソースコード自動生成 (具体的には blancoCodeGenerator*) の部分に関して改善したいと考えていることをメモします。(今振り返った上で、思いつく改善点を挙げます)

ソースコード自動生成クラスとソースコードデータ構造との分離

現状の blancoCodeGenerator* においては、ソースコード自動生成クラスとソースコードデータ構造とが混じってしまっています。いくつかのプロダクトを作成したうえで、変更したいという欲が湧いてきました。これをデザイン変更して処理(Transformer)とPOJO(クラス構造)という2つの責務に分離し、ソースコードの構造をあらわすデータ構造とソースコード生成処理(Transformer)そのものを分離して整理したいと考えました。

このソースコードデータ構造については、Javaバイトコードの構造についても参考になるのではと考えています。それが ある意味必要最低限の要素単位であると考えるからです。究極的な実装としては、ソースコード自動生成とバイトコード自動生成の両方が実現できるソースコード生成部がベストなのでしょうけれども、多言語対応という観点も考えると、バイトコード自動生成対応は優先度が低いと考えています。

ソースコード自動生成処理そのもののオブジェクト指向化

加えて ほんとうは実現したいことには、ソースコード自動生成に関する処理そのものにオブジェクト指向を注入することが可能であるのかどうかについての検証です。例を挙げます。あるソースコード自動生成処理があって、そのクラスを継承して機能を追加したら、実際に自動生成する対象のソースコードも機能追加というかたちです。これが実現できると、ソースコード生成部を継承すると、あたかもそのものが継承されたかのごとく自動生成されるソースコードも継承されたが如く自動生成される、そんなデザインができたら非常に素晴らしいものと考えています。そして、実はこれは実現可能ではないかとも構想中です。こういった特徴はテンプレート型ソースコード自動生成では実現できない、がりがりのソースコード自動生成型ならではのメリットでもあります。

しかし、万が一 これを行動にうつすとしても、blancoCodeGeneratorJavaScriptを実装したあとで実施しようと考えています。なぜならまだソースコード自動生成については Java言語と C#.NET言語の2言語においてしか経験をしていないからです。JavaScript言語の自動生成も経験して、いちおう3言語を経験した後であれば、ある程度普遍的なソースコードデータ構造というものを導出できるように考えるからです。2という数字を越えるプログラミング言語の自動生成をおこなって、そして初めてある程度普遍的な共通点を導出できるのかなぁ、なあんて勝手に想像しています。しかしここで取り上げているのは あくまでも 「Javaっぽい」プログラミング言語だけですね…。

blanco FrameworkのExcel様式読込処理に関して、改善したいこと

blanco Frameworkというオープンソースは、主たる機能として Excel様式の賢い読み込みがあります。具体的には blancoCalcParser が該当します。この箇所について改善したいと考えていることをメモします。

実は、いま時間が確保できるのであれば最初に改善したいもののひとつが Excel様式読込処理の箇所なのです。ここは 進捗上 追い詰められた状態において勢いで作りました。今ソースコードを見てみると はずかしい状態です。今までは 延べ 3日程度しか工数をかけられていないのです (そして、これは恥ずかしいソースコードに対する言い訳です)。ところが あそこの箇所は blanco Frameworkの心臓部みたいなところです。あそこのルーチンがあるから、blanco FrameworkのExcel読み込みが非常にシンプルで、そして賢い挙動をするようになっているのです。ああ、そんなところが あのような恥ずかしいコードに…。みなさま、スミマセン。そして、バグはなるべく早急に修正します。

これは可能性が非常に低いアイデアです。もし私に時間的なある程度の余裕があれば、この箇所について別の抜本的な改善をおこないたいのです。Excel様式の読み込みについても、前述のオブジェクト指向が導入できれば非常に素晴らしいのだ、と考えています。Excel様式を継承して別のExcel様式を作成するのです。あるいは Excel様式から得られた内容を処理する箇所についても、これが継承とかできると画期的だろうと考えます。変更部分だけオーバライドして実装するとあたかも Excel様式が継承されたかのごとく振る舞うのです。Delphiの画面の継承のExcel様式版みたいなものです。ところが、これは もんのすごく頭の良いそして実行力のある人にしか実装できない難易度の高いプログラミングなのではないかとも考えます。、、、ということは、私には時間が与えられてもスキル的に実現は困難っぽいですね…。しかも頭の良いひとは Excel様式のオブジェクト指向なんていうネタには取り組まないような気もしてきました…。

blanco FrameworkのExcel様式は、見方を変えればステレオタイプにあたるのでしょう

blanco FrameworkのExcel様式は、見方を変えると オブジェクト指向におけるステレオタイプに該当するのだ、と捉えることが出来ます。(しかし、一般的な blanco Frameworkの説明をおこなうときには、なるべくオブジェクト指向的な用語を使った説明は行わないように心がけています…)設計や実装からステレオタイプを導出し、Excel様式に閉じこめることが出来れば そのまま新規のソースコード自動生成へとつながります。わたしはこれを blanco様式の新規作成なのだととらています (該当する専門用語は決まっていません)。このExcel様式の導出が、blanco Frameworkを遂行するうえでもっとも難しい工程のひとつなのです。blanco Framework コミッタには Excel様式を決定する専門家がいます。(私ではない人物が担当しています。) それに比べて、ソースコード自動生成はある意味が自明の実装なのです。どんな方法を使ったとしても、(さまざまな効率は考えないとすると) ソースコード自動生成は実現できるのです。ソースコード自動生成というジャンルにおいて、ソースコード自動生成という営みそのものは主題ではないのです。皮肉なことですね…。

Excel様式の所定のセルに記入を行っていくと、それを入力として確実に実装としてのソースコード自動生成が実現できる、それこそが [replace-link:blanco Framework]の特徴なのでしょう。設計書から実装への連動感が、プログラマーの設計書執筆作業を苦痛から快楽へと変えてくれるのです。そのためには Excel様式の導出 (言い方を変えればステレオタイプの導出) が重要です。Excel様式の導出こそが [replace-link:blanco Framework]関連作業のなかで最も難しい作業のひとつとなっています。一方で ソースコード自動生成と連動するステレオタイプさへ導出できれば、その該当箇所はもはや完全自動化されたようなものです。でも、それが難しいのですよね…。

寝ぼけながら書いたので、文章が練れておりませぬ…

なあんてことを書きたかったので勢いで書き下ろしました。私にとっては ソースコード自動生成は前世紀からごく普通に携わってきた題目です。私には馴染んだ、そしてライフワークみたいなものです。最初に携わった頃は C++言語ソースコードが自動生成対象でした。Java言語ソースコード自動生成+オープンソース実装という枠組みでは、今振り返ってみると 2001年から既に関与してきました。(そちらは O/Rマッピングでした。そして現状の blanco Frameworkとは別のアプローチを取っています) それらを実装して利用したうえで明らかになった反省をふまえて blanco Frameworkに取り組みました。いくつかの点は納得できました。しかしそれでも振り返ってみると 新たな改良点が目についてきてしまうのです。現時点では「UNIXという考え方」に延べられているような、素晴らしい設計理念を持ち合わせています。これを活用すると、現時点で不満を感じている点を改善した新たなソースコード自動生成を作り上げる可能性を感じています。(しかし それを実現したとしても、また後で振り返ると別の不満が出てくることでしょうけれども…。)


この日記について