Transcript Javascript

Проектирование новой платформы
для разработки веб-приложений
Основные проблемы и решения
Постановка цели
Цель проекта – создать новую платформу
для разработки веб-приложений, которая
станет основой для всех продуктов
нашей компании на ближайшие 3-5 лет.
На этой платформе можно построить как CMS,
так и прикладные решения для автоматизации
бизнеса (CRM, управление проектами,
документооборот, Service Desk)
Задача №1: обеспечить независимость от БД
Решение: создать класс, через который будет осуществляться
работа с базой данных.
От абстрактного класса sql наследуются классы mysql, pgsql и др.,
каждый из которых учитывает специфику соответствующего сервера.
Класс, при необходимости, автоматически корректирует синтаксис
запросов, которые пишутся в стандарте MySQL.
Класс, в т.ч., содержит методы:
last_insert();
date_format();
list_fields();
На уровне SQL-сервера создаются хранимые функции,
абстрагирующие пользователя от деталей реализации, такие как:
IFNULL
UNIX_TIMESTAMP
YEAR, MONTH, DAYOFMONTH
… и другие
Задача №2: использовать разные
шаблонизаторы
Решение: Каждый объект системы, имеющий шаблон
(страница, интерфейс, программный модуль) может иметь
шаблон в своем формате. В настоящее время поддерживается
шаблонизатор XSLT, и шаблонизатор собственного синтаксиса.
При этом подготовка данных для слияния с шаблоном не зависит от того,
какой именно формат имеет шаблон объекта. Для объектов, имеющих
шаблон в формате XSLT, перед парсингом производится сериализация
в XML, для шаблонов собственного формата данные берутся
непосредственно из объекта PHP.
Задача ближайшего будущего: компилирующий шаблонизатор.
Сериализация в XML
PHP-объект
Результат сериализации
class first {
<first>
<one>Test</one>
<twos>
<two index="0">
<name>alpha</name>
<value>a </value>
</two>
<two index="1">
<name>beta</name>
<value>b</value>
</two>
</twos>
<three classname=“second”>
<value>nested</value>
<arrs>
<arr index="0" value="1"></arr>
<arr index="1" value="2"></arr>
</arrs>
</three>
</first>
public $one,$two,$three;
function first() {
$this->one="Test";
$this->two=Array(
Array("name"=>"alpha","value"=>"a"),
Array("name"=>"beta","value"=>"b"));
$this->three=new second;
}
}
class second {
public $value,$arr;
function second() {
$this->value="nested";
$this->arr=Array(1,2);
}
}
Шаблонизаторы
PHP-объект
IML-шаблон
Class test {
public $language,$success,$items;
function test() {
$this->$language=new lang;
$this->success=true;
$this->items=
Array(
Array(“name”=>one),
Array(“name”=>”two”));
}
{!language\hello}.<br/>
{?success}<b>{!language\congrat}
</b>{?/success}<br>
<ul>
{:items}
<li>{!name}</li>
{:/items}
</ul>
Class lang {
public $hello, $congrat;
function lang() {
$this->hello=“Hello, world!”;
$this->congrat=“Congratulations!”;
}
}
<xsl:value-of
select=“language/hello”/>.<br/>
<xsl:if test=“success”><b>
<xsl:value-of
select=“language/congrat”/>
</b></xsl:if><br/>
<ul>
<xsl:for-each select=“items/*”>
<li> <xsl:value-of select=“name”/>
</li>
</xsl:for-each>
</ul>
HTML-результат
Hello, world!
Congratulations!
• one
• two
XSLT-шаблон
Задача №3: дать возможность использовать
стандартные элементы интерфейса
Решение: Создать специальный вид программного объекта –
«интерфейс», который представляет собой орган управления
или стандартную форму. Каждый интерфейс имеет PHP-класс,
подготавливающий и обрабатывающий данные, и шаблон.
Страница справочника «Клиенты»
Список записей
Интерфейс
Форма свойств клиента
Интерфейс
Ссылки
Интерфейс
ListControl
StandardForm
Links
ООО «Альфа»
ООО «Бета»
ООО «Гамма»
Название: ООО «Альфа»
Телефон:
111-22-33
ООО «Бета»
- дочерняя
организация
Добавить
Сохранить
Интерфейсы могут обновляться по отдельности, без парсинга всей страницы
Задача №4: обеспечить возможность
расширения функциональности модулей
Решение: Расширение функциональности модуля
или интерфейса производится путем:
А) Наследования PHP-класса от базового класса модуля,
Б) Расширения шаблона при помощи механизма каскадирования
шаблонов.
Class clients extends _data_module {
…
}
Class clients_special extends clients {
…
}
Задача №5: обеспечить возможность хранения
наборов значений для каждого поля
Решение: организовать структуру данных и программных объектов
соответствующим образом.
Задача №6: дать возможность работать
с данными как с объектами (пред-ORM)
Решение: родительский класс программных модулей содержит методы,
позволяющие работать с его данными как с объектом.
Class clients extends _data_module {
…
function suspend() { … }
}
$client=LoadAppModule("clients");
$client->Load("");
$client->name["new"]="ООО «Альфа»";
$client->stage["new"]=1;
$cid=$client->Create();
$ind=$client->GetIndexes();
$client->name[$ind[0]]="Общество с ограниченной ответственностью
«Альфа»";
$client->suspend();
$client->Delete();
Задача №7: обеспечить возможность
репликации данных
Решение: В структуре таблиц БД для каждой записи хранится версия.
Каждый сервер БД может работать в режиме master или slave.
На каждом сервере slave ведется лог операций, который
при синхронизации передается на master, там происходит
его применение (с контролем конфликтов), обратно возвращается
разница между текущими состояниями БД на master и slave.
Контроль версий записей и логирование осуществляются
при помощи триггеров на таблицах.
Задача №8: обеспечить многоязычность
хранимых данных и интерфейса
… Об этом – в следующем докладе!