post_ico4

Wzorce projektowe, cz. 6 Dependency Injection

Dependency Injection jest chyba jednym z najprostszych wzorców projektowych, więc zapewne wiele osób używało go nieświadomie. Warto jednak wiedzieć, że dane rozwiązanie ma szerokie zastosowanie i jakąś nazwę… ;)

Tym razem wyjątkowo nie będzie opisu teoretycznego, bo i nie za bardzo jest o czym mówić. Zasadę najłatwiej będzie zrozumieć na praktycznym przykładzie.

Przykład z życia wzięty

Przeanalizujmy fragment klasy do obsługi użytkownika.

<?php

class Session {
    public function __construct($name = 'PHP_SESSSION') {
        session_name($name);
        session_start();
    }
    public function set($key, $value) {
        $_SESSION[$key] = $value;
    }
    public function get($key) {
        return $_SESSION[$key];
    }
}

class User {
    protected $session;

    public function __construct($session) {
        $this->session = $session;
    }
    public function setName($name) {
        $this->session->set('name', $name);
    }
    public function getName() {
        return $this->session->get('name');
    }
}

$session = new Session("MOJA_SESJA");
$user = new User($session);
$user->setName("moj_login");
echo $user->getName();

?>

Klasa Session udostępnia obiektowe API do obsługi sesji. Obiekt tej klasy jest przekazywany w konstruktorze obiektu klasy User, gdzie jest dalej wykorzystywany. Jest to właśnie wstrzykiwanie zależności, czyli nie tworzymy instancji obiektu w danej klasie, tylko przekazujemy go przez konstruktor/metodę.

Dlaczego takie rozwiązanie jest lepsze niż:

$this->session = new Sessioon($parametrKonstuktora);

Parametr ten na dobrą sprawę nie dotyczy obiektu klasy User – jest „sztucznie” dodany. Zdecydowanie przejrzyściej i wygodniej jest zdefiniować obiekt poza klasą i przekazać już gotowy, w pełni skonfigurowany przez nasze parametry. Poza tym przy zmianach parametrów konstruktora musielibyśmy za każdym razem modyfikować wszystkie klasy inicjujące obiekt danej klasy.

Zastosowanie

Wszędzie tam, gdzie występują zależności między obiektami.

Powiązane tematy

Co sądzisz o wpisie?
BeżnadziejnySłabyŚredniDobryBardzo dobry (2 głosów, średnia ocen: 5,00 z 5)
Loading...
  • Opis teoretyczny: loose/tight/strong coupling, interfejsy, type hinting :)

  • Powinno być:
    public function __construct( Session $session );