設定ファイル!=ソースコードor設定ファイル==ソースコードという文化と違和感

 某所のDI系設定ファイルに関してconfigファイルをjavaで書くスタンス「も」とれるという話について。
 僕が感じたのはDIに限った話ではないので的外れかも。

 設定ファイル=ソースコードという文化は元々、C/C++などのマクロを持つ言語、もしくはPerlPHPPythonなどのLL言語が持っていた文化だと考えた。
 Javaはむしろそれを否定してきたように見えるし、設定ファイルとして、Config.javaのようなスタンスを採用してこなかった。
 設定ファイルのスタイルとして.propertiesといったファイルや、.xmlが散見されるが.javaを設定ファイルとして用いたりするケースをほぼ見かけないと言っていい。

 が、C/C++やLLはxxxxx-config.plとか、config.phpだとかsettings.pyといった文化を積極的に築いてきた。
 要するにソースコード上に設定を記述してしまおうというスタンス。

DEBUG = True

DATABASE_ENGINE = 'mysql'
DATABASE_NAME = 'test'
DATABASE_USER = 'root'

といった記述を「設定名を冠した」ソースコードに集約する。

if DEBUG:
    DATABASE_NAME = 'debug'
else:
    DATABASE_NAME = 'release'

なんて記述もお茶の子さいさいだ。

Cでもこの文化は有効で、マクロを多用するが、

TASK_SETTING_START

    TASK_SET( mainTask, PRIORITY( 1 ) ),
    TASK_SET( fieldTask,  PRIORITY( 2 ) ),
    TASK_SET( spriteTask, PRIORITY( 2 ) ),
#if DEBUG
    TASK_SET( debugTask, PRIORITY( 3 ) ),
#endif

TASK_SETTING_END

みたいな記述ができた。イリーガルさがあるけど。

Pythonのsettings.py
で近しい記述を探すなら、

# テンプレートコンテキストプロセッサの実行の前に処理するメソッドを書く
TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.auth',
    'django.core.context_processors.debug',
    'django.core.context_processors.i18n',
)

のようになるだろうか。

これに対して、Javaは多くの場合にこのスタンスを採用してこなかった。
「なぜか」と考えれば(自分は)Javaはこれらの記述をすることで設定ファイルがソースコード的になってしまうため、あえて分離を目指したのだと思う。
(それ自体Javaの記述自由度が低いともいえるが、厳格な言語であることを目指す以上当たり前)

それを、あえてConfig.javaでやろうとするアイディアは面白いと思う。
が、JavaJavaである以上、簡潔に記述できないという箇所がでるのは避けられない。
ロジックを書き始めると、どうもJavaでは単なるソースコードにしか見えない気がする。

@DatabaseEngine(name="mysql")
@DataBaseName(name="test")
@DataBaseUser(name="root")
class DatabaseConfig {
     // or ...
    final String DATABASE_ENGINE = "mysql"
    final String DATABASE_NAME   = "test"
    final String DATABASE_USER   = "root"
}

@AppName(name="hoge")
class AppConfig extends DatabaseConfig {
      ...
}

なんてソースコードになってしまう気がする。

DATABASE_ENGINE = "mysql"
DATABASE_NAME   = "test"
DATABASE_USER   = "root"

ほど簡潔な記述と等価になりえない。(気がする)
特にプリプロセッサ周りもないので、

#if ALPHA_SERVER
    final String DATABASE_ENGINE = "mysql"
#else
    final String DATABASE_ENGINE = "postgresql"
#endif

という感じのロジックを書きにくい。(かけないことはないし、これはこれで拙いけど)
で、違和感を感じたというお話。

(けど、Javaで書く設定ファイル≒ロジックを記述できる設定ファイルは魅力的)

適材適所で棲み分けを考えていけばよいのだろうけれど。
Springとかは綺麗になるのかしらん。
@ConfigurationとかAnnotationアプローチだと意外に綺麗になるのかも。

まぁ、いろんなアプローチがありますね、というお話。