[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Структура приложения
twin
Оглавление.

Ну а теперь оставим лирику и перейдем непосредственно к практике. Начнем с простого, соберем гостевую книгу.

Предвижу возражения, что мол для таких маленьких систем можно и не задуряться с проектированием, что тут и так не нужна схема фреймворка, что вот когда дело дойдет до "больших проектов"... И так далее.

Уверяю, по такой схеме совершенно никакой разницы, маленькая гостевушка это или огромный интернет-магазин с социальной сетью впридачу. Принцип один. Котеджный поселок тем и хорош, что ограничен только площадью выделенной под него земли (читай: возмжностью сервера). Можно легко расширять его хоть за горизонт (заметьте - расширять, а не наращивать ввысь или в объеме).

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

Так вот. Рисуем предметную область:

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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

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

user posted image
twin
Теперь можно развернуть стройку.

Для сравнения: как обычно проектируется приложение в общепринятых правилах? Как я уже говорил - похоже на большое цельное здание.

1. Сначала фундамент - какой-либо фреймворк. Не важно, мэйнстримный или самописный.
2. Потом на нем возводится коробка с голыми стенами. Как принято говорить - организуются уровни абстракций.
3. Ну и отделка помещений. Непосредственно реализация функционала.

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

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

Изобретают правила, по которым пытаются унифицировать строительство. Главные из них - SOLID и GRASP.

Строят не стены, а сначала каркас, который потом можно обложить кирпичами под разными углами. Это называется "повышать уровни абстракций".

Используют типовые элементы строительства. В программировании - шаблоны или паттерны. Основные собраны в методичку GoF.

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


Мы пойдем другим путем. Строительство котеджного поселка происходит по иным законам.

1. Сначала производится разметка местности. Другими словами намечается структура будущего приложения. Это совсем не сложно, для этого даже не нужен проект по большому счету. Можно провести эту рекогонсцировку прямо на местности.
2. Потом организуется общая инфраструктура. Дороги, электро- и газовые подстанции, водоканал, охрана и прочая. В нашем случае система запуска (роутер, или скорее коммутатор), собираются необходимые библиотеки, организуется дебаггинг.
3. И вот только теперь начинается проектирование каждого отдельного котеджа (страницы). Часто бывает так, что и проектировать нечего. Если это типовая постройка или совсем маленький домик. Соответственно реализацию функционала даже не стоит выносить отдельным пунктом.

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

Сайчас полетят камни, мол это получится каша, мол в таком коде нивжись не разобраться, что даздравствует урбанизация, и что малоэтажное строительство - вчерашний день.

А вот и посмотрим, так ли это.

По порядку - пункт первый. Наметим структуру приложения. Пока она очень простая.

1. App - непосредственно скрипты приложения
2. Core - скрипты инфраструктуры и общие для приложения библиотеки
3. vendor - здесь сторонние библиотеки
4. www - публичная директория.

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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

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

user posted image
twin
Немного подробнее.

В дирректории App/ будут собраны скрипты, непосредственно генерирующие страницы. Контроллеры, модели, вьюшки, хэлперы и т.д.

В папке ядра Core/ будут собраны все библиотеки приложения. Они могут понадобиться при генерации разных страниц. Ну и еще несколько скриптов инфраструктуры. Автозагрузчик классов, коммутатор, роутер (если понадобится), конфигуратор и т.д. Тоесть то, без чего приложение останется просто набором файлов.

В папке vendor/ располагаются сторонние библиотеки и системы, которые мы захотим вдруг использовать на своем сайте. Это общепринятая практика, это удобно.

Ну а www/, это папка с доступом по HTTP. Можно назвать иначе, у меня привычка еще со времен Денвера.

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

Разница в управлении.
В схеме фреймворка, фреймворк управляет библиотеками и приложением.
В сборке приложение управляет библиотеками напрямую.

В процессе поймете разницу.

Ну а теперь можно приступить ко второму пункту, сиречь инфраструктуре.

Для начала нужна точка входа и автозагрузчик классов. С точкой входа все ясно, это банальный index.php в публичной папке.

А вот с автозагрузчиком сложнее. Что использвать: PSR-0, PSR-4, нашумевший автолоадер от композера или свой велосипед?

PSR-0 фиговцы сами объявили deprecated. PSR-4 не лишен смысла, но он немного однобок. Готовый из их примера по мне так еще и избыточен. В композере я вообще не вижу смысла. Мало того, что он монструозен, так с ним еще нужно возиться, как с неразумным дитятей. JSON прописывать, пересканировать файлы и т.д.

Так что я предпочитаю старый добрый KISS. Написать свой, аскетичный, но который будет решать все текущие задачи.

<?php

defined('BASE_PATH') or define('BASE_PATH', dirname(__DIR__));

spl_autoload_register(function ($class) {

$files[] = BASE_PATH .'/'. $class;
$files[] = BASE_PATH .'/vendor/'. $class;

foreach ($files as $file) {
$file = str_replace('\\', DIRECTORY_SEPARATOR, $file .'.php');

if (is_readable($file)) {
include_once $file;
break;
}
}
}
);


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

Для текущей задачи его достаточно, мы будем юзать немспейсы по рекомендации PSR-4. Кроме того, если потребуется другой стандарт, всегда можно зарегистрировать другой автолоадер, а потом вернуться назад. А может и не понадобится. Не будем нарушать святой YAGNI.

Теперь его нужно подключить к индексу:
index.php
<?php

require __DIR__ .'/../Core/Autoloader.php';

Вот тепрерь можно строить остальную инфраструктуру. Собирать библиотеки. Глядя на схему предметной области, можно понять, какие нам понадобятся:

1. Каптча
2. BB-декодер
3. Дерево
4. Пагинатор
5. Рейтинг

Но главное - база данных и дебаггер. О них чуть позже.

Организуем для библиотек структуру. Тут тонкость. Каждая библиотека должна располагаться в отдельной директории, даже если она состоит из одного файла. Это обусловлено несколькими причинами. Две основные:

1. Так проще организовать тестирование.
2. Если захочется заменить либу, то можно сделать адаптер. И тогда не нужно трогать приложение.

Ну и для порядка все их расположим в папке Libs/

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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

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

user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.