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

Обсудите разработку моего фреймворка

26.05.2022, 12:01. Показов 22909. Ответов 308
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую всех веб-мастеров!

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

Начал записывать видео с объяснением как что делается. Хочется получать обратную связь от людей кто занимается веб-разработкой. На данном этапе интересуют предложения по настройке контрольной панели и дизайна.

Хочется найти единомышленников кто хочет делать сайты на таком фреймворке, таким могу дать скрипт фреймворка если увижу заинтересованность в сотрудничестве.
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.05.2022, 12:01
Ответы с готовыми решениями:

Обсудите моё задание (Страуструп Б.) Последовательности слов
Обсудите моё задание (Страуструп Б. Язык программирования С++. Специальное издание, 3-изд. Бином.2004) 145 ст. задание 11. ...

обсудите решение беспроводной сети...кто чем может...
День добрый...начну с описания ситуации: имеются два объекта примерно на расстоянии 4-5 км...проблема в том ,что нет прямой видимости...

Шел n-й год(n нечетное число).Цифры моего возраста совпадают с двумя последними цифрами года моего рождения.По вводимому n определить наши годы рожден
Program test uses crt; var n,g,d,f:integer; begin clrscr; writeln('vvedite nineshniy god,nechetnii'); readln(n); g:=n mod...

308
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
10.03.2023, 17:57
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от pgb Посмотреть сообщение
Головой своей подумай, я объяснять и разжёвывать не собираюсь.
Говори точнее - ты не можешь ни чего сказать толкового, т.к. знаний не хватает. То что ты ни когда ни чего не можешь показать на практике это и демонстрирует.... И это может проверить любой в песочнице которую я органзовал.
0
Эксперт .NET
 Аватар для Usaga
14370 / 9471 / 1360
Регистрация: 21.01.2016
Сообщений: 35,741
10.03.2023, 18:04
Цитата Сообщение от pgb Посмотреть сообщение
Я уже зарекался не отвечать и заниматься своим делом
Ну так держись своего обещания. Всё равно ты конструктивно общаться не можешь. Вопросов избегаешь. Гонишь ересь. Просто молча продолжай создавать свой фреймворк для себя любимого. В чём проблема?
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,696
Записей в блоге: 29
10.03.2023, 18:06
Цитата Сообщение от pgb Посмотреть сообщение
Головой своей подумай, я объяснять и разжёвывать не собираюсь.

Не по теме:

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


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

я вот никакого самолюбия не тешу, примеры выше посмотрел, мне показалось что вполне обосновано все написано, если есть существенные неточности -отразите их пожалуйста, приведите примеры.
0
Эксперт .NET
 Аватар для Usaga
14370 / 9471 / 1360
Регистрация: 21.01.2016
Сообщений: 35,741
10.03.2023, 18:12
Welemir1, мне кажется, что взывать к совести и принципам... подростка бесполезно. Он уже понял, что обосрался. Но он не умеет себя в такой ситуации вести (как и многие) и потому переходит на "я ржунимагу". Лёгкая истерика, в общем.
0
Эксперт JS
 Аватар для DrType
6553 / 3624 / 1075
Регистрация: 07.09.2019
Сообщений: 5,877
Записей в блоге: 1
10.03.2023, 18:42
Не пора ли переименовать тему в Не обсуждайте разработку моего фреймворка?
1
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,696
Записей в блоге: 29
10.03.2023, 18:54
Цитата Сообщение от DrType Посмотреть сообщение
Не обсуждайте разработку моего фреймворка
в точку!
0
4 / 10 / 0
Регистрация: 01.11.2022
Сообщений: 191
Записей в блоге: 156
10.03.2023, 20:51
Цитата Сообщение от pgb Посмотреть сообщение
сделать сайты на своём фреймворке и тогда сравните качество, скорость, удобство и тд.
Не совсем понятно, о чём идёт речь. "Качество, скорость и удобство" относится к сайту или фреймворку?
0
 Аватар для pgb
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
10.03.2023, 23:32  [ТС]
Цитата Сообщение от voral Посмотреть сообщение
Говори точнее - ты не можешь ни чего сказать толкового, т.к. знаний не хватает. То что ты ни когда ни чего не можешь показать на практике это и демонстрирует.... И это может проверить любой в песочнице которую я органзовал.
Во-первых в песочнице не весь функционал. Во-вторых некоторые твои утверждения даже песочница не подтверждает, например что скобки не поддерживаются. В-третьих like и др. опции отбора реализуются отдельно, просто у меня они закомментированы и я их вырезал. В-четвёртых неправильно прописываешь параметры поэтому у тебя и ерунда получается.
Хотя надо сказать натолкнул меня на мысль как доработать и сделать лучше.
Цитата Сообщение от DrType Посмотреть сообщение
Не обсуждайте разработку моего фреймворка?
Лучше бы обсуждали, что и как лучше сделать, но у вас мозгов хватает только гниль свою тут выставлять.. и плеваться в мою сторону.
Цитата Сообщение от Reglage Посмотреть сообщение
Не совсем понятно, о чём идёт речь. "Качество, скорость и удобство" относится к сайту или фреймворку?
И фреймворка и сайтов на нём.

ЗЫ. С визуальным редактором почти разобрался, последний штрих остался. Контрольную панель донастрою, а может и в процессе создания сайтов буду доделывать. Короче уже скоро буду писать скрипты сайтов.
0
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
11.03.2023, 01:15
Цитата Сообщение от pgb Посмотреть сообщение
Во-вторых некоторые твои утверждения даже песочница не подтверждает, например что скобки не поддерживаются.
PHP
1
2
$request['WHERE'] = '(age=123 | age=34) & id = 10';
// выдало ( `age`=123 OR  `age`=34) & id = 10
Что выдаст запрос таким where?

Цитата Сообщение от pgb Посмотреть сообщение
Во-первых в песочнице не весь функционал
Весь который строит WHERE (за исключением IN). Либо ты солгал и привел не полную "цепочку вызовов"

Добавлено через 1 минуту
Цитата Сообщение от pgb Посмотреть сообщение
В-третьих like и др. опции отбора реализуются отдельно
Т.е другие фреймворки ты ругаешь за то что там "много лишнего". А тут отдельно - но в привденой цепочке их нет, т.е. там вообще на Load. Т.е. есть несколько идентичных по сути методов, с немного отличающимся функциналом?

Добавлено через 37 секунд
Цитата Сообщение от pgb Посмотреть сообщение
Хотя надо сказать натолкнул меня на мысль как доработать и сделать лучше.
В этом я даже не сомневаюсь. Т.к. даже в рамках реализуемого функционала - есть косяки и я их конкретно указал

Добавлено через 3 минуты
Цитата Сообщение от pgb Посмотреть сообщение
просто у меня они закомментированы и я их вырезал
Т.е. вы опять продемонстрировали "устаревшую версию" как было год назад, когда я указал на косяки в коде на github ?
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,696
Записей в блоге: 29
11.03.2023, 07:26
Цитата Сообщение от pgb Посмотреть сообщение
просто у меня они закомментированы и я их вырезал
как только всплывают косяки -версия объявляется устаревшей и урезанной.))) ай да молодец- текущих версий нет, есть только урезанные всегда.
0
Эксперт .NET
 Аватар для Usaga
14370 / 9471 / 1360
Регистрация: 21.01.2016
Сообщений: 35,741
11.03.2023, 07:37
Welemir1, и косяки только в той части кода, которую он показал. В других косяков нет)
0
 Аватар для pgb
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
11.03.2023, 07:50  [ТС]
Цитата Сообщение от voral Посмотреть сообщение
Либо ты солгал и привел не полную "цепочку вызовов"
Я не лгу, цепочка полная, но я же говорил, что есть ещё некоторая обработка в классе сущности, поэтому в драйвере базы упрощено(я так сделал для себя не подумав, что пользователь может что-то напортачить при загрузке сущности) и я ещё ведь не закончил разработку, могу переделать в любое время, ну займёт несколько дней, может неделю и все твои старания меня тут принизить уйдут в небытиё. Хотя опять же отдаю тебе должное за старания, знаю теперь как сделать получше для будущих пользователей моего фреймворка.
Цитата Сообщение от voral Посмотреть сообщение
Т.е другие фреймворки ты ругаешь за то что там "много лишнего". А тут отдельно - но в привденой цепочке их нет, т.е. там вообще на Load. Т.е. есть несколько идентичных по сути методов, с немного отличающимся функциналом?
Не то что их нет, я просто ещё не окончательно всё настроил, ты же видел когда мы общались, что у меня ещё в комментах был код и тд., я просто его убрал, когда тут показывал цепочку функций вызовов, и чтобы видеть полную картину нужен весь код, например что у меня все запросы в основном формируются автоматически в зависимости от связей и тд. добавления, обновление, удаление и др. единственное это вот конечно при загрузке надо додумать, сделать более удобно. К тому же это только автоматическая работа с сущностями, любую другую выборку и работу с базой можно делать напрямую, для удобства можно конечно класс написать для формирования запросов, на данный момент такого нет, но уже знаю как сделаю.
Цитата Сообщение от voral Посмотреть сообщение
В этом я даже не сомневаюсь. Т.к. даже в рамках реализуемого функционала - есть косяки и я их конкретно указал
Косяков нет, опять же повторюсь, я делал для автоматизации работы с сущностью чтобы было без всяких запросов к базе данных, чтобы работать как с простым объектом. Загрузку ещё не до конца доделал, разные параметры и тд. оказалось, что и к лучшему, чуток переделаю чтобы было более автоматизировано, то есть без передачи массива параметров $request.
Цитата Сообщение от voral Посмотреть сообщение
Т.е. вы опять продемонстрировали "устаревшую версию" как было год назад, когда я указал на косяки в коде на github ?
На этот раз текущий вариант.
0
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
11.03.2023, 16:25
Цитата Сообщение от pgb Посмотреть сообщение
не лгу, цепочка полная, но я же говорил, что есть ещё некоторая обработка в классе сущности
Ну а с чем тогда сравнивать? Мне из фреймворков тоже куски вырезать? тут же есть вот мы запросили данные у публичного метода, и вот смотрим как код который строит строку sql запроса.

Цитата Сообщение от pgb Посмотреть сообщение
я ещё ведь не закончил разработку
Вы вроде говорили, что осталось только редактор доделать.

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

Цитата Сообщение от pgb Посмотреть сообщение
Не то что их нет, я просто ещё не окончательно всё настроил, ты же видел когда мы общались, что у меня ещё в комментах был код
1 Код в комментах это ужасно, и эту проблему тоже решают при помощи git.
2. код в комментах это не "работающий функционал".


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

В данном случае, стоит допустить ошибку синтаксиса в начале и все..


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

Добавлено через 30 минут
Глава 2 Часть 4. (продолжаем разбирать Request)

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

И завершает метод строка

