抽象度高めようとしたら、クラスファイルだらけになりそうでござるの巻
例えば、各クライアントごとに、ほぼ同一のトランザクションだけど、違ったインスタンスを利用したい場合。
基本、抽象化されたインスタンス、メソッドを実行したいんだけど、素直にAbstractFactoryするとクライアントの数と組み合わせが膨大で実装の継承クラスが増えすぎてちょっと煩雑になりそう。
実験的に実装の継承クラスに必要なメソッドを、組み合わせて定義するような設計を試みた。
<?php class Controller { public function main( $model, $function_prefix, $function_suffix ) { $AbstractMode = new $model(); $AbstractMode->main( $function_prefix, $function_suffix ); } } abstract class AbstractModel { public function main( $function_prefix, $function_suffix ){ $func = sprintf( "%s_%s", $function_prefix, $function_suffix ); $this->$func(); } } class UserModel extends AbstractModel { protected function client_a_member(){} protected function special_member(){} protected function special_guest(){} } $obj = new Controller(); $obj->main( "UserModel", "client_a", "member" );
で、各クライアントごとに共通の処理をするような時はmainメソッドをover rideする
<?php class ExampleModel extends AbstractModel { protected function default_example(){} protected function default_hoge(){} /** * main method over ride */ function main( $function_prefix, $function_suffix ){ parent::main( "default", $function_suffix ); } } $obj = new Controller(); $obj->main( "ExampleModel", "", "hoge" );
これでとりあえず、Model(機能)数のクラスファイルで、組み合わせの実装が出来るようになった。
ちと、試してみて使えそうだったらこんな設計方針で進めてみる。
本当は、サブクラスに実装するメソッドは抽象メソッドを定義したいんだけど、それやると柔軟さに欠けるんだよなあ。。。