Кто писал свою CMS - есть вопрос

ONK

Пассивист PHPСluba
Popoff, по поводу универсальности модулей на примере новостей.
Новости могут автоматически генерироваться из нескольких разных источников данных, специфичных для конкретного проекта.
Для доступа к созданию, редактированию и т.п. новостей могут быть необходимы права специфичные для конкретного проекта и контролируемые не на уровне ядра, а на уровне прикладного кода.
Если в используемом наборе инструментов разработки СМS есть соответствующие инструменты, то на неспешное создание с нуля полноценной и достаточно функциональной ленты новостей может уйти всего 3-4 часа (при наличии т.з. и готового дизайна).
По этому, иногда создание с нуля подобных вещей является более простым решением, чем попытка адаптации ранее написанного специализированного модуля.
Разумеется, что при наличии готового многофункционального модуля и удобной, продуманной процедуры его инсталлирования, в случае удовлетворения требованиям Т.З. его выбор выглядит более разумным.
 

Popoff

popoff.donetsk.ua
ONK
по поводу генерации из разных источников - это действительно проблема. но проблема только в генерации: берем источник, берем оттуда новости, как-то парсим их... все остальное, вроде как, не меняется. как возможный вариант - делаем возможность генерации из разных мест и для каждого отдельного проекта говорим, что использовать генерацию оттуда, оттуда и оттуда. хотя это очень скользкий вопрос.

по поводу специфичных привилегий - можешь привести пример?
Разумеется, что при наличии готового многофункционального модуля и удобной, продуманной процедуры его инсталлирования, в случае удовлетворения требованиям Т.З. его выбор выглядит более разумным.
Я как раз и говорю о том, что лучше в одном проекте потратить (условно; тратить на самом деле не нужно, нужно всего лишь выработать хороший подход и во всех модулях его использовать) на день больше для продумывания процедуры инсталяции и расширения возможностей (например, добавления нового источника данных), а потом в нескольких проектах не тратить этих трех-четырех часов на создание всей ленты (а только на добавление этого нового источника). Тем более, что вопрос не только в 3-4 часах разработки, но и в дальнейшем сопровождении. Сопровождать один модуль новостей в десяти разных проектах всегда проще, чем сопровождать десять разных (хотя и похожих) модулей новостей.

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

Это я все к тому пишу, что в прошлый раз мне в ответ на "эту CMS можно использовать везде" сказали "выкинь такую CMS!". То есть вопрос на самом деле не в том, как создать универсальный модуль, а в том, нужно ли создавать универсальные модули вообще.

-~{}~ 28.12.05 17:04:

Проблема, видимо, в неправильной терминологии. "Универсальность" и "легкая расширяемость" - это разные вещи.
 

ONK

Пассивист PHPСluba
Popoff,
по поводу специфичных привилегий - можешь привести пример?
Как пример могу привести право создавать новостные сообщения в зависимости от внутреннего рейтинга пользователя сайта. Принципы расчета этого рейтинга основаны на внутренней бизнес логике проекта. Или наоборот временное лишение права создавать новые новости в зависимости от некоторых условий диктуемых той же специфической бизнес логикой. Надуманно, конечно, но для примера годится.

Можно привести кучу менее специфических условий, как например:
Право редактировать только собственные новости;
Ограничение активности некоторых пользователей;
Дифференцирование перечня разрешенных средств форматирования сообщения в зависимости от группы пользователя;
И множество других наворотов, которые теоретически можно один раз реализовать в сверх универсальном модуле и впоследствии использовать везде.

Почему я против большой универсальности?
Большая универсальность пытается охватить слишком широкую предметную область. В результате получается то, что жалко бросить и подсознательно стараешься использовать во всех проектах именно «это». Это приводит к тому, что для многих проектов надо дорабатывать имеющийся модуль внедрением в него специфической функциональности. А это приводит к появлению параллельных версий модуля, которые сопровождать может быть тяжелее, чем специализированно разработанные, т.к. при выявлении какой либо баги, или внесении какой либо важной модификации в один из модулей появляется необходимость каскадного обновления всех производных модулей.

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

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