PHP
1
return $sql = 'SELECT ' . $fld . ' FROM `' . self::$table . '`' . $sql . ';';
Тут по сути совсем лишняя переменная $sql (скорее всего просто осталась после отладки). Тут напрягает наличие обращения к статической переменной $table. При этом в объекте класса есть свойство $name - означающее то же самое. Т.е. значение первого параметра из вызова Load попадает в эти два свойства (одно из которых статическое). Т.е. с точки зрения ООП здесь явно какая то фигня, по моему скромному мнению, у автора отсутствует понимание как и что использвоать. В итоге каша из статических и не статических свойств. (скорее всего сделан был костыль однажды "чтоб не вспоминать", в итоге получилось так как получилось. Но в итоге с такими методами унаследоваться от этого класса черевато (а наследоваться тут желательно, что бы иметь возможность расширить функционал). Тут бы на полный код посмотреть, но, как минимум этот класс должен быть финальным и не допускать наследования. Т.к. многие методы явно имеют сайд эффекты т.к. автор считает это нормальным.


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

Т.е. судя по этому методу, если мы имеем самый простой новостной сайт у которого есть много статей и лайки (возьмем в просто варианте, просто число в таблице статей), то чтобы отобрать 10 статей отсортированных по убыванию лайков. то придется получить их все (хоть миллиард), отсортировать средствами php ну и вывести 10. Без условно это сделать "просто"... Но стоит ли тут говорить о производительности?

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

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

Метод формирования строки sql запроса (причем конкретно select) называется Request. Подавляющее большинство разработчиков под Request понимают то, что к нам прилетело из вне. Т.е. это тот самый запрос, который запустил выполнение нашего кода. Запрос в базу это знают как Query.

Т.е. информативное название метода было бы типа buildSelectQuery в данном случае нам надо смотреть либо доку либо вообще в код лезть, чтоб понять

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

Справедливости ради отмечу. После одного из наших "перепалок" pgb узнал про phpDoc и комментарии в этом формате. И при общении в Discord я видел что они есть (тут они не приведены - не знаю есть ли они в коде). Причем pgb даже написал, что он узнал об этом из общение. Т.е. искренне ставлю два плюса в карму, что при таком характере все же умеет быть адекватным

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


Архитектура
В этом методе Request (создающем исключительно select) мы увидели что выражение where строится в нем. А ведь есть еще delete и update где тоже должны быть where. Т.е. там либо копипаста либо вообще есть свои правила и ограничения. Т.е. тут явно нарушение принципов ООП, да в общем то и даже если без ООП тут просто обязана была бы быть выделенная функция.
0
321 / 189 / 78
Регистрация: 04.10.2016
Сообщений: 809
11.03.2023, 17:59
Цитата Сообщение от voral Посмотреть сообщение
уйдет еще лет 5 в самом оптимистичном случае
c таким подходом к реалиям, уж точно...
тут, по идеи, тему должны были забросить уже через пару месяцев, а тут вон оно как...

Не по теме:


уфф, тема флеймовая...



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

зачем вообще было устраивать эту "игру слов"??

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

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

ИМХО: если бы вы писали свой фреймворк, его использовали (хотя бы на фрилансе) в разработке сайтов/веб-приложений, имели бы положительные отзывы и работу фреймворка в продакшене, а после провели анализ и подготовили демонстрацию/презентацию/итдитп своей "поделки" с аргументацией, то вот тогда, возможно, вы бы нашли единомышленников.

ИТОГ: повторюсь. тема - флейм. вангую... через год либо исчезните с радара, либо все останется на словах (кроме вас и ваших "единомышленников" больше в эту "работу" руки прикладывать не будет).
0
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
12.03.2023, 17:43
Глава 3 Select -публичный метод выполнения запроса
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  public function Select(?array &$data, string $table, array $request = [])
  {
      if ($this->Table($table)) {
          $this->Execute($this->Request($request), true);// в методе Request формируем Sql запрос
          if (is_null($data)) {
              $sgn = false;
              $data = ['fields' => $request, 'values' => []];
              if ($val = $this->differ['COMMENT'] ?? false) $data['access'] = trim($val, '\'');
          } else $sgn = true;
          $arr = $this->Fetch();
          $kid = isset($request['id']);
          foreach ($arr as $key => $val) {
              if ($kid) {
                  $key = $val['id'];
                  unset($val['id']);
              } else $key++;
              $data['values'][$key] = $val;
          }
          if ($sgn) ksort($data['values']);
      }
  }


PHP
1
2
3
if ($this->Table($table)) {
    //.....
}
Вероятно идет проверка существования таблицы, подтягивание информации о существующих в таблице полях, вероятно имя таблицы заносится в статическое свойство класса $table.
Проблема тут явная в том, что если таблицы нет (например опечатка), то скрипт продолжит работу пока не свалится в каком то месте дальше. Что явно потенциально усложняет отладку на проектах

PHP
1
$this->Execute($this->Request($request), true);
Т.к. автор не показал Execute в цепочке значимых вызовов, значит там "особой" логики, просто вызов встроенных методов по работе с БД. Но есть какой то флаг. Беда данного
кода в том, что после этой строки по сути $request = $request['fields']. т.е. скрытая модификация входного параметра
PHP
1
2
3
4
5
 if (is_null($data)) {
     $sgn = false;
     $data = ['fields' => $request, 'values' => []];
     if ($val = $this->differ['COMMENT'] ?? false) $data['access'] = trim($val, '\'');
 } else $sgn = true;
Если первым параметром передать NULL то data заполняется по умолчанию... вот почему бы тут не сделать было просто
PHP
1
     $data = ['fields' => $request['fields'], 'values' => []];
вместо странной обязанности у метода Request....

PHP
1
     if ($val = $this->differ['COMMENT'] ?? false) $data['access'] = trim($val, '\'');
Так же узнаем что в data может быть что то про доступы. Достпупы, подозреваю, храняться в комментарии в БД к таблице (но это не точно).
Но что делает код точно не возможно определить без исследований - что говорит о том, что разрабатывать на таком фреймворке быстро, можно только
если зазубрить доку и весь код. Иначе будет много вопросов и нежданчиков.

PHP
1
2
3
4
5
6
7
8
9
10
    
          $arr = $this->Fetch();
          $kid = isset($request['id']);
          foreach ($arr as $key => $val) {
              if ($kid) {
                  $key = $val['id'];
                  unset($val['id']);
              } else $key++;
              $data['values'][$key] = $val;
          }
Если вы добавите в запрашиваемые поля id. И захотите увидеть это поле... Фиг вам.... это "модификатор". он заставляет заполнять массив выбранных записей с ключом равным ид записи.
А само поле будет отсутствовать в запсии. (ну "ок" - есть ключ, если надо сами подклеим обратно)

Если id не передали, то массив вернется с нумерацией начинающейся с 1. Сомнительное решение (скорее всего костыль для чего то)

Интересно, а автор знает, что первиченый ключ не обязательно состоит из одного поля.....

PHP
1
if ($sgn) ksort($data['values']);
Если методу был передан параметр то произойдет сортировка массива записей по ключу.... Прикиньте какая разница будет между идентичными запросами,но в одном мы запросили id, а в другом нет.. Т.е. мы обязаны знать реализацию метода, чтоб им пользоваться.

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

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

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

Методы Execute и Fetch наследуются от класса PDO для работы с БД. В переменной $data ссылка на данные сущности. $data['access'] это доступ для работы с сущностью для того узла в котором была создана сущьность, другие узлы не смогут с ней работать, можно отключить доступ, тогда любой узел сможет работать с такой сущностью.
0
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
13.03.2023, 10:16
Цитата Сообщение от pgb Посмотреть сообщение
ут разработано так чтобы работая с сущностью не надо было составлять никаких запросов к БД поэтому формирования запросов на создание
При чем тут ООП?

Я и рассматриваю все это как QueryBuilder - это типовое решение в любом фреймворке. Про непонимание ООП именно показывает именно то КАК вы это делаете, а не ЧТО

Добавлено через 11 минут
Т.е. даже с сохранением ваших подходов, при грамотном ООП у вас бы получилось более лаконично, читабельно, меньше кода, более читабельно и т.д. и т.п

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

Цитата Сообщение от pgb Посмотреть сообщение
для тестовых моих задач работает хорошо,
но, похоже они далеки от реальных. Представьте новостной сайт, в котором 20 новостей в день добавляется, 10 лет работы. У вас на странице два компонента:
5 самых пролайканых новостей, 20 последних новостей. Т.е. показанные методы для этого точно не годятся. Т.е. вы два раза вытащите из базы все 36500 записей. И даже если будет два блока по 5 самых пролайканых новостей, все равно два запроса по 36500 записей.
0
 Аватар для pgb
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
13.03.2023, 10:33  [ТС]
Цитата Сообщение от voral Посмотреть сообщение
Обратите внимание у вас объект вечно мутирует. Т.е. при нескольких запросах, теряются данные по предыдущему запросу. (перезаписываются, дописываются и т.д. и т.п.). Да хотя бы поясните зачем хранить имя таблицы из последнего запроса в статическом свойстве класса и в свойстве объекта, тем более если они перезаписываются при каждом запросе.
Вы не знаете как работает ссылка? Ничего не перезаписывается, а дополняется или изменяется. Имя таблицы просто при проверке запоминается в свойстве драйвера чтобы внутренние методы знали с какой таблицей работают чтобы в каждый метод не передавать имя таблицы и тд.
Цитата Сообщение от voral Посмотреть сообщение
похоже они далеки от реальных. Представьте новостной сайт, в котором 20 новостей в день добавляется, 10 лет работы. У вас на странице два компонента:
5 самых пролайканых новостей, 20 последних новостей. Т.е. показанные методы для этого точно не годятся. Т.е. вы два раза вытащите из базы все 36500 записей. И даже если будет два блока по 5 самых пролайканых новостей, все равно два запроса по 36500 записей.
Опять же вы чего-то выдумываете и утверждаете, что так и есть. На самом деле с простой выборкой справляется хорошо и не будет вытаскивать "36500 записей", будут выбраны те что нужны, кроме того автоматически подтянутся и данные из таблиц с которыми есть связи.
0
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
13.03.2023, 11:05
Глава 4 Load - публичный метод "загрузка" данных
Пояснение к методу от автора " метод Load в классе работы с сущностью".....
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// метод Load в классе работы с сущностью
public  function Load(string $name, array $request = []): Entity
{
    if ($this->Exist($name)) {
        $this->name = $name;
        $this->dent =& self::$ents[$this->source][$name];
        if (is_null($this->dent)) $this->dent = new Portion(
            $this->Data->Portion($name, $this->source)
        );
        $this->driver->Select($this->dent->md, $name, $request);// тут запрос передаётся драйверу MySql
        $this->Sort('');
    } else $this->name = '';
    return $this;
}


Проверка наличия таблицы
PHP
1
2
3
    if ($this->Exist($name)) {
///...
    } else $this->name = '';
Проверяем наличие таблицы. Нафига это делать два раза за цепочку вызовов? (второй в Select) легко свести к одному.
Кеширование
PHP
1
2
3
4
$this->dent =& self::$ents[$this->source][$name];
        if (is_null($this->dent)) $this->dent = new Portion(
            $this->Data->Portion($name, $this->source)
        );
А вот и "кеширование". Это "кеширование" только в рамках хита. Причем именно кеширование в кавычках. Допустим нам "в рамках хита" - это то .что нужно по каким то причинам. Но все равно есть серьезные проблемы.

Кеш ни как не зависит от входных параметров. Точнее зависит от имени таблицы, от какого то свойства source и все... Т.е. конфиг выборки по боку и получится фигня. Допустим имеем таблицу и в ней записи
Code
1
2
3
1 | Яблоко
2 | Груша
3 | Помидор
Выполняем код
PHP
1
2
$dataFirst = $this->Base->Load('book', ['WHERE' => 'ID>1','fields' => ['name']]);
$dataApple = $this->Base->Load('book', ['WHERE' => 'NAME=Яблоко','fields' => ['id','name']]);
После первого в кеше
Code
1
2
1 => Груша
2 => Помидор
После второго (мы запросили с id) в кеше
Code
1
2
1 => Яблоко
2 => Помидор
так же напомню, что в приведенном выше коде, после первой строки обязательно надо забирать данные, иначе они будут затерты.

Сортировка
PHP
1
$this->Sort('');
Что то про сортировку, как работает хз, но точно этим не управляет разработчик использующий фреймворк

Кеширование 2
Вновь про "кешированние". Предположим оно есть.Но оно не спасает от повторных запросов. т.е.
PHP
1
2
$dataFirst = $this->Base->Load('book', ['WHERE' => 'ID>1','fields' => ['name']]);
$dataSecond = $this->Base->Load('book', ['WHERE' => 'ID>1','fields' => ['name']]);
Запрос в базу будет выполнен два раза. (привет производительность еще раз)

Кеширование долгое
Во время общения в дискорде, я озвучил какое кеширование необходимо. Конечно же услышал "Это сделать легко за 5 минут"
А в качестве демонстрации сохранение данных в конфиг с помощью штатных классов фреймворка. Но объем данных пихать в один файл, при этом как решать вопросы протухания, чистки кеша.
К примеру у меня в работе есть проект порядка 200тыс товаров - робот прошелся по каталогу. Что у нас с файлом кеша будет?


Как итог. Вот этот метод это по сути кеширующая обертка над Select. Т.е. вероятнее было бы более красиво реализовать это следующим образом

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
interface CacheServiceInterface {
   public function get(array $cacheProps, callable $getter):mixed;
}
final class Entity {
     public function __construct(
        private readonly CacheServiceInterface $cacheService
     ) {
 
     }
 
     public function Load(string $tableName, array $request = []): QueryResult
     {
         return $this->cacheService->get([$tableName,$request],[$this,'Select']);
     }
 
     public function Select(string $tableName, array $request = []): QueryResult
     {
 
     }
}
Т.е. тут кеширование вы можете реализовать свое, а я подставлю свое (например с возможность хранить в памяти с заданным временем), а кто то другой будет хранить вообще по своему.....
а метод Load становится совсем лаконичным. При этом методы возвращают не саму начальную сущность. А новый объект - результат работы запроса. И этот объект не меняется следующим запросом. В прочем, если вам это очень надо. то вы это можете спокойно реализовать в своем сервисе отвечающем за кеширование.

Добавлено через 5 минут
Цитата Сообщение от pgb Посмотреть сообщение
Вы не знаете как работает ссылка? Ничего не перезаписывается, а дополняется или изменяется.
ВЫ не внимательно смотрите примеры. Почитате, вот что я только что выше написал:
Два запроса подряд с разным фильтром, не должны ни перезаписывать ни дописывать.
Два запроса подряд с одинаковым фильтром, не должны вызывать два обращения к базе данных. Как раз во второй раз должно просто подгрузится.

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

Добавлено через 1 минуту
Цитата Сообщение от pgb Посмотреть сообщение
Имя таблицы просто при проверке запоминается в свойстве драйвера чтобы внутренние методы знали с какой таблицей работают чтобы в каждый метод не передавать имя таблицы и тд.
1 они могут узнать это из свойства name объекта. У вас во всех методах этого класса доступны
PHP
1
2
self::$table
$this->name
и они равны

Добавлено через 6 минут
Цитата Сообщение от pgb Посмотреть сообщение
Опять же вы чего-то выдумываете и утверждаете, что так и есть. На самом деле с простой выборкой справляется хорошо и не будет вытаскивать "36500 записей", будут выбраны те что нужны,
Ок.напишите как будет выглядеть вызов Load. Для задачи. Отобрать 10 самых новых (по дате начала активности) статей в которых в названии есть слово apple
SQL
1
2
3
4
5
6
CREATE TABLE news(
  id INT AUTO_INCREMENT PRIMARY KEY,
  active_from datetime,
  name VARCHAR(1024)
)
SELECT* FROM news WHERE name LIKE '%apple%'ORDER BY active_from DESC LIMIT 10
Добавлено через 1 минуту
а like не работает же. ок. пусть будет где название равно apple - в данном случае не суть важно

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

Добавлено через 1 минуту
Вообще тебе стоит почитать про антипаттерн Божественный объект (God object) и почему это плохо.

Ну, а автоматическая подгрузка зависимостей.... А ее можно отменить?

А то в сложной нормализованной базе может быть очень большая иерархия.

Добавлено через 1 минуту
Цитата Сообщение от pgb Посмотреть сообщение
не будет вытаскивать "36500 записей"
Т.е. суть в том, что не видно что бы у вас была возможность управлять сортировкой, а в данной задаче она крайне важна.
0
 Аватар для pgb
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
13.03.2023, 11:20  [ТС]
Цитата Сообщение от voral Посмотреть сообщение
Нафига это делать два раза за цепочку вызовов? (второй в Select) легко свести к одному.
Что два раза? Что свести к одному? Опять что-то выдумываете..
Цитата Сообщение от voral Посмотреть сообщение
Вновь про "кешированние". Предположим оно есть.Но оно не спасает от повторных запросов. т.е.
Во-первых, зачем делать повторные запросы? Во-вторых данные есть уже в сущности после запроса и их наличие можно проверить и обработать.
Цитата Сообщение от voral Посмотреть сообщение
Во время общения в дискорде, я озвучил какое кеширование необходимо. Конечно же услышал "Это сделать легко за 5 минут"
Да, можно запомнить данные сущности и когда нужно получить. Это всё делается очень просто.

Далее какой-то бред, даже комментировать не буду..
Цитата Сообщение от voral Посмотреть сообщение
self::$table
$this->name
и они равны
Иногда равны. Это разные переменные в разных классах. self::$table это статичное свойство в классе драйвера MySql текущей таблицы с которой работает драйвер. $this->name это имя сущности в классе работы с сущностями соответствует таблице в БД с которой может работать драйвер базы.

Добавлено через 7 минут
Цитата Сообщение от voral Посмотреть сообщение
SELECT* FROM news WHERE name LIKE '%apple%'ORDER BY active_from DESC LIMIT 10
как то так
PHP
1
2
3
4
5
6
7
$this->Base->Load('news',[
  'WHERE'=>'name',
  'LIKE'=>'%apple%',
  'BY'=>'active_from',
  'DESC'=>true,
  'LIMIT'=>10
]);
Ну сейчас у меня выборка не доработана, да и хочу переделать немного.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.03.2023, 11:20

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

Выбор 3d фреймворка
Приветствую! Стоит задача сделать модель интерьера кухни для браузера. Всякого разного для этих целей добра пруд пруди. После длительного...

Логирование фреймворка
Глупый вопрос. Имеется достаточно сложная (в плане кода) ООП CRM. При выполнении той или иной операции подтягивается туча разных...

Выбор фреймворка
Здравствуйте. Подтянул PHP и созрел для изучения фреймворка. Я понимаю, что вопрос вкуса, но: 1. Какой фреймворк проще для...

Составные фреймворка
Что означают такие составные фреймворка: ● Front Controller ● Loader ● Routing ● Dependency Injection ● ActiveRecord ...


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

Или воспользуйтесь поиском по форуму:
280
Ответ Создать тему
Новые блоги и статьи
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат» Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru