設定とAnnotationと実装と。

最近、設定とAnnotationと実装の境界について考え直し始めています。


その昔、設定と言えば、.conf、.properties、.iniのようなキー&バリュー形式のテキストファイルでした。
今でも、恐らく最も単純且つ理解し易く、実行速度が速い方法です。


しかしながら、設定情報が複雑化する過程の中で、情報をある程度階層構造化しなければならない局面が出てきました。
そこで、登場したのがXMLファイルによる設定の記述です。
XMLファイルでは、単に構造化された情報を記述出来るだけではなく、
DTDやXMLSchemaと言うメタ情報を記述する事が出来る為、
記述内容の妥当性を、ある程度の範囲ではチェックする事が出来ます。
スクリプト言語の世界では必ずしもそうではありませんが、
ほとんどのフレームワークで、XMLによる設定の記述がなされています。
XMLによる設定は、どんどん複雑化していっていると思います。
その槍玉に上がり易いのが、JavaではEJBです。*1
XMLによる設定の記述が増えるに従って、全てを人間が記述しきれない様な状況にすらなり得ます。
それに対応する為に、XDocletの様に設定ファイルを自動生成する枠組みが登場しました。


現時点で僕は、
設定情報と実装は明確に切り分けるべきであり、
それが単一のファイルの中に混在している状態は望ましくない。*2
と考えています。


所が、この考え方が、ちょっとズレているのんじゃないかなぁ…と言う感覚があります。
その根底にあるのがAnnotationです。


今まで、概念として「設定と実装」しか、意識していなかったのですが、
実は、明確に意識せずに、新しい概念を取り入れていました。
それが、「メタ情報」です。

「実装」は、ソースコードそのものです。
JavaやCの様なコンパイルが必要な言語では、動作がダイナミックに変更される事はありません。*3


「設定」は、極論するとシステムの運用状況に併せて変更可能な変数でなければなりません。
それによって、システムの振る舞いが根底から覆るような事は無い変数です。
目的は様々ですが、殆どの「設定」には、デフォルト値が存在します。


「メタ情報」は、基本的に設計時に決定され、
システムが運用を開始した後には余りダイナミックに変更される事はありません。
フレームワークが持つ振る舞いの幅の様なものです。
「設定」とは明確に違うモノかもしれないと、考えています。
もしくは、「設定」とは分けて考えた方が良いと思います。
只、「メタ情報」は今まで、「設定」と同一のファイル内に記述される事が多かった様に思います。
なので、僕は、今まで、「メタ情報」を「設定」の一部として捉えていました。
個々の事象を選択して、それが「設定」なのか「メタ情報」なのか、
ある程度判断する事は出来るのですが、
上手く判断しきれないモノもある事に気付きました。
もっと重大なのは、今まで「設定」だと思っていたのだけれども、
実は、「メタ情報」なんじゃないかと思い始めているものもあります。*4


更に、これからは、Annotationと言うちょっと違ったやり方で「メタ情報」を記述出来るようになりつつあります。
今まで、「設定」と「メタ情報」の違いを曖昧に捉えていても余り問題が顕在化しなかったのは、
恐らく「設定」と「メタ情報」を、「実装」とは分けた、同一のファイルの中に記述していたからだと思います。
所が、これからは、「メタ情報」と「実装」を同一のファイルに記述し、
「設定」とは分離しなければならなくなります。
「設定」と「メタ情報」の違いを曖昧にしたままだと、
AnnotationがXDocletの代替テクノロジでしかなくなってしまいます。
つまり、これまでXDocletから作成していた設定ファイルを、
これからは、Annotationから作成するだけ。の様に。
単なる感覚ですが、これは、余り良く無いんじゃないか…と思います。*5


「設定」と「実装」を、明確に分離するべきなのは明らかですが、
「メタ情報」と「実装」は、分離しない方が良いかもしれないのです。
つまり、もう一度「設定」と「メタ情報」の違いについて
考え直さなければならないと思い始めた訳です。


ここで、先日のJ2EE勉強会でひがさんの仰っていた話と繋がってきます。

  • なるべく「設定」ファイルを記述しない。例外的な状況でのみ設定ファイルを記述する。
  • Annotationを記述する事で、必要最小限の「実装」で済む様、DIコンテナは振舞う。
  • そもそも、DIコンテナは、ある一定のルールを元に、「設定」ファイルや、Annotationが無くても、管理するべき対象とその方法を決定できる。


これに対して、僕は、
ある種の推論エンジンの話をしているな…と、感じました。
そして、その推論エンジンの動作を微調整する為の手段が、
「メタ情報」なのだと理解しました。


「設定」の場合には、何も記述しなければ、「デフォルト値」が使用されますが、
「メタ情報」の場合には、何も記述しない事は、単に推論エンジンの動作を調整しない事なのかな。と。


と、まぁ、中途半端だけれども、今日の思いつきはここまで。
僕の中で、明確に結論が出るまで、もう少し色々やる事があるなぁ…と言う感じです。
読み直してみたら、1つの文脈の中で、1つの単語を、違う意味で使ってるし…。

*1:個人的にはSpringやHibernateも充分難しいと思います。

*2:よってアンチXDoclet

*3:バイトコードエンジニアリングや、リフレクション等、例外はあります。

*4:例えば、オブジェクトのトランザクション属性

*5:依然としてアンチXDoclet