Лично я пришел к тому, что используемый мной движок сейчас практически полностью "объектный", все мои библиотеки также написаны в ОО стиле. При этом за редким исключением весь мой прикладной код написан в процедурном стиле. Хотя трудно назвать процедурным стилем вызов функции модуля, в которой производятся операции над библиотечными объектами.
 

Popoff

popoff.donetsk.ua
Как пример могу привести право создавать новостные сообщения в зависимости от внутреннего рейтинга пользователя сайта. Принципы расчета этого рейтинга основаны на внутренней бизнес логике проекта. Или наоборот временное лишение права создавать новые новости в зависимости от некоторых условий диктуемых той же специфической бизнес логикой. Надуманно, конечно, но для примера годится.
Моя схема управления правами включает в себя уровень проверки возможностей, в который выносится все то, что не может быть проверено на уровне ядра. В частности, посчитан рейтинг или проверены эти самые условия. К системе проверки привилегий (к ядру) уровень проверки возможностей не имеет отношения.

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

Сами средства форматирования проверяются например, обсуждавшимся нами когда-то XML-фильтром.

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

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

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

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

Все универсально.
И множество других наворотов, которые теоретически можно один раз реализовать в сверх универсальном модуле и впоследствии использовать везде.
Видимо, моя система проверки привилегий и есть пример такого "сверхуниверсального модуля". Объем исходного кода (не считая интерфейсной части, только ядро, выполняющее непосредственные проверки и предоставляющее нужные в других модулях возможности) этого сверхуниверсального модуля аж 16 кб.
Почему я против большой универсальности?
Большая универсальность пытается охватить слишком широкую предметную область. В результате получается то, что жалко бросить и подсознательно стараешься использовать во всех проектах именно «это». Это приводит к тому, что для многих проектов надо дорабатывать имеющийся модуль внедрением в него специфической функциональности. А это приводит к появлению параллельных версий модуля, которые сопровождать может быть тяжелее, чем специализированно разработанные, т.к. при выявлении какой либо баги, или внесении какой либо важной модификации в один из модулей появляется необходимость каскадного обновления всех производных модулей.
Это очень важное замечание. Любую технологию можно использовать неправильно, и тогда от этой технологии будет больше вреда, чем пользы. Можно отказаться от оператора GOTO, но если при этом неправильно применять технологию структурного программирования, то полученный текст программы получится еще менее ясным, чем с этим оператором; собственно, этим часто и пользуются сторонники этого оператора (втайне рассчитывая на то, что их оппоненты тоже не владеют структурным программированием).

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

Я уже говорил о примере, в котором объединили службу новостей и форум. Это сделано, например, в системе дистанционного образования moodle. Те новости, которые Вы видите на главной странице - это первые сообщения в топика форума. Аннотация новости - это начало сообщения (или все сообщение, если оно короткое). Заголовок новости - заголовок топика. Рассылка новостей - для тех, кто подписался на новости темы. Хотя и есть что-то общее между службой новостей и форумом, мне все же кажется, что такая универсализация излишня.

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

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

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

У меня иногда складывается впечатление, что мы говорим об одном и том же, но все равно не понимаем друг друга. У меня возник вопрос по поводу:
Автор оригинала: 440hz
при больших проектах от стандартной CMS остается практически 0, т.к. всё приходится писать руками.
Что это означает?

Система управления аккаунатми пользователей, система управления привилегиями, служба новостей, служба упраления статьями (типа такой, которая использована в местном факе - phpclub.ru/faq/), служба почтовых рассылок, подсистема отладки, подсистема поддержки многоязычности, шаблонизатор, подсистема кеширования, подсистема динамической подгрузки данных, подсистема управления изображениями, модуль поиска, статистики, и еще многое и многое другое - это все претендует на звание "ноль" или это все нельзя сделать универсальным?

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

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

Эти стандартные модули претендуют на звание "ноль" или они не являются стандартными?

-~{}~ 28.12.05 21:42:

Я, кажется, понял. Нужно писать о том, каким образом достигается обратная совместимость?
 

flash-vkv

Новичок
ну вы профи и понаписали, а хотя топик наченался с простова.

давно просматриваю топики на тему cms. ишу кто как реализует то самое едро в 5кб.
А именно интересен тот момент при помоши чево связаваем данные из ядра к другим модулям.
я так понемаю в основном многие используют глобальные переменные, мне такая идея не совсем нравится потому ишу пока дальше.
в голове такая иде точнее две.
использовать ОПП и тоесть каждый модуль придоставляет в виде класса ограниченный набор интерфейса. К примеру свойства
obj.POST , obj.GET , и типа того
и метод
function Start()
и разбить классы по виду возрашаемой информации клааса методом Старт . те string, xmlobj и тд

давно мне не дает покое второй подход
некакие инклуде это один (ну или почти)
ядро обсалютно и безаговорочно отделено от остального два

как я виже это сделать но меня смушают вопросы скорости
сама идея: от юзера приходит запрос
урл, пост, гет, +еше
ядро определяет что нужно юзеру точнее какой интерфейс
делает HTTP запрос к интерфейсу, точнее не к самому интерфейсу а к прнимеру к скрипту (тотже php) но через HTTP
естественно , и как понемаете данны преходят от ядра к "модулю" по HTTP и обратно тоже
к примеру что может ядро
получило запрос определило что требуется
а) загрузить данные XML
б) загрузить данные XSL
В) соединить их и получаем то что ходели
к примеру еше
получило запрос определило что требуется
а) загрузить данные XML
б) этот хмл говарит из чего нужно собрать новый хмл
в) выводим новый хмл

ну далие в этом духе. и не обезательно работать с ХМЛ и другие форматы можно коммутировать

это моя идейка разограничения полномочи, а точнее в зависимости от юзера выводить ему соответственный субконт но и к CMS тоже относится

вобшем моя мысыль : связывать через ОПП или через HTTP

второй проигрывает в скоросте так как присутствует второй запрос HTTP но выигрывает в маштобируемости
второй в скорости
 

Popoff

popoff.donetsk.ua
связывать через ОПП или через HTTP
Либо ООП, либо HTTP - на выбор, одно из двух :)

-~{}~ 29.12.05 01:28:

Почему они сравнивают ООП и процедуры? Надо сравнивать ООП и HTTP :)
 

white phoenix

Новичок
Лучше сразу армян с грузинами сравнивать :D
ONK
> extract($_GET);
Избавляет от уязвимости:
PHP:
extract($_GET,EXTR_SKIP);
 

betik

Новичок
Хочу тоже записаться.
Сразу оговорюсь - речь идёт о сайтах класса от визиток до малых корпоративных сайтов. С бюджетом не более 1к USD и сроком создания под ключ дней в 10-12.
Именно тут я нашёл применение частоиспользуемым тривиальным модклям, таким как faq или лента новостей или гостевая книга или отправка вопроса из формы. То что есть на каждом сайте. Написав один раз я внёс максимальные возможности администрирования и настройки этих модулей, а код максимально закоментировал и сделал доку по своим функциям. В большинстве случаев хватает конфигурирования, а в редких случаях - 10 минут на исправления кода. Всё выполняется быстро и качественно, все (насколько это возможно) баги выловлены и уничтожены.
+ всё модули подцепляются к CMS копированием двух папок, админки и фронт-енда...
 

ONK

Пассивист PHPСluba
white phoenix, не по адресу.

Popoff, почитал, но так и не понял, откуда берётся алгоритм расчета рейтинга для проверки «возможностей». Если к модулю подключается некая дополнительная библиотека с процедурой подсчёта этого рейтинга, тогда понятно. Но в этом случае в модуле нужно каждый управляющий элемент обвешать «триггерами», чтобы иметь возможность его отключения при появлении такой гипотетической необходимости. Это путь к сверх универсальным модулям, своё мнение по которым я уже высказал.

