Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

web - tec / PHP 5 для начинающи

.pdf
Скачиваний:
72
Добавлен:
12.06.2015
Размер:
26.79 Mб
Скачать

522 Глава 13

Сначала следует создать классы, представляющие три различных вида контактной информации ++++++ почтовых адресов, e+mail+адресов и номеров телефонов. Ниже описа+ ны свойства этих классов.

Класс

Свойства

 

 

Address

street1

 

street2

 

city

 

state

 

zipcode

 

type (например, домашний, рабочий и т.д.)

EmailAddress

email

 

type

PhoneNumber

number

 

extension

 

type

 

 

Эти классы только хранят и отображают данные, поэтому нет необходимости определять в настоящий момент какие+либо методы, следовательно, третья часть в обозначении каждого класса пуста. Все свойства общедоступны, поэтому в качест+ ве префикса используется знак ‘‘плюс’’. На рис. 13.2 показано UML+представление описываемых классов.

Address

 

Email

 

PhoneNumber

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 13.2.

Теперь следует спланировать классы Individual и Organization. Частное лицо имеет имя, фамилию, уникальный идентификатор (ID+поле из базы данных), набор e+mail+адресов, почтовые адреса, телефонные номера, название предприятия+ работодателя и название должности. Также должна присутствовать возможность до+ бавлять типы контактов. На рис. 13.3 показана UML+диаграмма класса Individual.

Организация имеет название, идентификатор, такие же наборы типов контактов, методы для добавления контактов и множество наемных работников. На рис. 13.4 по+ казана UML+диаграмма класса Organization.

 

 

 

 

Работа с UML и классами 523

 

 

 

 

 

 

 

 

Address

 

Email

 

PhoneNumber

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Individual

Рис. 13.3.

 

 

Address

Email

PhoneNumber

Individual

 

Organization

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 13.4.

524 Глава 13

Диаграмма показывает классы Individual и Organization, в которых имеются одинаковые свойства и методы. Обычно это свидетельствует о том, что можно сэко+ номить значительный объем работы и улучшить гибкость приложения, используя на+ следование. Можно создать еще один класс (в данном примере Entity), в котором будут объединены характеристики, общие для классов Individual и Organization, и позволить этим классам совместно использовать один и тот же код. В UML+ диаграмме свойства и методы указываются только для класса, который фактически их реализует. В данном случае необходимо переместить все общие свойства и методы классов Individual и Organization в прямоугольник, представляющий класс Entity (рис. 13.5). Свойства и методы повторяются в прямоугольнике дочернего класса, только если дочерний класс переопределяет их реализацию.

Address

 

Email

 

PhoneNumber

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Entity

Individual

 

Organization

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 13.5.

Здесь свойство name класса Entity переопределяется в классе Individual. Если в дальнейшем запросить значение свойства name для частного лица, то в ответ бу+ дет возвращено ‘‘lastname, firstname’’. Это позволяет передавать объекты классов Organization и Individual в одну функцию, которая лишь распечатывает имя, т.е. вместо двух отдельных функций используется одна.

В UML также определены символы для обозначения взаимосвязей. В данном приме+ ре необходимо показать, что классы Individual и Organization наследуют свойства и методы класса Entity. В UML+спецификации такая взаимосвязь называется обобщени* ем (generalization) и обозначается с помощью стрелки с не закрашенным наконечником, которая из дочернего класса (или классов) указывает на родительский класс (рис. 13.6).

 

 

 

 

Работа с UML и классами 525

 

 

 

 

 

 

 

 

Address

 

Email

 

PhoneNumber

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Entity

 

 

 

 

 

 

 

 

 

 

 

 

Individual

 

 

Organization

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 13.6.

Теперь ясно, что классы Individual и Organization наследуют класс Entity. Использование соединительных линий для обозначения наследования позволяет лег+ ко при беглом осмотре диаграммы понять, какие классы связаны друг с другом.

Часто приходится показывать другой тип соединения: класс Entity использует классы Address, Email и PhoneNumber. В UML+спецификации такая взаимосвязь на+ зывается агрегированием (aggregation) и обозначается с помощью черного ромбика на том конце линии, который присоединен к классу+пользователю (рис. 13.7). Исполь+ зуемые классы имеют свойство множественность (multiplicity), которое пока+ зывает, сколько раз они используются. В этом примере в классе Entity может при+ сутствовать один или несколько типов контактов, либо не быть ни одного. Для того чтобы обозначить это, над соединительной линией ближе к используемому классу не+ обходимо написать 0..*, чтобы показать, что класс может иметь 0 или больше указы+ вающих на него классов. Это обозначение показано на рис. 13.7. Увидев такую связь, разработчик может ясно представить, на какие части приложения повлияет измене+ ние того или иного класса. В данном случае изменение в классе Email, Address или

PhoneNumber повлияет на классы Entity, Individual и Organization.

526 Глава 13

Address

PhoneNumber

Entity

Email

 

 

 

 

 

 

 

 

 

 

 

 

Individual

 

 

Organization

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 13.7.

Объект класса Entity имеет телефонный номер (PhoneNumber), почтовый и e+mail+ адреса (Address и Email) и во всех трех случаях он может иметь ноль или более типов контактов. Поскольку классы Individual и Organization наследуют класс Entity, они оба также имеют ноль или более типов контактной информации.

Имея полную UML+диаграмму, можно начинать писать код, который будет управ+ лять разрабатываемым приложением. Если используемый UML+инструмент способен генерировать PHP+код, то можно автоматически получить первоначальные скелеты спроектированных классов. После этого пришлось бы только добавить бизнес+логику и обеспечить доступ к данным.

Другие полезные UML-диаграммы

Диаграммы классов не единственные UML+диаграммы, которые можно использовать при разработке или описании приложения. На самом деле существует 11 других типов диаграмм, позволяющих добиться определенного выигрыша. Рассмотрим кратко не+ сколько наиболее широко используемых диаграмм. В Internet+ресурсах и печатных ис+ точниках можно найти более подробные сведения об этих типах диаграмм и используе+ мых в них символах, а также о других диаграммах, определенных в спецификации UML.

Диаграммы активности

Диаграммы активности (activity diagrams) используются для планирования бизнес+ логики и решений, которые должно принимать приложение. Они особенно полезны при документировании сложных процессов принятия решений. На рис. 13.8 показана диаграмма действий довольно простого процесса принятия решения, который уже рассматривался в главе 12 при разборе классов Volunteer и RestrictedVolunteer.

Работа с UML и классами 527

Начало регистрации

Пользователь выбирает проект

Проект имеет

Да

Пользователь

Да

ограничения?

 

имеет ограничения?

 

Нет

 

Нет

 

Пользователь может

 

 

Пользователь не может

зарегистрироваться

 

 

зарегистрироваться

Рис. 13.8.

Эта диаграмма показывает, где принимаются решения (ромбики), необходимые действия (прямоугольники), а также начальное и конечное состояния (эллипсы) про+ цесса. При написании комплексного кода с условной логикой рекомендуется создать диаграмму действий для планирования и документирования кода.

Диаграммы ситуаций

Диаграмма ситуаций (use case diagram) иллюстрирует бизнес+процессы и их поль+ зователей. Это нетехническая диаграмма, она способствует пониманию задач при пе+ реговорах с клиентами.

В диаграммах ситуаций используется два базовых обозначения: актор (пользователь процесса) и ситуация (процесс). Актором обычно является класс пользователей при+ ложения. Например, крупный Web+сайт, как правило, содержит общедоступную об+ ласть и систему администрирования, которая позволяет определенным пользовате+ лям манипулировать содержимым сайта. В таком случае имеется два актора: администратор и пользователь. Администраторы изменяют и просматривают содер+ жимое сайта и создают различные отчеты. Пользователи только просматривают со+ держимое. На рис. 13.9 показана соответствующая диаграмма ситуаций.

На диаграмме представлены два актора, три ситуации и указатели на то, какие ак+ торы участвуют в той или иной ситуации. Такие диаграммы помогают понять роли и ответственность в приложении и перечислить бизнес+процессы, которые будет поддерживать приложение.

Диаграмма последовательностей

Диаграмма последовательностей (sequence diagram) показывает порядок опера+ ций для определенного процесса в приложении. Горизонтальная ось представляет жизненный цикл задействованных в процессе объектов, а вертикальная ось ++++++ поря+ док операций (первая операция находится вверху). Диаграмма такого типа показывает

528 Глава 13

от начала и до конца процесса объекты, сообщающиеся друг с другом, и передаваемые ими сообщения. На рис. 13.10 показан пример диаграммы последовательности для процесса изменения содержимого Web+сайта.

 

Изменение

 

 

содержимого

 

 

Просмотр

 

 

содержимого

 

Администратор

Формирование

 

 

Конечный

 

отчетов

 

пользователь

 

 

 

 

Web"сайт

 

Рис. 13.9.

 

 

 

AdminUser

ContentManager

Authenticator

DocManager

editPage

 

 

 

validate

 

 

AuthToken

 

 

 

saveDocument

 

 

 

success

 

success

 

 

Рис. 13.10.

 

 

 

