Использование паттеl 20420w2214u 8;нов в PHP
Популярные среди фанатов C++ и Java, паттеl 20420w2214u 8;ны (шаблоны) проектирования очень редко обсуждаются программистами на PHP. Однако они являются важной частью компьютеl 20420w2214u 8;ной науки. Более того, они применимы к любому языку, даже PHP.
Первой популярной книгой по паттеl 20420w2214u 8;нам проектирования была книга "Приемы объектно-ориентированного проектирования. Паттеl 20420w2214u 8;ны проектирования", написанная авторами Э. Гамма, Р. Хелм, Р. Джонсон, Дж. . Авторов окрестили "Банда четырех" (Gang of Four), из-за чего шаблоны, описанные в книге, стали называть GoF.
Определение паттеl 20420w2214u 8;на
Интуитивно мы узнаем паттеl 20420w2214u 8;ны при программировании в каждой строке кода. Используя массив, вы уже представляете оптимальную идиому для прохождения по нему. С тех пор, как в PHP появилось выражение foreach, оно стало моим любимым.
Другой пример. С более широкой точки зрения мы встречаемся с другой знакомой проблемой: куда в PHP-скрипт поместить функциональность. Большинство проектов требуют разделения функциональности на несколько модулей. Для простого информационного сайта хорошо подходит простая схема с использованием футеl 20420w2214u 8;ов и хедеров, включаемых в страницу.
В обоих примерах существует поставленная проблема и заученное решение. Условием определения паттеl 20420w2214u 8;на является наличие известного решения. Более того, после многократного использования решения, вы можете дать оценку побочным явления, плохим или хорошим, этого решения.
Формальное определения паттеl 20420w2214u 8;на проектирования состоит из четырех частеl 20420w2214u 1;:
дает нам удобный способ ссылаться на паттеl 20420w2214u 8;н. Описание проблемы дает набор условий, в которых паттеl 20420w2214u 8;н можно применять. Решение описывает общую стратегию по достижению наилучшего разрешения проблемы. В заключении, в паттеl 20420w2214u 8;не описываются следствия, которые возникают при применении паттеl 20420w2214u 8;на.
Решения на основе паттеl 20420w2214u 8;нов не очень изобретатеl 20420w2214u 3;ьны. Они не требуют использования загадочных фишек. Паттеl 20420w2214u 8;ны предоставляют надежные проверенные временем решения. Обычно они оптимизированы для повторного использования, а не для эффективности. Решения оптимизированные для производитеl 20420w2214u 3;ьности имеют преимущества в отдельных ситуациях и обычно не подходят для общего случая. Например, если вам надо получить сумму трех чисел, вы сделаете это одной строкой кода. Однако общий случай будет, скажем, сложение 10000 чисел, и для этого надо применять массив и цикл.
Паттеl 20420w2214u 8;ны тесно связаны с объектно-ориентированным проектированием. С помощью объектно-ориентированного программирования можно создавать достаточно общие модули, называемые объектами. Паттеl 20420w2214u 8;ны проектирования дают общее решение распространенных проблем. Это позволяет не изобретать велосипед.
Строго говоря, PHP нельзя назвать объектно-ориентированным языком. У нас есть структуры данных, которые объединяют методы и свойства, однако у нас нет защищенных переменных. Однако это не влияет на применимость ООП. Несколько паттеl 20420w2214u 8;нов будет рассмотрено ниже и будет показано, как обойти недостаток фишек ООП в PHP.
В книге GoF авторы указывают на то, что среда программирования влияет на то, что можно считать паттеl 20420w2214u 8;ном. Например, полиморфизм подходящий паттеl 20420w2214u 8;н для процедурных языков программирования, в то время как объектно-ориентированные языки, такие как Java, включают его как встроенное свойство.
Существует множество паттеl 20420w2214u 8;нов, которые можно было бы здесь привести, однако будут приведены несколько самых известных. Остальные вы можете исследовать самостоятеl 20420w2214u 3;ьно, благо книг по этой тематике достаточно. Надо сказать, что применение паттеl 20420w2214u 8;нов в PHP требует некоторых уловок.
Паттеl 20420w2214u 8;н " " (singleton) применяется в ситуациях, когда нужен единичный экземпляр класса. Применитеl 20420w2214u 3;ьно к PHP можно рассмотреть селектор, который вы используете на странице несколько раз. Вы можете создать большую глобальную переменную и запихать в нее HTML-код, однако вы не сможете в этом случае задавать, скажем, значение по умолчанию. То есть вам каждый раз придется писать новый код, что не является очень хорошим решением с точки зрения поддержки и развития ресурса.
Вместо использования глобальной переменной, паттеl 20420w2214u 8;н " " реализуется с помощью класса со статическим методом, который возвращает объект. Вы вызываете статический метод напрямую, без предваритеl 20420w2214u 3;ьного объявления экземпляра объекта. До последнего времени PHP не поддерживал статические методы. В приведенной ниже реализации паттеl 20420w2214u 8;на " " используется функция со статической переменной. Если вы используете последние версии PHP 4, то можете пользоваться нотацией class::method().
Ниже приведена реализация селектора выбора цвета, который содержит названия цветов. Реализация состоит из двух частеl 20420w2214u 1;: определение класса и вспомогатеl 20420w2214u 3;ьной функции, в которых и применен паттеl 20420w2214u 8;н " ". Вспомогатеl 20420w2214u 3;ьная функция может быть настроена для многих классов, чтобы преобразовывать их в " ". В других языках мы можем создать общий , от которого наследовать более специфичные.
<?php
// colorSelector
class colorSelector
/*
** Public
//установка значения по умолчанию
function setDefault($default)
//возвращение HTML-кода селектора
function getHTML()
$html .= ">$v</option>\n";
}
$html .= "</select>\n";
return($html);
}
//вспомогатеl 20420w2214u 3;ьная функция, которая реализует паттеl 20420w2214u 8;н " "
function getColorSelector($default)
$instance->setDefault($default);
return($instance);
?>
Комментарии в коде относитеl 20420w2214u 3;ьно public и private членов класса вставлены для информирования программистов. Заметьте, что конструктор сам по себе является private методом. Это является частью реализации паттеl 20420w2214u 8;на " ". Создавать экземпляр colorSelector может только метод getColorSelector. Если бы мы использовали Java, эта функция была бы статическим методом класса.
Ниже приведен пример использования паттеl 20420w2214u 8;на " ". В реальном проекте между двумя вызовами getColorSelector может быть несколько сотеl 20420w2214u 5; строк кода. Вызовы могут быть и в разных модулях. Это объясняет причину, по которой я просто не использовал еще раз ту же переменную $c.
<?php
// colorSelector
include_once('colorSelector.php');
//
$c = getColorSelector(1);
print($c->getHTML());
//продолжение формы
//вызываем другой селектор цвета
$c = getColorSelector(2);
print($c->getHTML());
?>
Паттеl 20420w2214u 8;н " " имеет некоторые преимущества по сравнению с глобальной переменной. Пока мы используем вспомогатеl 20420w2214u 3;ьную функцию, мы имеем только один экземпляр класса. Это позволяет избежать затрат при запуске и оптимизировать использование памяти.
Заключение функциональности colorSelector в класс хорошо иллюстрирует паттеl 20420w2214u 8;н, но может не совпадать с вашим стилем программирования. Вы можете достичь таких же результатов, выдернув методы из класса и создав отдельные функции. В данном случае вы должны будете перенести свойства класса value и default в getColorSelector.
|