設定はオブジェクトに埋め込んだ方がいいのだろうか

それとも引数で渡したほうがいいのだろうか。あるいは設定だけ独立したオブジェクトに持たせたほうがいいのだろうか。
たとえばデータベースに接続するオブジェクト(のクラス)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が何らかの設定によって異なる文字列を返すようにすればいいと思う。

こういった場合の標準的な構成はあるのかな?あるならぜひ知りたい。