Почитал про методы распределения прав в ядре твоего движка. Я в своё время отказался от идеи наследования прав и привилегий по иерархии модулей. С моей точки зрения это хоть и красивое решение, но оно у него есть серьёзные недостатки:
1. Уменьшение гибкости назначения прав доступа к модулю (если один из предков требует обязательного наличия некого права, то все модули, зависимые от него тоже требуют этого права для доступа к ним). От этого можно избавиться ценой усложнения ядра.
2. Необходимость сбора и проверки набора прав, для всех модулей являющихся предками вызываемого модуля, что не рационально.

У меня права доступа к модулю контролируются при поступлении запроса на его использование, а затем доступны в самом модуле в виде объекта пользователя, для дополнительных проверок.

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

У меня тоже привилегии различаются по именам. Странно? Не правда ли? Только вот право форматирования сообщений проверяется на стадии его создания в соответствии с правами пользователя создающего сообщения. В этот же момент происходит и само фильтрование html кода и дополнительное форматирование сообщения. Делать эти процедуры в момент показа сообщения не разумно как с точки зрения расходования ресурсов сервера, так и с точки зрения отсутствия необходимости постоянно делать ту работу, которую можно сделать один раз.
Я думал над необходимостью назначения различным группам прав пользователей различных наборов правил форматирования, но пока решил, что необходимости в этом нет. В любом случае наборы правил фильтрования/форматирования если и будет различаться, то совсем незначительно. Фактически у меня сейчас доступно только 3 варианта:
1. Только текст;
2. Текст форматированный специальными маркерами;
3. HTML код прошедший фильтр с форматированием текста специальными маркерами.

flash-vkv, пытался уловить мысль, понял что она есть, но не понял какая. -)
У тебя очень оригинальная идея вызова модулей. Думаю, что перед тем как за неё браться стоит ещё раз подумать.

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

Popoff

popoff.donetsk.ua
почитал, но так и не понял, откуда берётся алгоритм расчета рейтинга для проверки «возможностей». Если к модулю подключается некая дополнительная библиотека с процедурой подсчёта этого рейтинга, тогда понятно. Но в этом случае в модуле нужно каждый управляющий элемент обвешать «триггерами», чтобы иметь возможность его отключения при появлении такой гипотетической необходимости. Это путь к сверх универсальным модулям, своё мнение по которым я уже высказал.
Что значит "обвешивать триггерами"? Если управляющий элемент требует какой бы то ни было проверки, то там в любом случае будет стоять вызов какой-то функции, которая будет что-то проверять. Или можно как-то реализовать эту же функциональность, не проверяя? Или я что-то не так понимаю?

К системе распределения привилегий идет обращение только через уровень проверки возможностей. Система привилегий - это что-то похожее на методы с уровнем доступа protected, а процедуры уровня проверки возможностей - похожи на методы с уровнем доступа public. Хотя в текущей реализации и есть возможность вызова непосредственно методов системы привилегий, так все же делать не следует: даже если уровень проверки возможностей ничего не делает, специальная функция все равно есть.

Отличие простой проверки привилегий от проверки с учетом рейтинга состоит только в устройстве одной функции уровня проверки возможностей. Больше ничего не меняется.

