外部構成ファイルはアンチパターンと見なされますか?


8

多くの場合、私はアプリケーションが明らかに破損している状況にありましたが、外部構成ファイルに欠陥があることがわかりました。通常、これは間違ったファイルが存在するか、不正なデータが含まれていることが原因です。

外部ユーザー/プロセスがアプリケーションのランタイム特性を変更できるようにするより良い方法はありますか、またはこれが問題の最もよく知られている解決策ですか?

Unix /etc やJavaのJNDIなどに焦点を当てるのではなく、一般的なケースについての議論が欲しいです。


2
他にどのようにtest / dev / live / different live環境を構成できますか?私のポイントはその唯一のオプションです-常に外部依存が存在します。
NimChimpsky

5
あなたが持っているものは何でも外部になります。発生している問題は、構成が外部にあるということではなく、管理と理解が不適切であるということです。
2012年

2
しかし、それが問題です。構成ファイルは、不適切に管理または理解される傾向があります。
Telastyn 2012年

4
「間違ったファイル」については、Unix風の素晴らしいテクニックがあります。スクリプトラッパーを使用してバイナリを開始し、すべての構成環境変数をローカルに設定します。これにより、選択した構成が常に明確になります。
SKロジック

1
「代替」は、構成パラメーターの99%をオプションにするためのものです。適切なデフォルト値があるはずです。構成に独自の専用ファイルが必要で、実行可能コードより長くなる場合、構成可能性は有用性を超えていることがわかります。実行する前に35個のパラメーターを指定する必要があると想像してくださいcurl
Sridhar Sarnobat

回答:


13

ほとんどのアプリケーションでは、いくつかの外部構成が必要になります。マジック変数に依存させるか、内部の場所に保存することで、これを非表示にすることができますが、その必要はなくなりません。目標は、何を外部にすべきか、何を内部にできるかを認識することです。内部部品のみをテストできます。

アプリケーションは、外部構成ファイルが正しいことを信頼してはなりません。正確性をチェックし、エラーを報告します。アプリケーションが構成ファイルをチェックできない場合は、おそらくそれを使いすぎています。構成ファイルがアプリケーションの動作を変更する場合、私の意見ではそれは外部であってはなりません。

たとえば、データベースのユーザー名/パスワードは、データベースに接続しようとすることにより、アプリケーションで簡単に確認できます。これが失敗した場合、それはそれを報告することができ、それは明らかにアプリケーションコードのバグではありません。同様に、ファイルパスの存在とアクセス権を確認できます。

これで、SQLクエリを構成ファイルに入れると、アプリケーションはそれらのクエリの正確さを簡単に確認できなくなります。同じことは、完全な依存性注入仕様(Java-Spring XMLの1つ)ファイルにも当てはまります。それらは外部設定ファイルに含まれるべきではありません。

しかし、指定された構成が外部のものを記述していて、その正しさをすぐに確認できれば、外部構成ファイルに問題はないと思います。

編集:エラーレポートに、使用されている構成ファイルが表示されていることも確認してください。何が問題なのかを見つけようと何時間も試みた後、間違ったファイルを探していたことがわかるほど、イライラすることはありません。


4
内部検証の推奨事項の+1-パターンを完了するには間違いなく必須
Gary Rowe

6

私はそれらをアンチパターンよりも「既知の問題領域」として分類します。固定構成を展開するのでない限り、構成情報をどこかに保存する必要があります。私は通常、ほとんどの構成情報をデータベースに保存するのが好きですが、データベース接続情報をどこかに保存する必要があります。私は、ユーザーのホームディレクトリやWindowsレジストリではなく、アプリケーション構造自体に構成情報を格納するというJava / Springのアプローチを好みますが、それは個人的な好みです。


5

外部設定ファイルはアンチパターンではありません。他のすべてのように、それらは問題のシステムに応じて上手くまたは下手に使用することができます。

外部設定がユーザーに何が起こっているのかを知らずにアプリを壊すことができるいくつかのアプリに遭遇したようです。それは悪いことですが、それは構成ファイルのせいではなく、構成ファイル内のどの部分がアプリ内にあり、どの部分がアプリ内にあるかを決定した人の責任であり、それらの間のエラーを処理する方法です。


4

私の意見では、いいえ、外部設定ファイルはアンチパターンではありません。

これはソフトウェアの複雑さを管理するための単なるアーキテクチャパターンの手法です。

SOLID設計原則の時代に、ソフトウェアの複雑さをMonolithic_applicationから、一緒に接続する必要のあるより独立したモジュールに移行しました。

「外部設定ファイル」の代わりに、コードでモジュールを直接設定することになります。


パターンはコードに限定されません。外部構成ファイルは、単なるテクニックではなく、アーキテクチャパターンです。
Gary Rowe

4

どちらかといえば、構成をロジックからデータに移動することをお勧めします。コードを作り直す必要なく、アプリケーションをより柔軟にすることができます。データファイルの欠落は、IMHOのコーディングに関する悪い慣行よりも、インストール時のドキュメントやずさんな作業が少なすぎる場合に当てはまります。


宣言的なステートメントは、プロパティと(ある程度)動作を指定する方法として、より直接的で理解しやすいことに同意します。+1。
William Payne

3

お気に入りのSCMツールをCMツールとしての役割を倍にする:構成ファイルをリポジトリーに配置します。設定を変更するには、変更をコミットし、自動展開ツールにそれらを本番環境にプッシュさせます(もちろん、さまざまな自動テストを実行した後です!)

Et Voila!すべての構成変更の記録に加えて、自動CI /テストシステムの追加のセーフティネットがあります。

以前に指摘したように、アーキテクチャと設計パターンは製品システム自体に限定されず、それを生成するのに役立つチーム/プロセス/システムにまで及びます。


1
有用な実装戦略の+1-HerokuがGitHubプロジェクトでそれを行う方法のほとんど。
Gary Rowe

リリースの分岐とタグ付けへの影響のため、設定がコードと同じリポジトリにないことを確認する必要があります。
dietbuddha

1
同意しません。構成は実際にはコードと同じリポジトリにある必要があります。設定ファイルへの本番環境での変更は、(たとえば)Svnタグブランチへのコミットを行う正当な理由であると思います。主な利点は、1か所(リポジトリ)を調べて、本番環境に影響を与える可能性のある(可能な限り)すべてを確認できることです。すべてを見つける場所がわかっている場合は、グレムリンとバグを追跡するのがはるかに簡単です。(特に、グラファイトのようなものを使用して、パフォーマンスメトリックとアラートに対するコミットをグラフ化している場合)
William Payne
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.