Форум программистов, компьютерный форум, киберфорум
Проекты
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.46/95: Рейтинг темы: голосов - 95, средняя оценка - 4.46
 Аватар для pgb
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232

Предлагаю сотрудничество

02.03.2024, 09:44. Показов 26895. Ответов 414
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Моё предложение прежде всего для одиночек, кто хочет заниматься своим делом в сфере IT, а не работать на "дядю".

Чем занимаюсь я? Я Программист самоучка, предпочитаю заниматься реализацией своих идей, для этого необходимо самостоятельное изучение языков программирования и IT технологий, разработка своих скриптов, модулей... своих проектов. На данный момент у меня есть свой фреймворк(стек: XML+PHP+MySql+HTML+CSS+JS) для создания сайтов на котором я начинаю создавать скрипты разных сайтов.

В чём моё предложение сотрудничества? Мне необходимо общение с кем-то чтобы обсуждать как что сделать, мнение со стороны, у кого имеются некоторые знания и опыт или хотя-бы желание в сфере сайтостроения. Я по мере своей разработки буду спрашивать как бы что сделали вы или выбрать что-то из предложенных мной вариантов и тд. это всё что от вас требуется. Что в замен предлагаю я вам? А я предлагаю вам следующее: реализацию любой вашей идеи(с моим фреймворком и опытом считайте, что ваша идея реализована уже на 90%), а если идей у вас нет, то предложу на выбор что-то из своих идей, далее обучу необходимым знаниям и буду помогать в реализации вашего проекта на своём фреймворке, а также дальнейшая тех поддержка и доработка.

Все детали будем обсуждать в ***
2
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.03.2024, 09:44
Ответы с готовыми решениями:

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

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

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

414
 Аватар для pgb
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
07.04.2024, 13:23  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от voral Посмотреть сообщение
Т.к. вопрос задаешь публично, то и ответ ожидаешь публичный? мне результаты тестирования здесь приводить с примерами минимально необходимыми кода?
Пиши тут, в движке основная часть отлажена, возможно у тебя команда движка _for ещё не отлажена, да она и не нужна пока, это для вставки данных из базы в основном.
0
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
07.04.2024, 13:29
Ок. Завтра опубликую уже первые результаты. (выкладывать буду постепенно). бегло взглянул - как минимум два места уже вижу где баг очень вероятен (что самое плохое не явный - т.е. не будет что то падать, например, будет все работать, но возможно не так как планировал пользователь с них и начну. (под пользователем здесь и далее буду понимать разработчика использующего твое решение).
2
Эксперт .NET
 Аватар для Usaga
14368 / 9469 / 1360
Регистрация: 21.01.2016
Сообщений: 35,731
08.04.2024, 05:56
Цитата Сообщение от voral Посмотреть сообщение
3 плюсом эти все ваши проверки структуры БД.
Что? Зачем? О_о
0
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
08.04.2024, 08:11
Итак. Первой на глаза попалась конструкция условного ветвления. В xml ы общем случае она описывается так
XML
1
2
3
<_ _ifv="article=020">
Этот текст будет выведен если переменная article равна '020'.
</_>
И вот код, который ее обрабатывает Часть кода, которая не участвует в логике обработки при описываемых багах я убрал. Так же я сдалал минимальное форматирование кода, уверен, что большинству будет код читать проще в таком виде, а не когда в одной строке по несколько инструкций

Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
namespace core;
class Engine2
{
    use singleton;
 
    // вырезан остальной код
 
    /** Метод, изготовления html разметки
     * @param object $xml объект элемента xml-инструкции
     * @return string|array html разметка или массив данных
     */
    public function Making(object $xml): string|array
    {
        $this->Args->Clear();
        $chi = true;
        $rec = $this->Vars->Spoof(trim(trim($xml->__toString()), '|'));
        foreach ($xml->attributes() as $key => $val) {
            $val = $this->Vars->Spoof($val->__toString());
            if (strpos($key, '.')) {
                $key = explode('.', $key);
                $node = array_shift($key);
                if (!$key[0]) array_push($key, $val);
                $val = $this->Nods->$node($key, $val);
                if (gettype($val) == 'object') {
                    $val = null;
                    code_error('Не допустимый результат ' . $node . '.' . $key);
                }
            } else switch ($key) {
                // вырезан остальной код
                case '_var':
                    $val = $this->Vars->$val;
                    break;
                case '_ifv':
                    $val = $val ? $this->Condition($val) : !$rec;
                    break;
                // вырезан остальной код
                default:
                    $this->Args->$key = $val;
                    $val = null;
            }
            // вырезан остальной код
        }
        // вырезан остальной код
        return $rec;
    }
    // вырезан остальной код
 
    /** Метод, условие
     * @param string $par выражение условия
     * @return bool результат проверки условия
     */
    private function Condition(string $par): bool
    {
        preg_match('/([^!=>(]+)([!=>]+)?\)?\(?([^)]*)\)?/', $par, $mth);
        if (!$mth[2] && $mth[3]) {
            $res = explode('.', $mth[1]);
            $par = array_shift($res);
            $res = $this->Nods->$par($res, $mth[3]);
        } else {
            $res = $this->Vars->{$mth[1]};
            $par = $mth[3];
        }
        switch ($mth[2]) {
            case '!':
                $res = !(bool)$res;
                break;
            case '>':
                $this->ForСompare($res, $par);
                $res = $res > $par;
                break;
            case '<':
                $this->ForСompare($res, $par);
                $res = $res < $par;
                break;
            case '=':
                $this->ForСompare($res, $par);
                $res = $res == $par;
                break;
            case '!=':
                $this->ForСompare($res, $par);
                $res = $res != $par;
                break;
            case '>=':
                $this->ForСompare($res, $par);
                $res = $res >= $par;
                break;
            case '<=':
                $this->ForСompare($res, $par);
                $res = $res <= $par;
                break;
            default:
                $res = (bool)$res;
        }
        return $res;
    }
 
    /** Метод, подготовка для сравнения
     * @param mixed &$vl1 первое значение
     * @param mixed &$vl2 второе значение
     */
    private function ForСompare(mixed &$vl1, mixed &$vl2)
    {
        if (is_numeric($vl1)) {
            $vl1 = floatval($vl1);
            $vl2 = floatval($vl2);
        }
    }
    // вырезан остальной код
}


Первое, что привлекло внимание в коде, это метод ForCompare. Начал смотреть с него - потому с него и начнем

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

2. Сразу видим преобразование к float. И сразу же опыт подсказывает, что это потенциальное место проблем (при чем надо понимать, что для пользователя это не явное преобразование - он его не заказывал). Плюсом сразу вспоминаются типовые проблемы сравнения флоатов и даже можно погуглить типа "собеседование сравнение флоат". Это, мне кажется, описано во всех учебниках. Как следствие пользователя ждет нежданчик.

XML
1
2
3
<_ _ifv="article=020">
Этот текст будет выведен если переменная article равна '020'.
</_>
Это условие сработает (имеем ввиду, что для пользователя это все строки, у него в каталоге может быть несколько сот тысяч товаров и он может узнать об этой ошибке "cлучайно" и хорошо если это не покупатель с предьявой выявит). Итак это условие сработает если переменная article равна '20' или '2E1' (почему 2E1- об этом даже в документации PHP написано). В прочем, справедливости ради с вариантом про 2E1 и в PHP надо принимать меры, но в PHP это возможно, а в этой конструкции без вариантов - пропустит.

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

3. Далее смотрим на регулярку в строке 54
PHP
1
preg_match('/([^!=>(]+)([!=>]+)?\)?\(?([^)]*)\)?/', $par, $mth);
Из нее следует, что особенно внимательно надо относится к символам "(", ")", "=", ">"
строки 56 - 58 - я пока не рассматривал. Ну, а для простых сравнений эта регулярка раскидывает выражение на три составляющие. (сейчас рассматриваем случай когда есть все три) : левый аргумент, условие, правый аргумент.
И тут сразу видим что символа быть "<" не может. Сначала я думал, что "ну просто значит надо менять их местами", но нет: согласно строкам 60 и 61 на первом месте всегда имя переменной, на третьем всегда конкретное значение. При этом согласно строкам 87 и 71 когда то все же такая возможность была. Т.е. очевидно сначала были отлажены типовые операции, потом внесены правки и.... все. часть функционала отвалилась. И как раз этот случай легко решается юниттесированием. Ведь чтобы качественно протестить только этот метод необходимо выполнить как минимум по одному тесту для каждой ветки ветвления алгоритма + варианты комбинированные, например, я оставил в коде для демонстрации только if и switch - в реальности есть еще один switch и один if - т.е. руками надо каждый раз их все сделать. А можно написать один раз простейшие юниттесты, повесить их на сохранение файлов (или если использовать git на событие коммита) и все. Представьте этот фреймворк запустили, им начали пользоваться, выходит обновление, все работает...... но не праильно.

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

5. Если же попытаться таки использовать сравнение
XML
1
<_ _ifv="article<20"></_>
то получим сообщение "Ошибка OWNI инструкции". При этом стандартный совет при ошибках "посмотри в логи" ни чего не даст - стандартный ексцепшн перехвачен, в логи ни чего не идет.. Посмотреть можно вроде, все ошибки собираются в глобальном массиве - я пока не смотрел как его можно увидеть. Но в логи стандартные исключения должны попадать. Представьте что ошибка проявилась у посетителя - владелец сайта об этом ни чего и не узнает даже....


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

7. Так же из регулярки. (не баг, но ограничение) Если сравниваем текстовые строки - правая строка не может содержать скобки.

На сегодня все.
4
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,696
Записей в блоге: 29
08.04.2024, 08:57
но хоть летает то как фотон?
0
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
08.04.2024, 09:08
Цитата Сообщение от Usaga Посмотреть сообщение
Что? Зачем? О_о
Как я понимаю, это составляющая "что б разрабатывать было проще", но на мой взгляд это серьезный источник геморроя (и уже как раз сталкивался с этим). но лучше, конечно, узнать мнение автора.

Цитата Сообщение от Welemir1 Посмотреть сообщение
но хоть летает то как фотон?
Пока не известно на практике - не удалось собрать главную даже с помощью автора. Класс работы с БД, у меня устаревший...Предварительно меня терзают смутные сомнения и это имеет вполне техническое объяснение.... но посмотрим если получится.
0
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
09.04.2024, 07:57
Сегодня продолжение про конструкцию _ifv. Сразу оговорюсь тут речь не про баг, а про удобство и интуитивную понятность
со стороны пользователя-разработчика. Ведь автором заявлена скорость и удобство разработки - так что тоже важно.

Чтобы остальным было понятно о чем речь некоторые пояснения:
В решении есть понятие Узла (ноды), если проводить параллели с общепринятыми понятиями, это ближе всего к понятию модуль:
может иметь набор шаблонов, js скрипты и стили. Например: news-list.htm,news-list.js,news-list.css - набор файлов для блока список новостей. И таких наборов может быть много в одной ноде.

Так же у ноды может быть один файл содержащий класс. Т.е. что-то типа контроллера ноды. Называться файл должен Class.php а класс по имени ноды. Т.е. в моем тестовом примере нода blog, класс Blog, а имя файла Class.php. (Что тоже не слишком удобно при работе с кодом, особенно с учетом того, что часто применяется mixed в качестве типа - что сильно урезает возможности штатной навигации по коду в IDE.)

итак
создаю такой контроллер
PHP
1
2
3
4
5
6
7
8
9
10
11
class Blog
{
    public function test(mixed $a, mixed $b = 1): bool
    {
        file_put_contents($_SERVER['DOCUMENT_ROOT'] . '/v.log', print_r([
            __METHOD__,
            $a,$b
        ], true), FILE_APPEND);
        return true;
    }
}
Теперь в шаблоне могу сделать так. Т.е. по замыслу вызывается метод test контроллера ноды blog с параметром "1"
XML
1
<_ _ifv="blog.test(1)">Ok</_>
вновь регулярка, которую мы уже смотрели из Engine::Condition и важный для пояснений код. За вызов функций отвечает код на строках 5 - 7
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    private function Condition(string $par): bool
    {
        preg_match('/([^!=>(]+)([!=>]+)?\)?\(?([^)]*)\)?/', $par, $mth);
        if (!$mth[2] && $mth[3]) {
            $res = explode('.', $mth[1]);
            $par = array_shift($res);
            $res = $this->Nods->$par($res, $mth[3]);
        } else {
        // ....
        }
        switch ($mth[2]) {
        // .... разбор различных условий типа больше, меньше и т.п.
                    default:
                        $res = (bool)$res;
                }
    }
И вот тут проявляются неочевидные возможности
XML
1
<_ _ifv="blog.test.foo(1)">Ok</_>
приведет к вызову
PHP
1
(new Blog)->test(1,['foo']);
XML
1
<_ _ifv="blog.test.foo.bar(1)">Ok</_>
приведет к вызову
PHP
1
(new Blog)->test(1,['foo','bar']);
С другой стороны логичный и привычный стиль
XML
1
<_ _ifv="blog.test(1,2)">Ok</_>
приведет к вызову (т.е. это один строковый параметр)
PHP
1
(new Blog)->test('1,2');
кроме того варианты без параметров не будут работать совсем (скажем проверку мы хотим увязать со внутренним стейтом контроллера) или как пример хочу блог показывать только по выходным, делаю у контроллера isWeekend не требующий параметра. Такие записи не будут работать
XML
1
<_ _ifv="blog.isWeekend()">Ok</_>
XML
1
<_ _ifv="blog.isWeekend">Ok</_>
Т.е. как бы есть возможность передать несколько параметров, но нет возможности их типизировать, при этом первый параметр обязателен и идет отдельно.

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


Далее про полеты "как фотон". То же пример, что при написании кода не заморачивались этим, строки 11 - 15 не имеют смысла когда мы запрашиваем контроллер, т.к. мы уже проверяли $mth[2]. (естественно это не единственный момент на эту тему)

Добавлено через 12 минут
pgb, в общем конструкцию _ifv можно считать рассмотрел. будем двигаться дальше.

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

Ну и главное это серия сильно вероятных ошибок связанных с приведением типов и проблема с "<" и "<="

Добавлено через 20 минут
Кстати на тему быстродействия. Сам я не проверял, но все же. Встроенный статический анализатор IDE пишет, что
PHP
1
2
$vl2 = floatval($vl2);
settype($val,'string');
работал на PHP5 медленнее в 6 раз чем
PHP
1
2
$vl2 = (float)$vl2;
$val = (string)$val;
скорее всего, конечно в нынешних версиях оптимизировали первый вариант тоже... Я не проверял, сам пользуюсь вторым вариантом - лично мне он больше привычен. Интересно автор тестил (использует первый) в рамках борьбы за скорость фотона?
0
 Аватар для pgb
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
09.04.2024, 21:03  [ТС]
Цитата Сообщение от voral Посмотреть сообщение
это составляющая "что б разрабатывать было проще", но на мой взгляд это серьезный источник геморроя (и уже как раз сталкивался с этим). но лучше, конечно, узнать мнение автора
Это чтобы не лезть лишний раз в базу данных, чтобы структуры таблиц были всегда как говорится под рукой. Класс сущности при создании новой сущности или добавлении новых полей, данных и тд. может без лишних запросов в базу проверить есть ли такая сущность, поле или можно ли добавить такие данные, связи, права доступа и тп.
Цитата Сообщение от voral Посмотреть сообщение
<_ _ifv="blog.test(1)">Ok</_>
Что касается команды движка _ifv это как говорится пережиток прошлого фактически с второй или третий версии(если не с первой, т.к переделывал движок кардинально несколько раз) когда я добавил переменные инструкции и для их проверки такую функцию. Но с классами узлов эта функция практически и не нужна. Ведь можно передать некие параметры в класс узла, там сделать проверку и вернуть `true` или `false` и по результату это будет аналогично работе _ifv

Скачала хотел написать откуда вообще взял, что в _ifv можно делать вызов метода узла, а потом глянул в код, да действительно есть такое, а я думал, что убрал уже это, оставил только проверку переменных инструкции. Для простых проверок переменных инструкции надо бы оставить чтобы лишний раз не вызывать методы класса узлов, ну а для вызовов метода узла в самой команде(_ifv="node.method()") точно уберу не нужен он там вообще.
0
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
10.04.2024, 07:37
Цитата Сообщение от pgb Посмотреть сообщение
Это чтобы не лезть лишний раз в базу данных, чтобы структуры таблиц были всегда как говорится под рукой. Класс сущности при создании новой сущности или добавлении новых полей, данных и тд. может без лишних запросов в базу проверить есть ли такая сущность, поле или можно ли добавить такие данные, связи, права доступа и тп
Что б структура была под рукой есть везде. В доктрине это xml или yaml файлы или вообще комментарии в файле описывающем сущность. Т.е. достаточно исправить комментарий (или файл xml соответствующий сущности) - выполнить команду - вот у нас все изменилось. В битриксе - идем в класс соотвествующей таблицы и там в одном методе все описание. При этом в этих же описаниях можно описывать и взаимосвязи. А могу и наоборот в битриксе по существующей таблице сгенерировать класс. В симфони вообще командами консоли добавить всю сущность.

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

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

Т.е. вот есть устоявшийся сайт, у него есть небольшая вероятность, что нам понадобилось изменить какую то табличку раз в год... и ради этого проверка на каждом хите?
0
 Аватар для pgb
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
10.04.2024, 08:44  [ТС]
Цитата Сообщение от voral Посмотреть сообщение
Что б структура была под рукой есть везде. В доктрине это xml или yaml файлы или вообще комментарии в файле описывающем сущность. Т.е. достаточно исправить комментарий (или файл xml соответствующий сущности) - выполнить команду - вот у нас все изменилось. В битриксе - идем в класс соотвествующей таблицы и там в одном методе все описание. При этом в этих же описаниях можно описывать и взаимосвязи. А могу и наоборот в битриксе по существующей таблице сгенерировать класс. В симфони вообще командами консоли добавить всю сущность.
Я делаю простой инструмент для тех кто в программировании мало что смыслят так сказать зерокодеры, домохозяйки и прочие... забыл? Поэтому расчёт на то что они будут лезть в сам код(кроме xml инструкций) по большому счёту исключаю, но допускаю, что кто более опытные могут делать необходимые правки. Так вот когда ты хотел посмотреть работу с базой, я сказал создай в ручную таблицу и удали файл node\core\mysql.json(в нём вся структура и находится), этот файл(если не существует то создаётся) загружается при подключении к базе, не подключаешься к базе он не будет загружаться. Далее при работе с сущностями производятся нужные проверки без лишних подключений и тд. То есть можно создавать сущности несколькими способами: 1) вручную; 2) через класс узла подключив класс сущности(для знающих PHP по доке фреймворка); 3) в xml инструкции(для пользователей по доке фреймворка)
Цитата Сообщение от voral Посмотреть сообщение
Тут просто надо оценивать на сколько это важно. Это только в активной фазе развития необходимо относительно часто. Во время работы разработчику знать структуру БД вообще не нужно. Ведь это просто хранение, во время разработки оперируем сущностями и все.. как оно там хранится - дело десятое. Это вообще история исключительно про разработку, тащить ее на каждый хит - дело сомнительное. (я правда еще не смотрел алгоритм детально, но пока, как я понимаю - именно на каждом хите.). Причем это вариант для простых случаев. Например ты создал некий справочник, в справочнике нужны данные. Как они туда попадут?
Т.е. вот есть устоявшийся сайт, у него есть небольшая вероятность, что нам понадобилось изменить какую то табличку раз в год... и ради этого проверка на каждом хите?
Раз в год и можно сделать изменение, сам же команду _ifv недавно разбирал. К примеру, проверил условие через _ifv, если соответствует обработал вложенную конструкцию xml для изменения базы, в остальных случаях никаких изменений не будет. Или через метод класса узла, или в ручную.

Ну и да пока там подгрузка при каждом подключении к базе, при тестировании это конечно удобно, в паблике конечно каждый раз таскать файл структуры в принципе нет необходимости если изменений сущностей не предвидится, сделаю то его с ленивой загрузкой при необходимости.
0
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
10.04.2024, 10:24
Цитата Сообщение от pgb Посмотреть сообщение
Я делаю простой инструмент для тех кто в программировании мало что смыслят так сказать зерокодеры, домохозяйки и прочие... забыл?
Ну, а чем сложнее в этом плане xml от Doctrine?
Тут суть то не в этом как это оформляется, а в том что на каждом хите проверяется. Даже без подключения к БД - все равно лишняя операция.

Ну да ладно... вернемся к нашим баранам.

Сегодня скорее про быстродействие. (просто пока остальное смотрю, постоянно натыкаюсь - глаз мозолит)
В проекте много используется регулярок, штука не самая быстрая. Далее смотрим код Engine::Making в которой идет как раз выявление конструкций этого проекта (в т.ч. _ifv)
PHP
1
2
3
4
5
6
7
8
9
10
public function Making(object $xml): string|array{
    $this->Args->Clear();
    $chi = true;
    $rec = $this->Vars->Spoof(trim(trim($xml->__toString()), '|'));
    foreach ($xml->attributes() as $key => $val) {
        $val = $this->Vars->Spoof($val->__toString());
        //остальной код
    }
    //остальной код
}
Вот меня заинтересовала этот метод Spoof он занимается тем, что замещает в разметке переменные их значениями. Минимальный xml для демонстрации (задаем значения переменным и выводим)
XML
1
2
3
<article1>Article 20</article1>
<article2>Article 2E1</article2>
<_>{article1} {article2}</_>
PHP
1
2
3
4
5
6
7
8
9
10
    public function Spoof(string $txt): string
    {
        while (preg_match('/\{([^\}]+)\}/', $txt, $mth)) {
            $res = $this->{$mth[1]};
            if (is_null($res)) $res = '';
            else if (is_array($res)) $res = count($res);
            $txt = str_replace($mth[0], $res, $txt);
        }
        return $txt;
    }
т.е. мы получаем по этим двум листингам неоднократный вызов Spoof внутри которой еще и регулярка в цикле. Хотя тут у нас есть более шустрый инструментарий по определению.
Например так
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
    public function Spoof(string $txt): string
    {
        return preg_replace_callback(
            '/\{([^\}]+)\}/', 
            function ($matches) {
                $res = $this->{$matches[1]};
                if (is_null($res)) $res = '';
                else if (is_array($res)) $res = count($res);
                return $res;
            },
            $txt
        );
    }
Далее, напрашивается для ускорения нашего фотона, для чего Spoof вызывать каждый раз? Почему не сделать уже в конце, когда вся страница создана и уже тогда разом заменить все переменные на их значения.

Причем тут надо еще знать задумку. Сейчас (и по предложенной мной выше правке), например значение переменной значение может иметь тоже переменную
XML
1
2
3
4
5
<article0>Article 20</article0>
<article1>Article 20</article1>
<article2>Article 2E1</article2>
<_hr/>
<_>{article1} {article2}</_>
Этот код после черты выведет "Article 20 Article 0 Article 2E1". Так вот если это недокументированная фича, которая не нужна то можно вообще перейти на более шуструю str_replace
примерно так (просто пример как направление, т.е. доработать надо до нужд задачи)
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
// Предварительно массив должен быть приведен к примерно такому виду
// так же дело техники - можно сразу таким формировать, можно подготовить ключи непосредственно перед заменой
// (тот же array_walk)
        $this->values = [
            '{article0}' => 'Article 0',
            '{article1}' => 'Article 20',
            '{article2}' => 'Article 2E1',
        ];
// а потом
    public function Spoof(string $txt): string
    {
        return str_replace(array_keys($this->values),array_values($this->values),$txt);
    }
Попутно заметки.
1 В решении есть так же возможность выводить значения переменных (правда в другом месте) вписывая их в квадратных, а не фигурных скобках. Не очень удобно, когда в рамках одного инструмента делается одно и то же
2. На первый взгляд нет возможности вывести просто текст в фигурных скобках.
3. Неожиданное поведение если значение переменной массив. На практике, если в такую ситуацию попадает массив, чаще его все же как то преобразуют в строку, типа "названия через запятую". Опять же нужна возможность тогда уж колбека для этого. А количество элементов возвращать такое себе. На мой взгляд логичнее было вообще не брать сюда это решение: пользователь пусть сам подготовит как выводить.
0
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
12.04.2024, 10:10
pgb, можете привести рабочий пример использования конструкции _dup?

Добавлено через 14 минут
подозреваю, что она вообще не работает или там какой то хитрый синтаксис вызова очень не очевидный

Добавлено через 1 час 50 минут
Но о проблемах конструкции _dup как я понимаю дублирование уже можно говорить. Ориентировочный синтаксис задумывался такой
XML
1
2
3
4
<_ _dup="3,4`3">
{ Block 1 }
{ Block 2 checked }
</_>
Т.е. типа блок 1 повторится три раза, блок 2 четыре раза и у копий за исключением третей будет убрано checked

Обрабатывает сие вот такой метод. (Но важна подготовка данных до этого метода, и именно из за подготовки подозреваю метод не работает.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    /** Метод, дублирование
     * @param string $par параметр для дублирования
     * @param string &$rec переменная записи по ссылке
     */
    private function Duplication(string $par, string &$rec)
    {
        $arr = explode(',', $par);
        foreach ($arr as $val) {
            preg_match('/(\d+)`?(\d+)?/', $val, $mth);
            $val = isset($mth[1]) ? (int)$mth[1] : 1;
            $par = isset($mth[2]) ? (int)$mth[2] : 0;
            if (preg_match('/{((?:[^}{]*|(?R))*)}/s', $rec, $mth, PREG_OFFSET_CAPTURE)) {
                $bus = '';
                $val++;
                for ($nx = 1; $nx < $val; $nx++) {
                    $car = str_replace('?', $nx, $mth[1][0]);
                    if ($par != $nx) $car = str_replace(' checked', '', $car);
                    $bus .= $car;
                }
                $rec = substr_replace($rec, $bus, $mth[0][1], strlen($mth[0][0]));
            }
        }
    }
Сразу про производительность фотона. Две регулярки в цикле, одна из которых рекурсивная. Судя по рекурсивной в теории может быть контент блока и со вложенными скобками,
XML
1
2
3
4
<_ _dup="3,4`3">
{ { internal } Block 1 }
{ Block 2 checked }
</_>
т.е. регулярка отберет два блока "{ { internal } Block 1 }" и "{ Block 2 checked }"

Значение параметра "3,4`3", тут количество копий через запятую. Для каждого блока, а вот дальше опять сюрприз. Сайдэффект метода в том, что очевидно автору срочно потребовалось
решить конкретную задачу и это впихнуто сюда.

Очевидно потребовался вывод радиокнопок и надо было убрать " checked". Для этого был воткнут параметр через апостроф. И там номер копии у которой должен остаться checked.
Но ведь синтаксис checked="checked" тоже валидны и в определенном случае правильный именно такой. Выбирать по номеру копии - ну такое себе решение, т.е. надо сначала вычислить позицию зная значение. (т.е. вроде как для максимально не опытных рассчитано, но усложнено именно для них).

Если параметр "активной копии" не ставить вовсе - то из контента блока будут убраны все строки " checked" во всех копиях.

Еще один "сайд эффект" это то, что в этих блоках знак вопроса "зарезервированный символ" - он заменяется номером копии.

Таким образом тут явно заточено дублирование исключительно под радиокнопки. Почем тогда в названии этого не отразить типа _dup_radio.

Но на повестке остается вопрос, как правильно использовать. т.к. вот по тем примерам, что я привел
XML
1
2
3
4
            <_ _dup="3,4`3">
                { internal Block 1 }
                { Block 2 checked }
            </_>
Дает пустоту
XML
1
2
3
4
            <_ _dup="3,4`3">
                { {internal} Block 1 }
                { Block 2 checked }
            </_>
Дает 'Block 1 }' (именно так с закрывающей скобкой)
XML
1
2
3
            <_ _dup="3`2">
                { <_label>? <_input type="radio" name="example" value="?" checked="checked"/> </_label>}
            </_>
Вывело знак вопроса и одну активную радиокнопку у который знак вопроса в качестве значения.

(собственно я даже на 99% уверен в причине такого поведения и 1% оставил на то, что я что-то упустил и не угадал правильный синтаксис)

Добавлено через 4 минуты
да и в дополнение. Этот _dup заточен исключительно на то, что у радиокнопок значения исключительно 1,2,3,4,5,..... и обязательно одна должна быть активна сразу.

Добавлено через 9 минут
И еще забыл. Код теперь с синтаксисом на который рассчитано вытирание " checked"

XML
1
2
3
            <_ _dup="3`2">
                { <_label>? <_input type="radio" name="example" value="?" checked/> </_label>}
            </_>
Дает ошибку "Ошибка OWNI инструкции". На 100% уверен, что под капотом это ошибка синтаксиса xml. Т.к. там надо именно checked="checked"
1
 Аватар для pgb
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
12.04.2024, 20:07  [ТС]
Что касается быстродействия, да иногда приходится им жертвовать ради удобства разработки для пользователя. Я считаю, что могу это позволить немного, так как у меня страница собирается из маленьких кусочков и замена производится быстро нежели в большой портянке как в обычных шаблонизаторах.

Насчёт Spoof функции, спасибо, потестирую если твоя будет лучше, сделаю через preg_replace_callback

Что касается команды _dup это дублирование в макете. Да, сделал это из необходимости дублировать повторяющую разметку в макетах. Для примера посмотри box.="tabs" или box.="accordion"
XML
1
<_ box.="tabs" _dup="3,3,3"/>
Правильно догадался, разметка в макете заключенная в {} дублируется столько раз сколько указано, вложенных по-моему не может быть, я хотел чтобы вложенные тоже можно было делать, но сделал по-моему чтобы было по проще, только последовательные.
Если в блоке есть элемент input с типом radio или checkbox, то можно указывать элемент на котором поставить checked например _dup="3`2,3,3"

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

Добавлено через 11 минут
Цитата Сообщение от voral Посмотреть сообщение
<_input type="radio" name="example" value="?" checked/>
В xml нельзя аргументы/атрибуты ставить без значения, только со значением.

ЗЫ. Да, и генерировать HTML теги в инструкции я не рекомендую, это только для самых необходимых случаев предусмотрено, а в основном надо подключать компоненты, стилизовать через классы и заполнять их данными, вот и всё.
0
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
12.04.2024, 20:19
Цитата Сообщение от pgb Посмотреть сообщение
В xml нельзя аргументы/атрибуты ставить без значения, только со значением.
Совершенно верно, но почему убирается строка " checked". Я об этом и писал

Добавлено через 4 минуты
Цитата Сообщение от pgb Посмотреть сообщение
Что касается быстродействия, да иногда приходится им жертвовать ради удобства разработки для пользователя. Я считаю, что могу это позволить немного, так как у меня страница собирается из маленьких кусочков и замена производится быстро нежели в большой портянке как в обычных шаблонизаторах.
Это основано на тестах или как?
Любая регулярка это дорогая операция. Со стороны пользователя тут вообще ни чем не будет отличатся. А вот быстродействие уверен можно спокойно повысить (у меня был опыт работы с xml и c html, правда несколько другой разрез - здесь я бы попробовал вообще зайти по технологиям как языки программирования разбирают код).

Добавлено через 2 минуты
Цитата Сообщение от pgb Посмотреть сообщение
Что касается команды _dup это дублирование в макете.
Тогда плохо что оно имеет сайд эффекты. Что будет если мне потребуется текст внутри иметь "checked"? Да это не баг движка, но потенциальное и не очевидное место для бага в проекте пользователя.

Добавлено через 1 минуту
Цитата Сообщение от pgb Посмотреть сообщение
Если в блоке есть элемент input с типом radio или checkbox, то можно указывать элемент на котором поставить checked например
Частенько значения берутся из справочников, или вообще текстовые... т.е. эту конструкцию уже не применить без костылей

Добавлено через 51 секунду
Цитата Сообщение от pgb Посмотреть сообщение
вложенных по-моему не может быть
Тогда рекурсия в регулярке, скорее всего, неоправданная нагрузка, ввиду того как она работает

Добавлено через 53 секунды
Цитата Сообщение от pgb Посмотреть сообщение
Правильно догадался, разметка в макете заключенная в {} дублируется столько раз сколько указано
Но вот я привел примеры выше, что в них не так?
Твой код посмотрю, уже позже - уезжаю на несколько дней
0
 Аватар для pgb
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
12.04.2024, 20:28  [ТС]
Цитата Сообщение от voral Посмотреть сообщение
Что будет если мне потребуется текст внутри иметь "checked"? Да это не баг движка, но потенциальное и не очевидное место для бага в проекте пользователя.
Повторяю. Макет компонента это мини каркас для наполнения какими либо данными, текстом. Сначала движок по инструкции берёт разметку например box.="tabs" генерирует вложенные табы, затем в метки заполняются данные\текст в которых может быть всё что угодно, если в инструкции есть вложенные элементы, то движок доходит до них их полностью собирает и затем вставляет в метки текущего компонента, оно уже изменятся не будет это уже часть готовой станицы.

ЗЫ. Данное решение с _dup я не рассмотриваю как окончательное, возможно в будущем это будет переделано по другому, но пока для компонентов в которых нужно дублирование по типу табов, аккордиона и тп. я сделал такое решение.
0
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
12.04.2024, 20:30
А ну т.е. на те примеры как показал не расчитано? Необходимо обязательно box. указывать?

Чтож ок проверю так (но тогда стоило бы ошибку показать)
0
 Аватар для pgb
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
12.04.2024, 22:47  [ТС]
Цитата Сообщение от voral Посмотреть сообщение
А ну т.е. на те примеры как показал не расчитано? Необходимо обязательно box. указывать?
Рассчитано, что разметка для _dup будет браться из макетов компонентов, а не из инструкции, в инструкции предусмотрена генерация HTML тегов для самых крайних случаев, ну потестировать конечно что-то можно.

Добавлено через 26 минут
В таком варианте явно работать не будет.
XML
1
2
3
<_ _dup="3`2">
  { <_label>? <_input type="radio" name="example" value="?" checked/> </_label>}
</_>
При обработке инструкции сначала берётся запись элемента как текст без вложенных элементов, затем последовательно один за одним обрабатываются аргументы(атрибуты как в HTML), потом обрабатываются вложенные элементы один за одним, если есть метки то сгенерированная разметка\текст вставляются в метки текущей записи элемента.

В данном случае произойдёт следующее: из записи возьмутся в виде текста {}, потом пустота в {} продублируется три раза, потом сгенерируется тег label в котором будет ? и элемент input

Добавлено через 30 минут
Вот так будет работать.
XML
1
2
3
4
5
<_ _sub="" _dup="3`2">{[label]}
  <label_label>[input] [radio?]
    <input_input type="radio" name="example" value="[value?]" checked=""/>
  </label_label>
</_>
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
<_>
  <_ _sub="" _dup="3`2">{[label]}
    <label_label>[input] [radio?]
      <input_input type="radio" name="example" value="[value?]" checked=""/>
    </label_label>
  </_>
  <radio1>Чай</radio1>
  <radio2>Кофе</radio2>
  <radio3>Потанцуем</radio3>
  <value1>tea</value1>
  <value2>coffee</value2>
  <value3>dance</value3>
</_>

Командой _sub="" мы заставляем движок обработать дочерние элементы до выполнения команды _dup чтобы в записи уже была разметка в которой надо сделать дублирование.

То есть изменяя параметр _dup можно генерировать 3 или сколько угодно input radio, указав `2 номер на котором поставить checked

Только измени вторую строчку в методе Engine->Making
PHP
1
2
3
$rec=$this->Vars->Spoof(trim(trim($xml->__toString()),'|'));
//на
$rec=trim(trim($xml->__toString()),'|');
Я что-то тестил, видимо забыл убрать, там не должно быть Spoof`a

Добавлено через 19 минут
ЗЫ. Основной смысл моего фреймворка в том что будут подготовлены основные компоненты страницы такие как каркас(с сайдбаром и без при этом адаптивные под разные устройства), табы, аккордеоны, карточки товаров для магазина, для статей блогов, для форума сообщения, разные блоки и тд. при желании пользователь может и свои создавать, так же методы класса которые будут генерировать меню навигации и прочее. Пользователю просто останется указать в инструкции xml что надо разместить на той или иной странице, указать классы стилей(подготовлены специально, для цвета, бордюра, теней, таблиц и др.) т.е один и тот же компонент можно вставлять на страницу много раз и стилизовать по разному при желании, получить данные из базы через узел базы и заполнить компоненты данными. Всё.

При этом не нужно изучать мой инструмент как другие, есть всего навсего несколько правил для составления инструкции xml, всё остальное пишется на нативном коде, при написании скриптов на js есть несколько модулей для удобства написания своих скриптов, ничего сверхъестественного.
0
 Аватар для pgb
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
13.04.2024, 11:16  [ТС]
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
<_>
  <_ _sub="" _dup="3`2">{[label]}
    <label_label>[input] [radio?]
      <input_input type="radio" name="example" value="[value?]" checked=""/>
    </label_label>
  </_>
  <radio1>Чай</radio1>
  <radio2>Кофе</radio2>
  <radio3>Потанцуем</radio3>
  <value1>tea</value1>
  <value2>coffee</value2>
  <value3>dance</value3>
</_>
Объясню как это работает:
Сначала нужен макет в котором нам надо продублировать некоторую разметку, для этого подключаем макет например box.="tabs" после этого в записи у нас есть этот макет в котором есть разметка заключённая в фигурные скобки {} при обновлении страницы мы их увидим, далее указываем дублирование этой разметки через _dup и у нас сгенерированный каркас для нужного количества табов, потом заполняем данными в метки.

А когда в инструкции генерируем разметку, то прежде чем что-то дублировать эту разметку нужно где-то взять, а взять мы её может через команду _sub которая принудительно обрабатывает вложенные элементы до обработки атрибутов, в нашем случае до команды движка _dup
Итак,
1) берётся запись {[label]}
2) команда _sub="" обрабатывает вложенные элементы
2.1) генерируется элемент label в котором будет две метки [input] [radio?]
2.2) генерируется элемент input с меткой в value="[value?]"
2.3) затем элемент input вставляется в метку [input] в записи label
3) теперь элемент label вставляется в метку [label] заключённую в {} в записи нашего корневого элемента, всё у нас есть макет разметки для дублирования
4) выполняется команда дублирования, в данном случае 3 раза дублируется элемент label с вложенным input на 2 элементе input оставляется checked, вместо знаков вопроса подставляются цифры для меток чтобы в них что-то можно далее вставить, всё
5) ну а далее для примера заполняем метки данными: Чай, Кофе, Потанцуем и в значение: tea, coffee, dance

В результате чего получается такой HTML
HTML5
1
2
3
<label><input type="radio" name="example" value="tea"> Чай</label>
<label><input type="radio" name="example" value="coffee" checked> Кофе</label>
<label><input type="radio" name="example" value="dance"> Потанцуем</label>
Добавлено через 17 минут
Вы скажете зачем это? Проще же просто на HTML написать.

А затем, что каждый раз придётся писать и в ручную текст менять и тд.

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

ЗЫ. Это простой пример. Но компонент может быть более сложный к примеру вопрос-ответ который раскрывается при клике и их может быть не 3, а 30 и тд. И нам не нужно каждый раз менять разметку, просто указываем нужное количество дублирования и заполняем данными по меткам, добавилось в базе вопрос-ответов скрипт автоматически сгенерирует нужное количество.
0
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
15.04.2024, 09:01
Цитата Сообщение от pgb Посмотреть сообщение
ЗЫ. Основной смысл моего фреймворка в том что будут подготовлены основные компоненты страницы такие как каркас(с сайдбаром и без при этом адаптивные под разные устройства), табы, аккордеоны, карточки товаров для магазина, для статей блогов, для форума сообщения, разные блоки и тд. при желании пользователь может и свои создавать, так же методы класса которые будут генерировать меню навигации и прочее. Пользователю просто останется указать в инструкции xml что надо разместить на той или иной странице, указать классы стилей(подготовлены специально, для цвета, бордюра, теней, таблиц и др.) т.е один и тот же компонент можно вставлять на страницу много раз и стилизовать по разному при желании, получить данные из базы через узел базы и заполнить компоненты данными. Всё.
Я эту цель понял давно, но я ее не учитываю при рассмотрении. Просто поясню почему. Я с проектами где такой подход достаточен не пересекаюсь совсем. Это отдельный срез проектов, как правило с низким бюджетом и , как следствие, относительно малыми запросами. Т.е. ориентируюсь на проекты, где достаточно средств, на реализацию задумок и хотелок - а они не унифицируются. Очень много задач по созданию модулей работающих "под капотом сайта". Так же на проектах где большой объем задач идет разделение фронта и бека, и фронт вообще работает на ноде, а не под apache/nginx. И уж точно владелец бизнеса у которого в день оборот лямов 15 не будет вообще сам чего то набирать.

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

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

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

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

Цитата Сообщение от pgb Посмотреть сообщение
А затем, что каждый раз придётся писать и в ручную текст менять и тд.
Смотря с чем сравнивать. В битрикс html + ограниченное количество функций php (конечно некоторые деятели тащат в шаблоны сложную логику - но это уже за скобками оставим, за это по рукам бить надо). И все. При этом, в отличии от твоего решения, по крайней мере я так понял, во время последнего раунда общения в дискорде, когда пришлось перетащить список новостей из htm в xml. - нет ограничения на вложенность этих компонентов. (но тут надо , конечно глубже изучать).Ведь я правильно понял что в htm уже не подключить что то другое (пока не смотрел это)?

Цитата Сообщение от pgb Посмотреть сообщение
Вы скажете зачем это? Проще же просто на HTML написать.
Не скажу, странно было бы если бы это не было возможно. Это везде так делают. (ну естественно по разном решаются), но ведь в этом и есть смысл шаблонизаторов и разбивки на компоненты.

Цитата Сообщение от pgb Посмотреть сообщение
При этом не нужно изучать мой инструмент как другие, есть всего навсего несколько правил для составления инструкции xml,

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

Добавлено через 22 минуты
Это все лирика - теперь ближе к практике. Фитбек со стороны разработчика взявшего твой инструмент на вооружение. В решении часто где используется паттерн одиночка. Вот такой код
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
namespace core;
/** Черта одного экземпляра класса */
trait singleton {
  private static $Inst;
  private final function __clone(){}
  /** Одиночка, ссылка на класс
   * @param mixed ...$arg аргументы для создания объекта
   * @return mixed ссылка на объект класса */
  public static final function &Loner(mixed ...$arg):mixed{
    if(self::$Inst===null)self::$Inst=new self($arg);
    return self::$Inst;
  }
}
Возвращает он тип mixed. что сразу делает невозможным использовать удобные функции навигации IDE. Т.е. если я получил экземпляр такого класса, то ИДЕ не подсказывает по методам. (собственно mixed - здесь не правильно, ведь int он ни когда не вернет, например)... Здесь правильным будет поставить возвращаемый тип "static". И тогда IDE уже начинает подсказывать.

Остальные уже дело вкусовщины, но полагаю тоже будет большинство сбивать с толку.

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

Далее, что мешает (немного но все же) это название метода Loner. В учебниках в подобной ситуации везде встречается getInstance - что очень точно отражает действие.
А тут получилась проблема двойного перевода. Т.е. singleton - переведен как "одиночка" - переведен в Loner. Т.е. с точки зрения языков не корректно. Ну да ладно. Это только язык хорошо знаешь. Но тут и логически. Т.е. если бы это был класс фабрики, и был бы метод противоположный. Типа вот мы запросили одиночку, а вот мы запросили противоположность ..... В общем не совсем понятно зачем идти против учебников и привычных знаний.


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

Добавлено через 52 минуты
хотелось бы несколько "вернутся" к словам с которых начался этот раунд тестирования

Цитата Сообщение от pgb Посмотреть сообщение
Ну то что я отладил работает явно лучше, я же когда делаю смотрю как у других сделано и думаю как что сделать чтобы было лучше чем у них, иначе какой вообще в этом смысл. А сталкиваясь на не доработки и сразу делать на этом выводы когда разработка ещё в самом разгаре так сказать это как минимум по дилетантски..
Цитата Сообщение от pgb Посмотреть сообщение
Работа с xml инструкцией я считаю полностью готова, в будущем возможны переделки для добавления дополнительных возможностей(например новые команды движка),

Я затестил (правда по _dup не до конца) две конструкции. И пока имеем:
в _vfor есть устаревший код, который, как я понял ты собирался выкинуть, и баги (кстати, не забудь попраить работу с "<" и "<=".
В _dup баг (который ты поправил) и тоже есть старый код или что то оставшееся от тестов.


Т.е. вероятно пока дальше нет смысла тестить пока. (ну точнее нет смысла мне )

Кстати вот вы убрали вызов spoof сколько тестов вы провели? Уверены, что другая инструкция не отвалилась.

Вообще все проблемы кода с которым столкнулся на 100% решаются стандартными инструментами разработчиков, которые вы игнорируете.

Ситуацию со вызовом spoof сломавшим _dup, ситуацию с регуляркой сломавшей "<" и "<=" на 100% гарантировано решают автотесты.

Ситуацию с "Я что-то тестил, видимо забыл убрать, там не должно быть Spoof`a" так же решает и git. т.е. надумали что то затестить, создали ветку "testMyFeature" - попробовали. Если не понравилось - прибили, понравилось замерджили в основную.

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

Правда одно но. Я ради спортивного интереса попробовал тесты сделать для вашего кода. И прям вот юниттесты уже на все не сделаешь, ввиду того что нет у вас четкой архитектуры кода (не путайте только как в прошлый раз со структурой сайта - именно внутренняя архитектура самого решения). Прям рекомендую почитать про шаблоны GRASP и в частности понятия "low coupling high cohesionlow" (не пугайтесь слова "шаблоны" вникните в суть о чем они) - реально можете себе серьезно упростить разработку и сэкономить массу своего времени в итоге.

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

В общем подожду, потом, когда решите, что решение уже достаточно готово, готов буду вернуться к тестированию и попробовать сравнить быстродейстиве на одной и той же задаче. на Битрикс vs на вашем
0
 Аватар для pgb
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
15.04.2024, 10:39  [ТС]
Насчёт лирики.
Цитата Сообщение от voral Посмотреть сообщение
Я с проектами где такой подход достаточен не пересекаюсь совсем. Это отдельный срез проектов, как правило с низким бюджетом и , как следствие, относительно малыми запросами. Т.е. ориентируюсь на проекты, где достаточно средств, на реализацию задумок и хотелок - а они не унифицируются. и далее по тексту..
Для простого пользователя не разработчика, любое приложение, сайт и др. рассматриваются с точки зрения полезности, удобства и скорости работы, всё остальное это лирика, что там под капотом и прочее мало кого интересует. Так что если проекты и сайты на моём инструменте будут выполнять необходимые для простого пользователя задачи лучше чем на других, то предпочтение будет у него, вот и всё.

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

Насчёт практики.
Цитата Сообщение от voral Посмотреть сообщение
При этом осталась возможность сделать второй инстанс через сериализацию/десериализацию - а необходимость такого шага (сериализовать временно объект, а потом восстановить) - достаточно вероятна
Можно пример?

Добавлено через 30 минут
Насчёт GRASP и архитектуры продукта.

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

У меня архитектура рассчитана на гибкое изменение и не имеет жёстких представлений моделей сущностей и методов работы с ними, своего рода пластилин, чего хочешь, то и лепишь в отличии от смолы которая только на стадии изготовления пластична, а потом только разбивать приходится чтобы что-то из неё достать.. что собственно в статичных архитектурах и происходит зачастую.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.04.2024, 10:39

Предлагаю подорвать движок трекера в месте
Привет всем Я собираюсь открыть проект название YT В общем это движок торрент трекера, вы так же можете установить демо движка ...

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

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

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

Предлагаю сотрудничество JS программисту
Здравствуйте. Я фрилансер и в основном программирую на php, немного на JS. Также занимаюсь версткой. Ищу JS программиста (можно и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
120
Ответ Создать тему
Новые блоги и статьи
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её. Всё это стресс конечно. Почему?. . .
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru