| |
2 гораздо сложнее, чем рис. 30.1. Его
"загруженность"
объясняется тем, что трехуровневая схема более, чем это может показаться с
первого
взгляда, сложна и универсальна по сравнению с двухуровневой. Обратите внимание
на то, что практически все связи стали двусторонними, а циклические — исчезли.
Это
позволяет работать блоком более независимо, чем для случая двухуровневой модели.
А значит, работу над сценарием можно распределить по нескольким исполнителям
более эффективно, — к чему мы и стремились.
Единственный блок программы, который не связан с другими двусторонними
связями, — файл конфигурации системы. Это неудивительно, ведь конфигу-
рация содержит лишь набор определений констант и переменных, которыми
пользуются все остальные блоки схемы. Впрочем, стрелка, ведущая из блока
конфигурации в шаблон страницы, хотя и может существовать без особых по-
следствий, все-таки иногда выглядит несколько нелогично. Рекомендуется так
строить сценарии, чтобы шаблону не требовалась информация о конфигура-
ции. Он должен обращаться только к данным, сгенерированным интерфейсом.
Часть V. Приемы программирования на PHP 426
Генератор данных
Шаблон
страницы
Пользователь
Интерфейсная
часть
программы
Ядро
Конфигу-
рация
Рис. 30.2. Трехуровневая схема
Интерфейс
Как можно заметить из листинга 30.4, интерфейс сценария гостевой книги стал
гораздо
проще, чем это было с генератором данных из листинга 30.2. Файл, в котором
содержится
его код, называется точно так же, как и файл генератора. Это и не удивительно:
"снаружи"
интерфейс выглядит как полноценный генератор данных, а о существовании ядра
шаблон
даже и не "подозревает".
Листинг 30.4. Интерфейс: gbook.php
include "kernel.php"; // Загружаем ядро.
$Book=LoadBook(GBook); // Загрузка гостевой книги.
// Обработка формы, если сценарий запущен через нее.
if(!empty($doAdd)) {
// Добавить в книгу запись пользователя.
$Book=array(time()=>$New)+$Book;
// Записать книгу на диск.
SaveBook(GBook,$Book);
}
// Загрузка шаблона не нужна — теперь, наоборот, шаблон
// вызывает интерфейс.
Глава 30. Код и шаблон страницы 427
?>
Как видим, интерфейс занимается только той работой, для которой он и предназна-
чен: выступает "посредником" между ядром и шаблоном. Самым первым загружается
ядро — файл kernel.php (я люблю так его называть). Дальше осуществляется ис-
ключительно обработка и "расшифровка" входных данных и формирование выход-
ных.
Ядро
Ядро — это самая ответственная, но, на мой взгляд, в то же время и самая
скучная
часть работы программиста. Действительно, оно напрямую не взаимодействует с
шаблоном страницы, а значит, не имеет права "общаться" с пользователем.
Ядро в идеале должно содержать лишь набор функций, которые позволяют исчерпы-
вающим образом работать с объектом программы. В этом смысле идеально его объ-
ектно-ориентированное построение. Об объектно-ориентированном программирова-
нии на PHP будет вкратце рассказано в главе 31, а пока не будем усложнять и без
того
"скользкую" задачу и посмотрим, что представляет собой ядро нашей гостевой
книги
(листинг 30.5).
Листинг 30.5. Ядро: kernel.php
// Загружаем конфигурацию.
include "config.php";
// Загружает гостевую книгу с диска. Возвращает содержимое книги.
function LoadBook($fname)
{ $f=@fopen("gbook.dat","rb");
if(!$f) return array();
$Book=Unserialize(fread($f,100000));
fclose($f);
return $Book;
}
// Сохраняет данные книги на диске.
function SaveBook($fname,$Book)
{ $f=fopen("gbook.dat","wb");
fwrite($f,Serialize($Book));
fclose($f);
}
?>
Часть V. Приемы программирования на PHP 428
Действительно, здесь нет ничего, кроме определений функций и… еще одной инст-
рукции include (вздохните с облегчением — на этот раз последней). Она добавляет
конфигурационные данные нашей книги — всего лишь одну-единственную константу
GBook, оп
|
|