長文になってしまい、申し訳ありません。
例えば内部でDBを使うクラスがあり、そのクラスのコンストラクタをどうすべきか悩んでいます。
PHP
1//方法A 2public function __construct() 3{ 4 $this->db = new Db(); 5}
PHP
1//方法B 2public function __construct(DbInterface $db) 3{ 4 $this->db = $db; 5}
Aは密結合で、悪い例と言われているかと思います。
Bは疎結合で、良い例と言われているかと思います。
悩んでいるポイントですが、Bは生成時にDbInterfaceを要求しており、
これがどうにも納得が出来ないです。
使う側からしてみれば、このクラスがDBを使うかどうかなど、知らされる必要はないと思っています。
このクラスは、自身が勝手にDBを使うのだから、DBのインスタンスの生成も自身で責任を持って行うべきでは?
と思っています。
対案として、
インスタンスの生成に関する処理を一括して行う専用のクラスを設け、
その中に閉じ込める方法もあるかと思うのですが、
やはり、コンストラクタの定義としてDbInterfaceの要求が存在している事が微妙に納得できないです。
また、
PHP
1//方法C 2public function __construct() 3{ 4 $this->db = InstanceMaker::getInstance('Db'); 5}
こういう感じの方法もあるかと思うのですが、実際にどのクラスを使っているか分かりづらいなと思っています。
テストとかを考えるとBの方が良いので、Bの方法を使っていきたいと思っているのですが、
今のところ納得して使える気がしていません。
そんな私が納得して使えるような考え方がありましたら、
どうか教えていただけないでしょうか。
私が最も引っかかっている点は
使う側からしてみれば、このクラスがDBを使うかどうかを知る必要はなく、
DBのインスタンス生成も自身で責任を持って行うべきでは?
という点です。
どうか、宜しくお願い致します。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/08/25 08:02