php - How to simplify an API without sacrificing Dependency Injection? -
let's have rectangle class. use i'd do:
$rectangle = new rectangle( 100, 50, new color('#ff0000') );
however public api, want simplify end-users as possible. preferably accept hex string:
$rectangle = new rectangle( 100, 50, '#ff0000');
the problem need instantiate color object inside rectangle class
class rectangle { protected $width; protected $height; protected $fillcolor; function __construct( $width, $height, $fillcolor ){ $this->width = $width; $this->height = $height; $this->fillcolor = new color( $fillcolor ); } }
having learned dependency injection considered bad. or it? what's best approach?
i use factory class, accepts array (possibly) of arguments , returns ready instantiated rectangle object. there many possibilities how that, depending on design , api specification.
class myapifactory { public function createrectangle($params) { // checks of params $color = new color($params['color']); rectangle = new rectangle($params['width'], $params['height'], $color); return $color; } }
further depending on needs , design can choose between factory method
or abstract factory
. have interface geometricalshape
, class rectangle implements geometricalshape
class circle implements geometricalshape
first use
class myapifactory { public static function createrectangle(array $params) { /*...*/ } public static function createcircle(array $params) { /*...*/ } }
or
abstract class shapefactory { /** * @return geometricalshape */ abstract public function createinstance(array $params); abstract protected function checkparams(array &$params); } class rectanglefactory extends shapefactory { public function createinstance(array $params) { // ... } protected function checkparams(array &$params) { if(empty($params['width'])) { throw new exception('missing width'); } if (empty($params['height'])) { throw new exception('missing height'); } // make color optional if (empty($params['color'])) { $params['color'] = color::default_color; } } }
Comments
Post a Comment