Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Веб-разработка? Это просто! Пул данных


Новости... Ведущие разработчики браузеров планируют отказаться от привычной всем пользователям адресной строки. Что будет вместо нее? Приглашаем к обсуждению на нашем сайте.

Пул данных

Всем привет. Сегодня мы поговорим о пуле данных. Под словосочетанием "пул данных" частенько понимаются принципиально разные вещи. Например, система, которая имитирует пользовательский ввод данных и используется для автоматического тестирования какой-либо другой системы. Я же буду подразумевать под пулом данных некоторую программно-алгоритмическую структуру, предназначенную для хранения данных и работы с ними.

Итак, зачем вообще нужен пул данных? Основной принцип разработки софта - модульность. То есть мы стремимся к тому, чтобы минимизировать зависимости между классами, чтобы наша программа была не монолитным куском кода, а набором некоторых подпрограмм, которые можно комбинировать друг с другом, добиваясь гибкости и расширяемости системы. Понятное дело, такой подход - результат эволюции. И его преимущества сложно переоценить. Хотя бы тот факт, что в монолитной программе исправление какого-нибудь участка кода может запросто привести к веерным изменениям по всему монолиту, в то время, как в хорошо продуманной модульной структуре любые изменения останутся локальными, главное только сохранить формат и логику входных и выходных параметров.

Проблема заключается в следующем - большую модульную систему могут разрабатывать не то, что разные отделы внутри одной компании, а и вообще разные компании. При этом, каждый модуль будет замечательно работать, но все эти модули будут работать с данными в разных форматах. Я сейчас объясню, что я имею ввиду. Считается, что системе достаточно быть хорошо задокументированной, чтобы избежать этих проблем. Фактически, происходит следующее.

Допустим, есть набор некоторых данных и несколько хорошо задокументированных классов.

$data = array();
$data['a'] = 1;
$data['b'] = 2;
$data['c'] = 3;
$data['d'] = 4;
class A
{
private $a = 0;
private $b = 0;
public function __construct($a, $b)
{
$this->a = $a;
$this->b = $b;
}
public function process_data()
{
//.......
}
public function return_data()
{
$arr = array();
$arr['a'] = $this->a;
$arr['b'] = $this->b;
return $arr;
}
}
class B
{
private $arr = array();
public function __construct($a, $b)
{
$this->arr['a'] = $a;
$this->arr['b'] = $b;
}
public function process_data()
{
//.......
}
public function return_a()
{
return $this->arr['a'];
}
public function return_b()
{
return $this->arr['b'];
}
}
class C
{
private $arr = array();
public function __construct($arr)
{
$array = array();
$array[0]['c'] = $arr['c'];
$array[1]['d'] = $arr['d'];
$this->arr[0]['a'] = $arr['a'];
$this->arr[0]['b'] = $arr['b'];
$this->arr[1]['xxx'] = $array;
}
public function process_data()
{
//.......
}
public function return_data()
{
return $this->arr;
}
}

Colored with dumpz.org

Ну как, осознали? А теперь представим, что у нас есть таких классов не три, а триста. Все эти классы работают абсолютно нормально. Они все получают некоторый набор данных, обрабатывают его и возвращают результаты. Результаты могут содержать уже изменённые данные, могут содержать первоначальные данные, а могут вообще не содержать никаких данных. Точно та же картина и при инициализации этих классов - данные всё те же, а форматы инициализации объектов разные. В реальной программе такое может произойти, например, с личными данными пользователя. Может существовать много классов, которым нужно использовать данные пользователя. Какой-то класс запросит все данные. Какому-то будет достаточно только электронного адреса и он запросит в конструкторе инициализацию объекта строковой переменной. Одно дело, если вы в существующей системе создаёте новый класс, берёте данные из базы и как-то их обрабатываете. Совсем другое, когда вы вынуждены пользоваться уже обработанными данными и возникает ситуация, когда из нескольких объектов нужно получить одни и те же данные, и у этих данных разный формат. Конечно же вы получите, обработаете и вернёте данные. Снова в новом формате. И так до бесконечности. Рано или поздно, поддерживать систему станет практически невозможно. Даже если всё отлично задокументировано.

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

Во-первых, нужно всё таки убедиться, что архитектура построена так, что пул данных действительно доступен для любого объекта. Просто чтобы данные в пуле и данные в произвольном порядке не жили рука об руку в одной и той же программе.

Во-вторых, обычно подразумевается, что если данные попали в пул, то их больше можно не проверять. Действительно, пул данных - это не мусорка. Данные должны быть проверены, провалидированы и верифицированы перед записью в пул. Тогда, в любой точке программы, можно получить точные данные, не заботясь о том, кто их туда положил.

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

В-четвёртых, нужно чётко понимать, что пул данных - это не мусорка, а поэтому не стоит хранить в нём временные переменные. Например, такое использование пула данных является недопустимым -

class A
{
private function foo()
{
$a = 5;
$data_pool->set_data($a);
}
private function bar()
{
$a = $data_pool->get_data('a');
//$a == 5;
}
}

Colored with dumpz.org

И в-пятых, сам пул данных не имеет права данные изменять. Что положили, то и забрали. Хотя, если некоторый класс считает, что данные в пуле устарели и решает их перезаписать, пул должен с этим согласиться.

Кроме этого, пул данных может содержать массу других особенностей, зависящих от конкретного проекта, а именно - мы можем ввести систему приоритетов и запретить чтение и/или запись данных объектам, которые не могут иметь доступа к этим данным; мы можем хранить данные в базе, в файле или в массиве; мы можем сделать пул объектом, а можем предоставить несколько глобальных функций. В общем, архитектура пула зависит от вашей задачи.

Но хватит слов и перейдём к делу. Давайте разработаем простенький пул данных, который будет иметь уровни доступа и предоставлять пользователю операции записи и чтения. Итак, у меня получилось следующее -(Исходный код примера "Пул данных" на PHP вы можете загрузить по ссылке Пул данных. Реализация на PHP.)

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

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

Другие интересные статьи, посвященные веб-разработке, расположены на сайте "Веб-разработка? Это просто!". Добро пожаловать.


В избранное