Wydzielanie złożonych funkcji np do jednej klasy co ukrywa szczegóły i pozwala w łatwy sposób uruchamiać złozone funkcjonalności.
Wyobraźmy sobie, że struktura i treść kodu są jeszcze bardziej złożone i że przez to nie ma szans na ich przepisanie na własną rękę — pozostaje nam jedynie korzystanie z rozwiązania kalekiego, ale gotowego. Aby skonwertować plik o zawartości: 234-bluza_damska 55 532-kapelusz_męski 55 na postać tablicy obiektów, musimy wywołać wszystkie z prezentowanych funkcji (dla uproszczenia pomijamy przy tym wyodrębnianie z pliku liczby kończącej wiersz, reprezentującej cenę artykułu):
<?php
$lines = getProductFileLines('test.txt');
$objects = array();
foreach ($lines as $line)
{
$id = getIDFromLine($line);
$name = getNameFromLine($line);
$objects[$id] = getProductObjectFromID($id, $name);
}
Jeśli będziemy w swoim projekcie stosować powyższą procedurę odczytu plików, zwiążemy ściśle kod projektu z kodem podsystemu wczytywania plików. Jeśli potem ów podsystem ulegnie zmianom albo zdecydujemy się na skorzystanie z innego podsystemu w jego miejsce, staniemy w obliczu problemu rozległych modyfikacji kodu projektu. Trzeba by więc powołać do życia bramkę pomiędzy tym podsystemem a resztą projektu.
Implementacja Oto prosta klasa udostępniająca interfejs do kodu proceduralnego, z którym borykaliśmy się w poprzednim punkcie:
<?php
class ProductFacade
{
private $products = array();
function __construct($file)
{
$this->file = $file;
$this->compile();
}
private function compile()
{
$lines = getProductFileLines($this->file);
foreach ($lines as $line)
{
$id = getIDFromLine($line);
$name = getNameFromLine($line);
$this->products[$id] = getProductObjectFromID($id, $name);
}
}
function getProducts()
{
return $this->products;
}
function getProduct($id)
{
if (isset($this->products[$id]))
{
return $this->products[$id];
}
return null;
}
}
Z punktu widzenia użytkownika tego kodu dostęp do obiektów Product generowanych na podstawie pliku rejestru produktów jest znacznie uproszczony:
$facade = new ProductFacade('test.txt');
$facade->getProduct(234);