Сплошные линии показывают сообщения, которые отсылаются объектам, пере+ численным вверху. Пунктирные линии показывают ответы этих объектов. Прямо+ угольники показывают начало и конец участия объекта в той или иной части последо+ вательности. Диаграмма показывает, что когда администратор редактирует страницу, класс ContentManager проверяет параметры доступа пользователя, создавая экземп+ ляр класса Authenticator и вызывая метод validate(). Этот метод возвращает метку аутентификации в форме объекта класса AuthToken. Затем диспетчер содер+ жимого просит класс DocManager сохранить документ. Метод saveDocument() воз+ вращает результат ++++++ success (успех) или failure (неудача) (в этом примере сохранение выполнено успешно) и этот результат передается администратору.

Работа с UML и классами 529

Диаграмма последовательностей упрощает планирование информационного об+ мена между объектами и документирует этапы выполнения заданного действия.

Приведенные выше примеры показывают, какими полезными могут быть UML+ диаграммы при проектировании приложения. Используя общий визуальный язык для представления различных понятий в программной системе, можно в доступной для по+ нимания форме передавать сложные идеи и документировать замысловатые процес+ сы. Стандартизация используемых обозначений гарантирует, что другие разработчи+ ки программного обеспечения смогут понять диаграммы и использовать их для создания описанного ими приложения.

Создание класса Entity

Теперь можно применить все полученные ранее знания для создания спроектиро+ ванного выше приложения ++++++ диспетчера контактов. Приложение предназначено для управления информацией о частных лицах и организациях и предоставляет пользо+ вателям возможность просматривать и редактировать контактную информацию. На рис. 13.11 показана UML+диаграмма диспетчера контактов.

Address

PhoneNumber

Entity

Email

 

 

 

 

 

 

 

 

 

 

 

 

Individual

 

 

Organization

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 13.11.

Класс Entity довольно понятен. Он должен хранить имя и идентификатор объек+ та наряду с массивами почтовых и e+mail+адресов и телефонных номеров. Этот класс не будет использоваться непосредственно. Он будет родительским классом для классов

530 Глава 13

Individual и Organization. Класс User, созданный в главе 12, хорошо подходит в качестве основы для класса Entity.

Создайте новый текстовый файл с именем class.Entity.php и введите в него следующий код, большая часть которого взята из класса User (хотя есть несколько важных изменений). Несмотря на то что этот пример кода довольно большой, он дос+ таточно прост. Полное объяснение класса приведено сразу после кода.

<?php

class Entity {

private $_properties; private $_changedProperties; private $_hDB;

private $_emails; private $_addresses; private $_phonenumbers;

public function __construct($entityID)

{

$this->_properties = array(); $this->_changedProperties = array();

$this->_properties['id'] = $entityID; $this->_properties['name'] = null; $this->_properties['type'] = null; $this->_properties['addresses'] = array(); $this->_properties['phonenumbers'] = array(); $this->_properties['emails'] = array(); $this->_properties['numberOfEmails'] = 0; $this->_properties['numberOfPhonenumbers'] = 0; $this->_properties['numberOfAddresses'] = 0;

$this->_hDB = mysql_connect('localhost', 'dbuser', 'mypassword');

$this->_init();

}

private function _init()

{

$this->_initUser(); $this->_initEmails(); $this->_initAddresses(); $this->_initPhones();

}

private function _initUser()

{

$sql = "select * from entities where entityid = $this->id";

$rs = mysql_query($sql, $this->_hDB); $row = mysql_fetch_assoc($rs);

$this->_properties['id'] = $row['entityid']; $this->_properties['name1'] = $row['name1']; $this->_properties['name2'] = $row['name2']; $this->_properties['type'] = $row['type'];

}

private function _initEmails()

Работа с UML и классами 531

{

//выбрать e-mail-данные...

}

private function _initPhones()

{

//выбрать данные о телефонах...

}

private function _initAddresses()

{

//выбрать данные по адресам...

}

function __get($propertyName)

{

if(!array_key_exists($propertyName, $this->_properties)){ throw new Exception('Неправильное значение свойства!');

}

}

if(method_exists($this, 'get' . $propertyName)){

return call_user_func(array($this, 'get' . $propertyName)); } else {

return $this->_properties[$propertyName];

}

}

 

function __set($propertyName, $value)

{

if(!array_key_exists($propertyName, $this->_properties)){ throw new Exception('Неправильное значение свойства!');

}

}

if(method_exists($this, 'set' . $propertyName))

{

return call_user_func(array($this, 'set' . $propertyName), $value);

} else {

//Если значение свойства действительно было изменено, //но еще не попало в массив changedProperties,

//то добавить его в этот массив. if($this->_properties[$propertyName] != $value && !in_array($propertyName, $this->_changedProperties)) {

$this->_changedProperties[] = $propertyName;

}

//Устанавливаем новое значение свойства $this->_properties[$propertyName] = $value;

}

}

function __toString()

{

return $this->name;

}

function getName()

{

return $this->_properties['name1'];

}

function setID($val)

{

Соседние файлы в папке web - tec