Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Структура приложения
twin  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15562
Пользователь №: 6543
На форуме: 8 лет, 2 месяца, 4 дня
Карма: 299

Трезвый :
5 лет, 11 месяцев, 13 дней


Оглавление.

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

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

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

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

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

Присоединённое изображение
Присоединённое изображение


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

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

Зачем ворошить старое, когда можно наворотить новое?

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15562
Пользователь №: 6543
На форуме: 8 лет, 2 месяца, 4 дня
Карма: 299

Трезвый :
5 лет, 11 месяцев, 13 дней


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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

Присоединённое изображение
Присоединённое изображение


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

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

Зачем ворошить старое, когда можно наворотить новое?

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15562
Пользователь №: 6543
На форуме: 8 лет, 2 месяца, 4 дня
Карма: 299

Трезвый :
5 лет, 11 месяцев, 13 дней


Немного подробнее.

В дирректории 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
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
TMake  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Журнал
Группа: Форумчанин
Завсегдатай форума
Сообщений: 3106
Пользователь №: 16333
На форуме: 7 лет, 11 месяцев, 20 дней
Карма: 58




Цитата (twin @ 2.09.2016 - 20:55)
2. Если захочется заменить либу, то можно сделать адаптер. И тогда не нужно трогать приложение.

можно все перенести в vendor, а в core оставить autoloader один и будет у тебя гарантированная полная заменяемость
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Arh  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



146%
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2109
Пользователь №: 27172
На форуме: 5 лет, 8 месяцев, 5 дней
Карма: 70




Я тоже не понял зачем к ядре маршрутизатор, пусть он даже будет жестко связан с системой, всё равно фактически это либа и она по сути не везде нужна, не всегда.
Уточню что в моём понимании ядро - это стартовый файл или набор файлов, который необходим для запуска системы.
Можно начать с файла конфигурации и автозагрузчика, хотя даже автозагрузчик можно инклюдить в index.php как внешний функционал, потому что в некоторых ситуациях даже он не нужен, но это уже крайность.


--------------------
:)
PMСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15562
Пользователь №: 6543
На форуме: 8 лет, 2 месяца, 4 дня
Карма: 299

Трезвый :
5 лет, 11 месяцев, 13 дней


Цитата (TMake @ 2.09.2016 - 18:27)
можно все перенести в vendor, а в core оставить autoloader один и будет у тебя гарантированная полная заменяемость

Будет, но какой в этом смысл? Гораздо интереснее отделить мухи от котлет. В Core/ будут находиться "велосипеды". Самописные, либо переработаные библиотеки, иногда узко заточенные именно под конкретное приложение. В vendor/ - либы сторонних разработчиков. Менять что-то в них - табу. Ну и обновления соответственно.

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

А поставщики - дело святое. Там апать что то - моветон.

Цитата (Arh @ 2.09.2016 - 18:57)
Я тоже не понял зачем к ядре маршрутизатор
А где там маршрутизатор ты увидел... Его пока нет. И очень долго еще не будет. Я его воткну в самом конце, дабы показать, что система легко расширяется и трансформируется.

Фронт-контроллер или коммутатор (как угодно) будет, но не более. Для начала я буду использовать девственно чистый GET. И никаких ЧПУ и маршрутов.


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

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

Зачем ворошить старое, когда можно наворотить новое?

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
killer8080  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 8737
Пользователь №: 26630
На форуме: 5 лет, 9 месяцев, 5 дней
Карма: 591




Цитата (twin @ 3.09.2016 - 04:42)
В vendor/ - либы сторонних разработчиков. Менять что-то в них - табу. Ну и обновления соответственно.

vendor/twin и меняй что хочешь, кто тебе запретил быть поставщиком wink.gif
И что изменилось от того, что ты роутер назвал коммутатором? Суть одна и та же, если у тебя приложение с общей точкой входа, значит есть и роутинг, даже если он не выделен в отдельную сущность или просто не нравится это слово.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15562
Пользователь №: 6543
На форуме: 8 лет, 2 месяца, 4 дня
Карма: 299

Трезвый :
5 лет, 11 месяцев, 13 дней


Цитата (killer8080 @ 3.09.2016 - 07:58)
vendor/twin и меняй что хочешь, кто тебе запретил быть поставщиком

Можно и так, если есть желание. Что прикольно в таком подходе - никаких рамок. Делай как тебе удобнее, но чтобы другим было понятно. И да прибудет с тобой сила smile.gif

На мой взгляд в vendor должны находиться опенсорсные либы. Эксклюзивным там делать нечего. Но это ИМХО.

Цитата (killer8080 @ 3.09.2016 - 07:58)
И что изменилось от того, что ты роутер назвал коммутатором? Суть одна и та же
Не скажи. Роутер разбирает URL и сопоставляет его с маршрутами. Коммутатор (ну или фронт-контроллер) подключает нужный функционал в зависимости от результата работы роутера. Если использовать чистый GET, без ЧПУ, то роутер не нужен вовсе. Фронт-контроллер и без него справится.


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

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

Зачем ворошить старое, когда можно наворотить новое?

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
TMake  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Журнал
Группа: Форумчанин
Завсегдатай форума
Сообщений: 3106
Пользователь №: 16333
На форуме: 7 лет, 11 месяцев, 20 дней
Карма: 58




Цитата (twin @ 3.09.2016 - 12:48)
На мой взгляд в vendor должны находиться опенсорсные либы. Эксклюзивным там делать нечего. Но это ИМХО.

Для тебя эксклюзив, для всех остальных твой core это опенсорсная либа. Что конкретно ты там решил отделять не понятно, весь vendor будет забит аналогичными эксклюзивными либами.
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15562
Пользователь №: 6543
На форуме: 8 лет, 2 месяца, 4 дня
Карма: 299

Трезвый :
5 лет, 11 месяцев, 13 дней


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

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

Впрочем повторюсь. Если есть желание, можно все либы разместить в vendor. На работоспособность это вообще не повлияет. Свобода выбора - понад усе.

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


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

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

Зачем ворошить старое, когда можно наворотить новое?

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса