ベンダーとして、多くのクライアントにアプリケーションを出荷する必要があり、特定のクライアント向けにアプリケーションをカスタマイズする必要がある場合もあります。たとえば、特定の機能を有効または無効にしたり、そのクライアントに適切なデフォルトを設定したりします。
一部のオープンソース プロジェクトでは、これが次のパターンで行われているのを見てきました。
#define ENABLE_FEATURE_XYZ 0
#if ENABLE_FEATURE_XYZ
void featureXyzImpl()
{
...
}
#endif
void main()
{
#if ENABLE_FEATURE_XYZ
featureXyzImpl();
#endif
}
ここでは、ENABLE_FEATURE_XYZ を 0 または 1 に定義して、機能をオンまたはオフにします。利点は、不要なコードが存在しないことです。
しかし、一部の同僚は、現実の世界では、代わりに次のパターンを使用して、構成ファイルまたはレジストリ設定を調べて、実行時にカスタマイズを実行する必要があると考えています。
void featureXyzImpl()
{
...
}
void main()
{
if (configFileValue("Enable Feature XYZ") == true) {
featureXyzImpl();
}
}
彼らの理由は、機能を有効または無効にするために再コンパイルする必要がなく、ライブラリまたは実行可能ファイルの複数のバージョンを保持する必要がないため、ソフトウェアの保守とテストが容易になるためです。テスト担当者は実行時に機能を有効または無効にできます。
これらの方法のどれが特定の状況に適しているかを判断するためのガイドまたは方法論はありますか? それとも、コイントスでどちらかを選択するか、個人的な好みで選択する必要がありますか?