Если сравнивать с реализацией, в которой рейтинг вообще не учитывается - то да, отличий много, нужно везде ставить вызовы функций для проверки возможностей. Если сравнивать версию, которая всегда проверяет рейтинг с универсальной версией, то отличие - только в устройстве одной функции.
Я в своё время отказался от идеи наследования прав и привилегий по иерархии модулей.
У меня права не наследуются по иерархии модулей. Система привилегий ничего не знает об иерархии модулей, она знает только строку с буквами и точками.
С моей точки зрения это хоть и красивое решение, но оно у него есть серьёзные недостатки:
1. Уменьшение гибкости назначения прав доступа к модулю (если один из предков требует обязательного наличия некого права, то все модули, зависимые от него тоже требуют этого права для доступа к ним). От этого можно избавиться ценой усложнения ядра.
Нету у меня такого. Я соглашусь с тем, что интерфейс моей системы привилегий не слишком удобен в использовании (имена привилегий прописываются в виде строк, а не выбираются галочками), но гибче, чем у меня, я пока что ничего не видел.
2. Необходимость сбора и проверки набора прав, для всех модулей являющихся предками вызываемого модуля, что не рационально.
Не рассматривается у меня иерархия модулей. Есть иерархия ролей, иерархия привилегий, иерархия администраторов. Если мы хотим промоделировать иерархию модулей, то для этого можно использовать иерархию привилегий, которая, вообще говоря, никак к модулям не привязана.
По поводу ограничения активности пользователей. С моей точки зрения твой подход ошибочен. Уровень ограничения активности должен иметь возможность дифференцироваться в зависимости от группы прав пользователя. Администратор например не должен подвергаться каким либо ограничениям активности, в отличии от простого пользователя. Также легко представить необходимость дополнительной группы прав пользователей, активность которых должна быть ограничена дополнительным образом.
Ну и в чем проблема? 1) вызываем функцию уровня проверки возможностей, чтобы узнать, нужно ли проверять ограничения. 2) если нужно, то проверяем ограничения.

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

Точно так же мне кажется странным наличие группы "Read Only" на этом форуме. Я как бы понимаю, как она работает и она имеет право на существование, но ее смысл мне, если честно, не совсем ясен. Способ припугнуть?
У меня тоже привилегии различаются по именам. Странно? Не правда ли?
Интересно было бы узнать, как Вы к этому пришли? Сразу приняли такое решение, прочитали в статье или пришли к нему эволюционным путем? Я пришел эволюционным путем начиная с 32-битных масок :)
Только вот право форматирования сообщений проверяется на стадии его создания в соответствии с правами пользователя создающего сообщения. В этот же момент происходит и само фильтрование html кода и дополнительное форматирование сообщения. Делать эти процедуры в момент показа сообщения не разумно как с точки зрения расходования ресурсов сервера, так и с точки зрения отсутствия необходимости постоянно делать ту работу, которую можно сделать один раз.
Это означает, что у Вас сообщение хранится в двух вариантах: в исходном и в таком, как оно будет показано пользователю? И даже в трех, четырех, пяти, и т.п. - в зависимости от шаблона (у меня, например, от шаблона могут зависеть смайлы и такие элементы, как цитирование) и, возможно, кодировки; у меня также есть фича автоматического управления ссылками, когда я в сообщении форума ссылку записываю не в явном виде (как это делается на всех известных мне форумах), а на специальном языке и эта ссылка сама изменяется вместе с перемещением того объекта, на который она ссылается; только для ссылок внутри самой системы, естественно. Если реализовывать такую фичу при Вашем подходе, то это я должен как-то специально искать сообщения, в которых используются такие ссылки, потом писать систему обновления... Жуть, у меня от одной мысли голова разболелась %)

У меня для таких целей используется система кеширования. Универсальная. Кеширует все что угодно. В зависимости от чего угодно.

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

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

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

-~{}~ 29.12.05 15:10:

У меня тоже привилегии различаются по именам. Странно? Не правда ли?
Это второе совпадение, я так понимаю :) Интересно, а что еще у нас общего? :)
 

flash-vkv

Новичок
ONK
да поставил ты каждого в свой уголок

мысль моя проста, есть ядро оно отвечает: авторизацию юзера, решения какие данные выдавать юзеру, а точнее к какому модулю обратится чтобы получить результат(или к нескольким модулям) и интерфейсы администрирования которые практически и не относятся к ядру а только помогают Админу.

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

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

У меня реализуется все это на HTTP связке. ядро получает HTTP запрос определяет ккаким модулям обрашаться(модуль это образно говаря на самом деле это это интернет адрес в основном localhost/.. к примеру localhost/../мой модуль.php), определив к каму обрашаться делаем HTTP запрос к модулям но к запросу от юзера добовляем еше свои данные (в POST или GET к примеру)

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

ONK

Пассивист PHPСluba
Что значит "обвешивать триггерами"? Если управляющий элемент требует какой бы то ни было проверки, то там в любом случае будет стоять вызов какой-то функции, которая будет что-то проверять. Или можно как-то реализовать эту же функциональность, не проверяя? Или я что-то не так понимаю?
Функция там конечно может быть, но её работа может совершенно не совпадать с особенностями бизнес логики конкретного проекта. А зачем пытаться создавать универсальный модуль, если предполагается вносить модификации в часть его кода?
В результате для каждого управляющего элемента необходимо предусмотреть дополнительный, опциональный способ внешнего воздействия на его состояние.
Т.е. вводить дополнительный «триггер» управляемый, например, с помощью функции обратного вызова задаваемой конфигурационной переменной. Так вот лично я не люблю такие извращения, такая универсальность мне не нравится. А если в модуле этого нет, то назвать его универсальным нельзя. Скорее это заготовка для создания специализированных модулей.
В понятие универсальный модуль я вкладываю следующую сущность:
Это модуль поддерживающий простой способ обновления старой версии на более новую версию. При этом новая версия, добавляя новую функциональность, и исправляю выявленные ошибки, не приводит к какой либо потере работоспособности и сохраняет все настройки старой версии, т.е. имеет полную обратную совместимость.

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

Интересно было бы узнать, как Вы к этому пришли? Сразу приняли такое решение, прочитали в статье или пришли к нему эволюционным путем? Я пришел эволюционным путем начиная с 32-битных масок
В общем, сразу. Сначала было принято решение, что право может быть числом, строкой или логическим значением, поэтому в сессии пользователя стал хранить массив прав, порядковые номера использовать как имена переменных. Затем, года 3 назад, когда количество прав перевалило за 2 десятка и я стал в них путаться, я решил всё это систематизировать и автоматизировать управление правами. Была создана таблица прав, содержащая правила их редактирования (для автоматического контроля введённых администратором значений). Идентификаторы из этой таблицы и стали именами прав/привилегий. Если кратко то так.

Сообщения я храню в том виде, в котором собираюсь показывать. Т.е. в виде максимально возможно похожем на тот вид, в котором пользователь его ввёл, а следовательно хотел видеть на странице отображения. Шаблоны никак не влияют на содержимое сообщения, только на дизайн страниц.

По поводу кэширования, я считаю, что если приличный однопроцессорный сервер без средств кэширования ПХП опкода может сгенерировать 25 страниц в секунду, то нет причин для того, чтобы задумываться о кэшировании. Если надо больше, ZA даст 60 страниц на том же сервере. Надо ещё больше, купи многопроцессорный сервер, оно явно того стоит. Кэширование динамического контента сейчас не актуально.

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

Если принят что обмен будет происходить по единому уневерсальному способу то проподает проблем мамаштобирования , отдиления кода от дизайна, кэша.
Как только ты примешь специальные правила игры подобные этим, твой модуль потеряет возможность функционирования без ядра.
Для обмена данными между ядром и модулем и наоборот я использую специальный объект создаваемый ядром в глобальной области видимости (если не нравится использовать для этого глобальное пространство имён можно передавать объект по ссылке в модуль другими способами).

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

flash-vkv

Новичок
ONK не скажи. если я назначу правила для своих модулей они потеряют индивидуальность. к примеру за что отвечает ядро
1)авторизация . Прикрепив к GET name=Петя или его Id=kfd43dfddfj очень и очень облекчет программирования зная что ID пришло не от юзера а честно прошедший проверку юзер, ну и тот факт что работает этот модуль говарит что он запушен не случайно другие данные тоже можно добавить для полной работы модуля(заметь полной а не правельной), и это я все подважу к тому что модуль можно разрабатывать и тестировать отдельно от ядра, на любом языке, платформе , домене итд
2) вобшем я в первом все высказал. добывлю я пока реализовал что ядро конструирует XML используя инклуде и накладывает XSL, делает сборку XML(отдельно POST, отдельно только GET)+XSL, просто XML и XSL

в потери скорости сильно не замечаю но всеже я предпологаю что она сушественна, особенно если я буде обрашаться к другим доменнам.
на счет минусов . тот факт что не надо подгонять код ядра под проект это не плюс. Сам принцеп авторизации если работает модул то значит что юзер достоин доверия это не плюс. Легко организовать Шаблоны на XSL а не выдумывать или искать сторонние (я типа смарти имею ввиду) это разве минус.
И еше немало важная деталь можно формировать страницу для каждого юзера(группе) одельно просто прописывая пути для модулей данных и стилей.

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

ONK

Пассивист PHPСluba
ок, не скажу. ;)

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

Количество операций, которое необходимо осуществить зависит от функциональных возможностей ядра и от проработанности интерфейса управления модулями.

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

У меня для подключения модуля нужно разместить необходимые файлы в удобном месте, зайти в «админцентр->инструменты разработки->управление модулями». Там есть форма подключения нового модуля, в которой надо объяснить ядру системы как работать с этим модулем:
1. Нужно указать перечень подключаемых файлов;
2. Перечень загружаемых конфигурационных переменных;
3. Перечень кэшируемых шаблонов
Шаблоны и конфигурационные переменные хранятся в базе данных, а извлечение всего необходимого за один SQL запрос приводит к существенной экономии ресурсов сервера (для сложного модуля до десятка SQL запросов объединяются в один);
4. Перечень прав наличие которых необходимо для использования функциональности модуля (объединяются по условию ИЛИ);
5. Имя главной процедуры модуля, которая будет вызвана ядром при корректном запросе модуля;
6. Идентифицирующее имя модуля, по которому к нему будет осуществляться обращения;
7. Положение модуля в иерархии модулей,,,, и ещё десяток мелких параметров определяющих тип модуля и особенности поведения ядра с ним в различных условиях.

После отправки формы, модуль добавляется в дерево модулей и если он сам, или один из его предков не является «временно выключенным» или «скрытым», то он немедленно доступен для использования.
 

Popoff

popoff.donetsk.ua
функции обратного вызова задаваемой конфигурационной переменной
Нет у меня функций обратного вызова. Они запутывают программу, потом в ней не разобраться. Такие функции могут быть скорее как очень сильно редкое исключение из правил, но не правило.
А если в модуле этого нет, то назвать его универсальным нельзя. Скорее это заготовка для создания специализированных модулей.
Да, я уже где-то в этом топике писал о том, что у нас, видимо, проблема с терминологией. Под словом "универсальный" я понимаю "легко расширяемый". При чем под словом "расширяемость" я понимаю не изменение какой-то одной специфической функциональности, а добавление новой функциональности. Не просто при помощи функции обратного вызова в одном проекте что-то считать одним способом, а в другом - другим, а в обоих проектах доступны оба способа.
При этом новая версия, добавляя новую функциональность, и исправляю выявленные ошибки, не приводит к какой либо потере работоспособности и сохраняет все настройки старой версии, т.е. имеет полную обратную совместимость.
То есть: у них - старая версия скрипта (скрипт не содержит в себе никаких настроек, только функции/классы), у нас - новая версия скрипта, они берут у нас новую версию скрипта, копируют поверх старой и у них все работает как и раньше, но добавлена новая функциональность и удалены глюки. Это?
Мне непонятно зачем настолько её усложнять.
Я не специально - оно сомо так получается %) Сначала у меня не было никакой иерархии привилегий, ролей, админов и т.п. Это все клиенты захотели: "так, чтобы в одном списке поменял, а в других само поменялось". В целом, у меня, мне кажется, вполне логичные и естественные решения. Собственно, сама идея c ролями даже не мной придумана - ссылка на оригинал внизу моего описания. Я всего лишь конкретизировал, расписал все подробнее и выполнил конкретную реализацию.
Сообщения я храню в том виде, в котором собираюсь показывать.
А отредактировать я не могу? А вдруг с ошибкой ввел?
По поводу кэширования, я считаю, что если приличный однопроцессорный сервер без средств кэширования ПХП опкода может сгенерировать 25 страниц в секунду, то нет причин для того, чтобы задумываться о кэшировании.
В целом, я, без сомнения, согласен. Если я задумываюсь над кешированием, то это исключительно только потому, что кеширование не представляет собой совершенно никакой сложности для меня - добавить в нужных местах пару вызовов функций, больше ничего не меняется. Если бы была хотя бы малейшая сложность, я бы забил на кеширование.

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

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

