PHP標準の配列関数を組み合わせて変換していた処理があるのですが、
それをクラス化して(ArrayConverterとします)、様々なクラスで使いたいと考えています。
ユーティリティクラスの様なものですが、
staticな関数を集めたクラスではなくて、状態管理するのでnewする必要があります。
その場合、ArrayConverterを使用するクラスは
ArrayConverterの生成について、どこの責任と捉えるべきなのでしょうか。
さしあたって、A案B案を考えていますが、
どちらも決め手に欠けているように思っています。
======================================
A案:コンストラクタでArrayConverterのインターフェースを指定する
PHP
1interface IArrayConverter {} 2class ArrayConverter implements IArrayConverter {} 3 4class Hoge { 5 6 protected $_converter; 7 8 function __construct(IArrayConverter $converter) { 9 $this->_converter = $converter; 10 } 11} 12
ArrayConverterの生成の責任はHogeには無い(生成すべきではない)と考え、
Hogeは、ArrayConverterを使用する事をコンストラクタで宣言だけすべきと考えました。
テストもできるので、無難な設計と考えています。
しかし、標準の配列関数の組み合わせなだけのクラスなので、
本質的にコンストラクタの引数に指定するレベルの物なのか?と悩んでいます。
感覚的には、(実際にはできませんが)PHPの標準関数を使用するからといって
コンストラクタの引数に標準関数を並べるような感覚でして、
似たようなクラスが増えていった場合、
**コンストラクタの引数が多くなりすぎるのでは?**と思っています。
======================================
B案:使う場所でnewするか、getInstanceする
PHP
1class ArrayConverter {} 2 3class Hoge { 4 5 public function foo() { 6 //newの場合 7 $converter = new ArrayConverter(); 8 } 9 10 public function bar() { 11 //getInstanceの場合 12 $converter = ArrayConverter::getInstance(); 13 } 14 15} 16
ArrayConverterのような汎用クラスであれば、
標準関数と同じように扱いコンストラクタを通じた使用の宣言は必要なく、
Hogeに生成の責任がある(というより自由に生成してよい)と考えました。
直感的で分かりやすいと考えています。
しかし、どちらの場合もHogeとArrayConverterの関係が密になりすぎて、
ArrayConverterをダミーに差し替えるといった事が出来なくなるのが心配です。
======================================
よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー