Архив рубрики: ООП

Паттерн Decorator

В больших проектах, особенно где ядро должно оставаться стабильным зачастую требуется изменения поведения объекта рантайм без дописывания кода в сам класс. Есть несколько вариантов, в этот раз я продемонстрирую паттерн Decorator (декоратор, wrapper, обёртка). Нам довелось активно использовать сей паттерн при разработке проета для IBM на базе Sugar CRM. В шуге заложено много гибкости, но некоторые части написаны очень очень давно и наружу торчит только Bean, который мы и декорировали чтобы добавить функционал или подменить стандартную реализацию. К сожалению, это не стало серебряной пулей и нам довелось хлебать кислые щи дырявой оловянной ложкой.Дырявая ложка Читать далее

Паттерн Money.

Все знают вредные паттерны Singleton, Registry, MVC и т.д. Но есть очень полезный паттерн, который помогает нам зарабатывать и считать деньги, в то же время его не встретишь в популярных фреймворках.

Задача. Нужно считать деньги, выполняя с ними обычные математические операции.
Проблема. PHP как и многие языки страдает известной проблемой двоичного представления чисел. Для приведения десятичного числа к двоичному внутреннему используется деление на 2, соответственно числа вроде 1/3 округляются до энного знака.

Паттерн Money реализует работу с деньгами: математические операции (+, -, *, /), сравнения (>, <, >=, <=, ==, <>) и учёт курса обмена. Читать далее

Пример использования ArrayAccess

Мне недавно в блоге задали вопрос о применении ArrayAccess. Просто как замену массивам — глупо, тем более теряется производительность. Итак, для этого у нас две основные причины — set/get должны как-то влиять на значение переменных, вторая — объект может использовать данные помещённые в нём для других методов.

Рассмотрим примеры. У нас есть класс для работы с таблице из базы данных как с объектом. Читать далее

Смешиваем singleton и registry

Основное достоинство Одиночки одновременно является и его недостатком. Допустим у нас есть класс для работы с базой данных реализованный на singleton (о ужОс, нужно было хотя бы фабрику). Всё замечательно работает, пока в один непогожий день мы не придумываем держать данные в разных базах на разных серверах. Ну и этого геморроя нам мало, поэтому от возможностей мускула мы отказываемся. И приплыли… Соединение у нас то ОДНО. Отказываться от singleton и перелопачивать тонны кода тоже не с руки, значим поставим костыль. Читать далее

Паттерн: Singleton

Продолжая тему паттернов бегло расскажу что это за зверь singleton. На русский язык он переводится как «одиночка», относится к порождающим паттернам и позволяет нам плодить объекты, вернее всего один. Singleton гарантирует, что будет создан только один экземпляр класса. Для этого конструктор делается приватным и создаётся статический метод, который проверяет создан ли уже объект и возвращает нам этот объект. Читать далее

Конференция “Байнет 2.3 Gamma: в новом формате веба”

14-15-16 мая 2009.

Конференция “Байнет 2.3 Gamma: в новом формате веба” – одно из крупнейших событий Беларуси в области современных информационных технологий. В 2009 году пройдет в третий раз.

14 мая будет посвящено техническим вопросам современного интернета: программирование, верстка, веб-стандарты, проектирование интерфейсов, хостинг и т.п.

15 мая будет посвящено гуманитарным вопросам: блоггинг, интернет маркетинг и пиар, аналитика рынков, дизайн, презентация новых проектов, инвестиции и т.п.

16 мая станет специализированным днем по видео в интернете: интернет-трансляции, потоковое видео и сервисы для него, интернет-телевидение, съемка, монтаж и кодирование видео и т.п.

Участие в конференции БЕСПЛАТНОЕ.

Программа события здесь

Я буду учавствовать в конференции с докладом «Удобная работа с базами данных в PHP», который посвящён ORM, теория, реализация и более-менее подробно задержусь на Doctrine.

Компания microsoft открыла код MVC фреймворка для ASP.NET

К этому они шли очень долго, но никто не ждал такого финиша. Первые креативные мысли по созданию своей реализации MVC появились у разработчиков ещё в 2007 году, затем вышло несколько версий — превью, беты, релиз кандидаты. Но лишь в марте 2009 года состоялся настоящий релиз.

Если релиза ждали многие, то вот о том что это будет ещё не самая важная новость, догадывалось нороду мало. Недавно было объявлено, что фреймворк является открытым и распостраняется под открытой лицензией MS-PL.

Меня не прильщает ASP.NET, но посмотреть в исходники от корпорации тьмы я всё же решил, чего и другим советую. Качать здесь.

Ну и немного оффтопа. Microsoft превратилась в красную тряпку для многих айтишников, а быки как известно — дальтоники, им плевать на что бросаться. Не уподобляйтесь им, не всё творимое «чёрной» компанией является плохим. И от просмотра кода или знакомства с их продуктами Вы не превратитесь мгновенно в зомби.

Паттерн: Registry

Постараюсь расказать о моей реализации паттерна Registry под php. Registry — это ООП замена глобальным переменным, предназначеная для хранения данных и передачи их между модулями системы. Соответственно, его наделяют стандартными свойствами — запись, чтение, удаление. Вот типовая реализация. Читать далее

SPL в PHP: ArrayObject

Довольно неожиданно пришла идея довести начатый шаблонизатор до юзабельного вида, дописал хелперы, встроил кеширование, решил прицепить хелпер для формы. И здесь мне стало нехватать ООП стиля. Накидав кой-чего понял что вначале нужно написать цикл статей о SPL (Стандартной PHP библиотеке). Эта штука очень полезна при ООП стиле кодирования, а особо нормальных статей об SPL на русском я не обнаружил.

Начнёмс.

ArrayObject — предназначен для того, чтобы объект вёл себя как массив, даёт доступ к данным через квадратные скобки и позволяет делать foreach

ArrayObject implements IteratorAggregate , Traversable , ArrayAccess , Countable {
    /* Methods */
    ArrayObject::__construct ( mixed $input )
    void ArrayObject::append ( mixed $newval )
    int ArrayObject::count ( void )
    ArrayIterator ArrayObject::getIterator ( void )
    bool ArrayObject::offsetExists ( mixed $index )
    mixed ArrayObject::offsetGet ( mixed $index )
    void ArrayObject::offsetSet ( mixed $index , mixed $newval )
    void ArrayObject::offsetUnset ( mixed $index )
}

Данный класс имплементирует интерфейсы IteratorAggregate , Traversable , ArrayAccess , Countable

IteratorAggregate , Traversable — отвечают за гуляние по объекту, соответственно нужно реализовать метод getIterator. Эти вещи будем разбирать в другой раз.

Countable — нужно реализовать интерфейс для получения размера count.

ArrayAccess — это  квадратные скобочки — проверка существования offsetExists, получение значения — offsetGet, присвоение значения — offsetSet, уничтожение элемента — offsetUnset и добавление элемента — append.

Со скучной теорией покончено, сейчас практика

class Amdy_Array extends ArrayObject {
    protected $array;
    public function __construct($array) {
        $this->array = $array;
    }
    public function append($value) {
        $this->array[] = $value;
    }
    function offsetSet($key, $value) {
        if ($key) {
            $this->array[$key] = $value;
        } else {
            $this->array[] = $value;
        }
    }
    function offsetGet($key) {
        if ( array_key_exists($key, $this->array) ) {
            return $this->array[$key];
        }
    }
    function offsetUnset($key) {
        if ( array_key_exists($key, $this->array) ) {
            unset($this->array[$key]);
        }
    }
    function offsetExists($offset) {
        return array_key_exists($offset, $this->array);
    }

    public function dump() {
        var_dump($this->array);
    }
}

Так мы побыстрому создали свой обработчик, унаследовав класс из SPL. Что же там происходит.

В конструктор передаётся сам массив, его можно передать и позже, но не важно. Данный массив мы загоняем во внутреннюю переменную $this->array, дальше, мы описываем,  как должны обрабатываться запросы к объекту как к массиву. Т.е. все запросы будут реально относиться в переменно $this->array. Можно и вовсе не заводить эту переменную, а работать с атрибутами класса, если в коде заменить $this->array, на get_class_vars($this), $this->{$k} и т.д.

Простой пример использования.

$array = new Amdy_Array(
    array(
        'test',
        'test1' => array(0,1,2,3),
        2,
        'test4' => 'test2 value'
    )
);
$array[] = 'test2222';
echo $array[0] . '<hr/>';
echo $array['test4'] . '<hr/>';
$array->dump();

PHP не стоит на месте, потому, кое-что уже изменилось, постоянно добавляются новые классы, методы и интерфейсы, чтобы не изобретать свои велосипеды.

Flash сообщения 2

Как и обещал, вернулся к flash сообщениям. Переделаем его на статические методы. Итак, немножко теории.
Статические методы могут вызываться без создания экземпляра класса (объекта), при объявлении метода указывается ключевое слово static. Точно так же объявляется и статический атрибут класса. Читать далее