これが実際にこれを設計する方法であるかどうかはわかりません。データを保持するクラスから一般的なメソッドを抽象化する必要があるようです (おそらく使用したいDataMapper
ですか?)。しかし、ActiveRecord
継承を伴うこのパターンが理にかなっていると思うなら、あなたはこのようなことをしようとしていると思いますか?
abstract class Base
{
public function add($data)
{
$something = do_stuff($this->getId($data));
}
abstract protected function getId($data);
}
class Derived extends Base
{
private $idKey = 'DerivedKey';
protected function getId($data)
{
return $data[$this->idKey];
}
}
http://php.net/manual/en/language.oop5.abstract.php
あなたの場合、一般的なメソッド(CRUD)がありますが、抽象的な保護されたメソッドを呼び出して特定のものを取得します。
これはTemplate Method Pattern
http://en.wikipedia.org/wiki/Template_method_patternです
編集:追加の列/メタデータ/などを追加するクラスがあると思われる場合は、次のことを試してください。
abstract class Base
{
public function add($data)
{
$something = array();
$something[] = do_stuff($this->getId($data));
$something[] = do_stuff($this->getName($data));
$something[] = $this->additionalFields($data);
}
abstract protected function getId($data);
abstract protected function getName($data);
protected function additionalFields($data)
{
// no additional fields by default
}
}
class Derived extends Base
{
private $idKey = 'DerivedKey';
private $nameKey = 'DerivedName';
private $other = 'new thing';
protected function getId($data)
{
return $data[$this->idKey];
}
protected function getName($data)
{
return $data[$this->nameKey];
}
protected function additionalFields($data)
{
return do_foo($this->other, $data);
}
}
これらはすべて、OOP パターンを示すために実際に考案された例であることに注意してください。getId
たとえば、もっと複雑になる可能性があると思います。常にこのパターンに従っているものがある場合、より良い設計は次のようになる可能性があります。
class Base
{
protected $metadata = array(
'id' => 'defaultId',
'name' => 'defaultName'
);
public function add($data)
{
foreach ($metadata as $key => $value) {
do_something($key, $data[$value]);
}
}
}
class Derived extends Base
{
public function __construct()
{
$this->metadata['id'] = 'DIfferentId';
}
}
繰り返しますが、これはニーズに合わせて調整できるパターンにすぎません。