post_ico4

Wzorce projektowe, cz. 4 Property

Property to wzorzec projektowy, którego zadanie, jest przechowywać i udostępniać dane w obrębie aplikacji. Implementacja wzorca zastępuje globalne zmienne jakże nielubiane w dobie programowania obiektowego. Brzmi znajomo? Wzorzec ten ma zbliżone zastosowania do Singletona. Jednak tu nie tworzymy obiektu – wszystkie metody są statyczne.


Diagram klas wzorca Property

Wszystkie dane trzymamy w tablicy array. Za pomocą metod set() i get() możemy ustawiać/pobierać dane. Poza tym możemy zaimplementować inne metody kontrolujące np. dostęp do zmiennych.

Przykładowa implementacja

<?php
class Property{
    private static $array = array();

    public static function set($name, $value) {
        self::$array[$name]=$value;
    }
    public static function get($name) {
        return self::$array[$name];
    }
    public static function exist($name) {
        return isset(self::$array[$name]);
    }
}

//testy
Property::set("nazwa1", 1);
Property::set("nazwa2", "wartosc");
echo Property::get("nazwa2"); // wyswietli "wartosc"
echo Property::exist("nazwa1"); // wyswietli "true"
echo Property::exist("nazwa3"); // wyswietli "false"
?>

Przykład z życia wzięty

Rozważmy klasę zawierającą konfigurację aplikacji.

<?php
class Config{
    private static $conf = array();

    public static function set($name, $value) {
        self::$conf[$name]=$value;
    }
    public static function get($name) {
        return self::$conf[$name];
    }
    public static function exist($name) {
        return isset(self::$conf[$name]);
    }
}

//testy
Config::set("language", "pl");
Config::set("path", "/jakas_sciezka/");
echo Config::get("language"); // wyswietli "pl"
echo Config::get("path"); // wyswietli "/jakas_sciezka/"
echo Config::exist("language"); // wyswietli "true"
?>

Klasa Config zawiera tablicę conf z podstawowymi ustawieniami aplikacji. Dzięki zastosowaniu pola statycznego zmiana ustawień w jednym miejscu (np. zmiana języka na stronie przez użytkownika) jest „widoczna” w każdym miejscu aplikacji.

Zalety i wady

Zalety:

  • Globalny dostęp do zmiennych wraz z dobrodziejstwami jakie daje programowanie obiektowe.
  • Wygodne API do ustawiania/pobierania danych, które muszą mieć dostęp globalny.

Wady:

  • Nie znam żadnej :)

Zastosowanie

Property można wykorzystać do przechowywania konfiguracji aplikacji.

Powiązane tematy

Co sądzisz o wpisie?
BeżnadziejnySłabyŚredniDobryBardzo dobry (Brak ocen, bądź pierwszy!)
Loading...
  • Jak zamienisz miejscem wady z zaletami, to będzie już wszystko ok:)

    Używanie globalnych obiektów (klas) i implementacja wzorców, które ich używają, to rozwiązanie dla leniwych programistów, którym nie chce się poświęcić odrobiny czasu i wysiłku na przemyślenie zależności pomiędzy klasami.

    „Bo przecież to może mi się przydać wszędzie”, „Bo klasy A, B i C MUSZĄ mieć dostęp do zawartych w tych klasach danych, a same niewiele mają ze sobą wspólnego” itp. itd.
    Te wszystkie argumenty wydają się przemawiać ZA stosowaniem tych ‚wzorców’, jednak jest pewien problem. Kiedy takie argumenty się pojawiają, to wiedz, że coś jest źle w Twoim kodzie. Jeżeli wszystko jest ok, to nie ma powodów do ich (‚wzorców’) używania.

  • Hmm tylko, że np. konfigurację lepiej trzymać w globalnej strukturze. Trochę bezsensu jest tworzyć za każdym razem obiekt jak chcę odczytać np ścieżkę dostępu.

  • starach

    No i TDD idzie się kochać*. Nie musisz tworzyć obiektu za każdym razem kiedy coś tam. Od tego są takie wzorce jak DI, DIC czy mój ulubiony Context.