設定はオブジェクトに埋め込んだ方がいいのだろうか
それとも引数で渡したほうがいいのだろうか。あるいは設定だけ独立したオブジェクトに持たせたほうがいいのだろうか。
たとえばデータベースに接続するオブジェクト(のクラス)DbAccessを考えてみる。データベースの接続に使う文字列はどのように準備されるべきだろうか。
1. オブジェクトに埋め込む
class DbAccess def connection_string "接続文字列" end def connect @dbh = DBI.connect(connection_string, "", "") end # ... end
2. コンストラクタの引数で渡す
class DbAccess def initialize(connection_string) @connection_string = connection_string end def connect @dbh = DBI.connect(@connection_string, "", "") end # ... end
3. 設定を持っているオブジェクトからもらう
class DbAccess def connect settings = Settings.new connection_string = settings.connection_string @dbh = DBI.connect(connection_string, "", "") end # ... end
3はDbAccessとSettingsの結合度が上がりそうな気がするけど、2で呼び出し側がSettingsのインスタンスから取り出して引数として渡すなら、使う場所でインスタンス化した方が良い気もする。それなら1のように使う場所の近くに埋め込んだ方がいいのだろうか。データベースについての知識はDbAccessに集まっていた方がメンテナンスしやすそうだ。1の欠点は設定が各オブジェクトに分散してしまうことだ。3ならばSettingsは設定ファイルを読み込むこともできる。
テストの観点からは2のように引数で渡す方がよいかもしれない。1はメソッドconnection_stringをオーバーライドしたサブクラスを作ってテストする。3はテストが難しい気がするが、Settingsが何らかの設定によって異なる文字列を返すようにすればいいと思う。
こういった場合の標準的な構成はあるのかな?あるならぜひ知りたい。