設定ファイル!=ソースコードor設定ファイル==ソースコードという文化と違和感
某所のDI系設定ファイルに関してconfigファイルをjavaで書くスタンス「も」とれるという話について。
僕が感じたのはDIに限った話ではないので的外れかも。
設定ファイル=ソースコードという文化は元々、C/C++などのマクロを持つ言語、もしくはPerl、PHP、Pythonなどの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でやろうとするアイディアは面白いと思う。
が、JavaがJavaである以上、簡潔に記述できないという箇所がでるのは避けられない。
ロジックを書き始めると、どうも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アプローチだと意外に綺麗になるのかも。
まぁ、いろんなアプローチがありますね、というお話。