Chainen met de Factory() methode

Tegenwoordig maken de meeste frameworks (zowel PHP als Javascript) er gebruik van: chainen. Het is handig, verkort je code en maakt de code leesbaarder (mits netjes uitgelijnd).

Probleem: new ClassName()

Een probleem ontstaan wanneer je een nieuwe instantie wilt creëren en direct wilt chainen.

PHP voorbeeld:

 $view = new View( 'home.php' );
$view->set_var( 'title', 'Mooie site' )
      ->render(); 

JavaScript voorbeeld:

 var el = new DomSelect( '#button' );
el.setWidth( '100px' )
   setHeight( '30px' ); 

Oplossing: factory() functie

De oplossing voor dit probleem is het creëren van een factory functie. Het idee is dat binnen de factory functie een nieuwe instantie wordt aangemaakt en deze wordt geretourneerd. Hierdoor kun je direct de “chain” starten na de aanroep van factory().

 $view = view_factory( 'home.php' )
            ->render(); 

Statische methode

De mooiste manier is om hiervan een statische methode te maken binnen de betreffende class. Je kunt dan een instantie aanmaken met Class::factory(). Hieronder volgt een implementatie in PHP en JavaScript.

PHP implementatie

Factory methode maken in PHP:

 class View {

     // constructor
     public function __construct( $file_name ) {
           // code...
     }

     public function set_var( $key, $value ) {
           // code...
     }

     public function render() {
           // code...
     }

     public static function factory( $file_name ) {
          // create instance
          $view = new View( $file_name );

          // return instance for chaining
          return $view;
     }

} 

Voorbeeld gebruik van de methode:

 $view = View::factory( 'home.php' )
            ->set_var( 'title', 'Mooie site' )
            ->render(); 

JavaScript implementatie

Factory methode in JavaScript:

 // constructor
function DomSelect( selector )  {
    // code....
};

DomSelect.prototype = {

    setWidth: function ( width ) {
        // code...
    },

    setHeight: function ( height ) {
        // code...
    }

};

DomSelect.factory = function ( selector ) {
    // create instance
    var domSel = new DomSelect( selector );

    // return instance for chaining
    return domSel;
}

Voorbeeld gebruik van de methode:

 var el = DomSelect.factory( '#button' )
            .setWidth( '100px' )
            .setHeight( '30px' ); 

Gerelateerde artikelen:

Reacties (1)

  • Thanks a lot, you saved my day !

Stuur je reactie