Вы храните только в таком виде как будете показывать и не храните исходный вариант сообщения. Я Вас правильно понял?
Надо ещё больше, купи многопроцессорный сервер, оно явно того стоит. Кэширование динамического контента сейчас не актуально.
Даже очень дешевый компьютер стоит в бесконечность раз больше бесплатного скрипта для кеширования. Если бы кеширование вносило хоть какую-нибудь сложность, я бы понял такие растраты. Но кеширование не вносит никаких сложностей. Чем оправдана покупка нового сервера?

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

=========================
Резюме.

Мы с Вами обсуждаем две разные технологии разработки программного обеспечения.

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

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

Возможно, я перечислил не все плюсы и минусы этих двух технологий.

Обе технологии обладают своими достоинствами и недостатками.

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

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

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

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

Пока такой документации нет, мы можем говорить лишь о том, с каких точек зрения и как сравнивать, но не о том, какая сторона лучше и насколько.

===(добавлено)===
исправил дурацкие опечатки %)
 

zarus

Хитрожопый макак
Резюме Popoff похоже на выступление Билла Гейтса по поводу MS Windows vs *nix.
 

whirlwind

TDD infected, paranoid
>Резюме Popoff похоже на выступление Билла Гейтса по поводу MS Windows vs *nix

И тот и другой имеют на это право, т.к. им есть что показать.

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

flash-vkv

Новичок
твоим подходом мы бы все писали бы на асемблере

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

zarus

Хитрожопый макак
Гейтс пошел по пути максимальной простоты. Юзеру не надо знать, как работает система. Проблемы при решении задач должны заключаться в выборе метов решения задачи, а не создании этих самых методов. Если я хочу послушать музыку - пожалуйте Windows Media. И пофиг, что он сильно грузит процессор и обладает рядом недостатков (которые исправляются со временем), главное, что мне не надо парить мозги - я просто ткнул 2 раза в файл и слушаю музыку. Даже нетривиальную вещь - установку самой OS и нового железа на установленной OS, они автоматизировали до максимума. И это правильно. Творческие люди не имеют желания и не пособны копаться в железе и софте, зато они творят прекрасные вещи в 3DMax, Corel, Photoshop. И все благодаря тому, что все, что им нужно делать - по сути тыкать в кнопочки, и непосредственно делать то, что они умеют - рисовать.
Такой же подход предлагает popoff. Создать пусть и слегка тяжелое, но универсальное ядро. Те, кому не нужна какая-то функциональность - просто ею не пользуется (не пользуюсь я MS Outlook Express, но и из системы не удаляю, лежит себе и все).
"Свободолюбы"-любители занимаются сборкой и перекомпиляцией кода (лагерь ONKa). И тоже логично. Я при установке винды и оффиса никогда не ставлю ненужные МНЕ функции (access, outlook, powerpoint просто не ставлю).
В общем, я за подход popoff, так как именно он рассчитан на массовость - на всех не угодишь, а заниматься с каждый по отдельности не хватит времени.
 

Popoff

popoff.donetsk.ua
на всех не угодишь, а заниматься с каждый по отдельности не хватит времени.
Каждый, вообще-то, платит деньги за то, чтобы угодили именно ему. Массовость в моем случае - не означает ширпотреб низкого качества. Я делаю то, что делаю и так, как делаю не для того, чтобы сделать быстро и для всех, а для того, чтобы сделать качественно и быстро для того клиента, с которым я работаю в данный момент. То, что мой подход более массов - это один из возможных плюсов. Но вопрос о том, какой подход лучше для массовой разработки - это открытый вопрос, мы не можем ничего говорить. В моем подходе минусов не меньше, чем в подходе ONK, просто эти минусы разные. И плюсы тоже разные.
 
Сверху