Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
Заблокирован

PHP приложение на чистом процедурном стиле

27.09.2018, 20:54. Показов 5326. Ответов 55

Студворк — интернет-сервис помощи студентам
Доброго времени суток! Изучаю пхп и пытаюсь написать что то большое. Но пока не изучил ООП. Все говорят что можно большие приложения и без ООП написать. Но не смог найти примеры таких реализации. Что имело бы единую точку входа, использовало что то вроде роутинга и легко поддерживался и расширялся. Если кто нибудь знает где найти, имеет соображения или имеет какие то исходники прошу поделиться?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.09.2018, 20:54
Ответы с готовыми решениями:

Создание движка только на процедурном стиле
Хочу создать приличный движок на процедурном без ООП. Каковы будут последствия? :umnik:

[Mono] Приложение на чистом .Net и Mono
Здравствуйте! Подскажите, правильно ли я понял? Не обязательно приложение писать на моно, а можно готовое (на .Net) запустить там, где есть...

Оконное приложение на чистом Win API
Один японец сделал, ради демки, оконное приложение на чистом Win API. Win API совсем не функциональное, и в нём есть сложность, связанная с...

55
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
06.10.2018, 09:41
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Fedor Vlasenko Посмотреть сообщение
на сегодняшний день вы до этой стадии не дошли, это факт
И откуда же вы взяли этот факт?

Цитата Сообщение от Fedor Vlasenko Посмотреть сообщение
вы глубоко ошибаетесь я же написал выше
Я тоже написал выше. Тренд виден и по вакансиям, и по проектам на гитхабе, и по развитию самого PHP. Вот это факт.

Цитата Сообщение от Fedor Vlasenko Посмотреть сообщение
есть разные задачи и разные решения для этих задач, решение, язык, реализацию выбирает программист исходя из своего опыта
если вы видите решение только в ООП, то это говорит о ваших знаниях и подходе
Это и есть ваши факты? Видимо вы не внимательно читали и приписываете мне свои фантазии.
1) О других языках я не говорю.
2) Решать всё только на ООП я не предлагал.
3) Я против более менее сложных проектов чисто на процедурках в PHP.

Цитата Сообщение от Fedor Vlasenko Посмотреть сообщение
другой может это решить красивее и изящнее
Превосходно, пример будет?

Цитата Сообщение от Fedor Vlasenko Посмотреть сообщение
исходя из своего опыта
Я правильно вас понял, вместо сравнения стиля программирования вы предлагаете сравнивать опыт? Для меня это звучит как "вместо сравнения автомобилей, мы будем сравнивать водителей". Утрируя, особо опытный чувак и на ассемблере круче всех напишет.
0
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
06.10.2018, 13:46
Цитата Сообщение от tarasalk Посмотреть сообщение
Невменяемым вам это кажется потому что на в процедурном стиле это будет та еще жесть, тогда как для ООП это тривиальная задача.
Неужели не понятно, что приведённый код - бред? Причём человек его скопипастил и даже ссылку умудрился привести кривую.. Дайте нормальный пример ООП. Обьясните преимущества на пальцах, а я так и быть сделаю на процедурном, как положено, без вашего оопного бреда.

Цитата Сообщение от tarasalk Посмотреть сообщение
Вот тут неплохо описаны некоторые из проблем, про которые я говорю.
Почитал. Там такие пёрлы про процедурный стиль, что уши в трубочку сворачиваются.. Видимо человек никогда не кодил по настоящему. Пример:
ПП: Для нового объекта учёта, полностью с “нуля” создаётся всё новое и функции и форма.
ООП: Мы просто создаём новый класс Склад, наследуя всё необходимое от класса
Ну это же бред! БРЕД! У меня будут компоненты, которыми пользуются все остальные и "склад" и "квартира" и многое другое. Причём будут пользоваться дозированно, только тем, чем им самим необходимо, а не как у вас, где наследуется много лишнего.
Цитата Сообщение от tarasalk Посмотреть сообщение
Тем не менее нормальных примеров предоставлено так и не было.
Вы нормальный пример ООП приведите, пожалуйста. Только без выкрутасов типа я ещё и так могу. Без конкретного обращения к базе, без конкретики. Только структуру кода и что это даёт. Просто для демонстрации подхода. Обьясните подробно преимущества своего подхода. А мы подтянемся и обьясним свои преимущества.
1
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
06.10.2018, 15:42
Цитата Сообщение от CoderHuligan Посмотреть сообщение
У меня будут компоненты, которыми пользуются все остальные и "склад" и "квартира" и многое другое. Причём будут пользоваться дозированно, только тем, чем им самим необходимо, а не как у вас, где наследуется много лишнего.
Ну т.е. вы изобрели свои классы и назвали их компонентами, круто чё. С чего вы взяли что ваши компоненты работают значительно быстрее чем нативные классы совершенно не понятно.

Смотрим сравнение скорости функций и схожий вызов через класс.
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
<?php
 
// просто функция
function simple_function()
{
    rand(1,5);
}
 
class Class1
{
    public function class1_method1()
    {
        rand(1,5);
    }
    
    public function class1_method2()
    {
        rand(1,5);
    }
}
// класс который наследуют "не нужные" методы
class Class2 extends Class1
{
    public function class2_method1()
    {
        rand(1,5);
    }
}
 
$iterations = 1000000;
 
// тестим скорость функций
$time = microtime(true);
for($i = 0; $i < $iterations; $i++)
{
    simple_function();
}
$result1 = microtime(true) - $time;
printf('Вызов функции занял %s секунд ',$result1);
echo "\n\r";
 
// тестим скорость метода из класса
$time = microtime(true);
$obj = new Class2();
for($i = 0; $i < $iterations; $i++)
{
    $obj->class2_method1();
}
$result2 = microtime(true) - $time;
printf('Вызов метода занял %s секунд ',$result2);
echo "\n\r";
 
printf('Разница %s%%',round(($result2/$result1 - 1)*100));
Результат
Code
1
2
3
Вызов функции занял 0.11213493347168 секунд 
Вызов метода занял 0.11938691139221 секунд 
Разница 6%
Разница в несколько % это в пределах погрешности. И это только php, добавим сюда время ожидание БД, сети... разница будет ничтожная.

Сейчас вы можете возразить мол пример синтетический и в реальных проектах все по другому... ну у меня не так. Максимум приходилось в самых узких местах вместо ORM юзать прямые sql запросы, но это явно нельзя назвать 100% чистом процедурным кодом. И это еще было еще во времена php5, который раза в 2 медленней чем php7.

Цитата Сообщение от CoderHuligan Посмотреть сообщение
Вы нормальный пример ООП приведите, пожалуйста
Собственно на примере выше видна реализация наследования.

Второй пример про зависимости.

Допустим у меня есть класс для работы с АПИ.
PHP
1
2
3
4
5
6
7
8
9
10
11
class Api
{
    public function search(array $filters)
    {
        // условно здесь по CURL запрос к внешней системе
        return [
            ['id' => 1],
            ['id' => 2,
        ];
    }
}
И класс, который использует это АПИ.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class UserRepository
{
    protected $api;
 
    public function __construct(Api $api)
    {
        $this->api = $api;
    }
 
    public function all()
    {
        return $this-api->search([]);
    }
 
    public function getByStatus(int $status)
    {
        return $this-api->search([
            'status' => $status,
        ]);
    }
}
Как в процедурном стиле подменить код работающий с внешней системой на заглушку? Не буду же я каждый раз дергать реальную почту, реальную платежку итп.

-------

В общем ожидаю ответные примеры на тему наследования(через компоненты) и заглушки части кода. Другие примеры тоже приветствуются.
Особенно интересно про конфиги, благодаря которым можно вообще не менять код.
0
1152 / 554 / 320
Регистрация: 21.06.2012
Сообщений: 1,854
06.10.2018, 16:12
tarasalk, отлично, а теперь давайте посмотрим сколько памяти потребляют оба подхода:
PHP
1
2
3
4
5
6
7
$mem_start1 = memory_get_usage();
include 'test_function.php';
echo 'memory: '. (memory_get_usage() - $mem_start1) .'<br>';
 
$mem_start2 = memory_get_usage();
include 'test_method.php';
echo 'memory: '. (memory_get_usage() - $mem_start2) .'<br>';
Вызов функции занял 0.16773104667664 секунд , memory: 304
Вызов метода занял 0.17694997787476 секунд , memory: 1704
2
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
06.10.2018, 16:40
Цитата Сообщение от tarasalk Посмотреть сообщение
Допустим у меня есть класс для работы с АПИ.
А если заказчик попросит добавить дополнительный функционал, который соотносится к вашему классу UserRepository? Придётся вам засучить рукава и лезть в код класса. Это не соответствует Open/Closed Principle ООП.
http://joelabrahamsson.com/a-s... principle/
Или создавать совершенно новый класс, который наследует от этого. На каждый чих новый класс. А добавление нового класса это добавление новой абстракции и зависимости. Чем больше абстракций, которые к тому же зависимы друг от друга, тем сложнее разобраться в вашем коде.
Цитата Сообщение от tarasalk Посмотреть сообщение
Как в процедурном стиле подменить код работающий с внешней системой на заглушку? Не буду же я каждый раз дергать реальную почту, реальную платежку итп.
Вы ничего не слышали о Data Driven Programming? - https://medium.com/effective-p... c8f3133401
Цитата Сообщение от tarasalk Посмотреть сообщение
Особенно интересно про конфиги, благодаря которым можно вообще не менять код.
Допустим, мы имеем функцию, которая ответственна за вывод содержимого главной страницы сайта:
PHP
1
2
3
4
5
6
7
8
9
10
function MainPage() 
{
    global $ModulesPath;
    $arr=getArr($ModulesPath.'main_page/config.php');
    $l=count($arr);
    for($i=0; $i<$l; ++$i)
    {
        getTplFunction($arr[$i]);
    }
}
Это каркас: тут может быть кое-что ещё, но самое главное показано.
В конфиге:
PHP
1
2
3
4
<?php die('Access denied!'); ?>
0
1
2
записаны индексы функций, которые прописаны в конфиг-файле со списком tpl-функций:
PHP
1
2
3
4
<?php die('Access denied!'); ?>
/logostrip/show_logostrip.php|showLogoStrip
/logomenu/show_logomenu.php|showLogoMenu
/userlinks/show_userlinks.php|showUserLinks
Функция getTplFunction():
PHP
1
2
3
4
5
6
function getTplFunction($funct) 
{
    global $TemplatesPath, $Skin, $TplList;
    require_once($TemplatesPath.$Skin.$TplList[$funct][0]);
    $TplList[$funct][1]();
}
которая вызывается из функции MainPage() получает индекс нужной функции и вызывает её из уже загруженного списка tpl-функций.
Таким образом я могу сторонним кодом подменить работу любой функции. А функция MainPage() может выводить блоки в любом порядке, который прописан в конфиге того модуля, в котором находится сама функция MainPage().
Такой код полностью соответствует Open/Closed принципу, так как при добавлении нового функционала ничего не нужно менять в существующем коде.
Также у меня, за редкими исключениями общего порядка, функции находятся в своих собственных файлах, поэтому манипуляция ими очень легка и мобильна.
0
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
06.10.2018, 18:11
Я хз на чем вы тестили и что там внутри include, но у меня результаты совершенно другие.

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

Функции
Кликните здесь для просмотра всего текста
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
<?php
 
function simple_function($a, $b)
{
    $x = $a + $b;
    return $x;
}
 
$iterations = 1000000;
 
$memory_start = memory_get_usage();
$time = microtime(true);
for($i = 0; $i < $iterations; $i++)
{
    $x = simple_function($i, 5);
}
$seconds = microtime(true) - $time;
$memory = (memory_get_usage() - $memory_start);
printf('Вызов метода занял %s секунд, разница %s памяти из %s, пик памяти %s',
    $seconds,
    $memory,
    memory_get_usage(),
    memory_get_peak_usage()
);

Методы
Кликните здесь для просмотра всего текста
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
<?php
 
class Class1
{
    public function class1_method1()
    {
        rand(1,5);
    }
 
    public function class1_method2()
    {
        rand(1,5);
    }
}
// класс который наследуют "не нужные" методы
class Class2 extends Class1
{
    public function class2_method1($a, $b)
    {
        $x = $a + $b;
        return $x;
    }
}
 
$iterations = 1000000;
 
$memory_start = memory_get_usage();
$time = microtime(true);
$obj = new Class2();
for($i = 0; $i < $iterations; $i++)
{
    $x = $obj->class2_method1($i, 5);
}
$seconds = microtime(true) - $time;
$memory = (memory_get_usage() - $memory_start);
printf('Вызов метода занял %s секунд, разница %s памяти из %s, пик памяти %s',
    $seconds,
    $memory,
    memory_get_usage(),
    memory_get_peak_usage()
);


У меня вышло что пиковые затраты памяти отличаются незначительно.

Добавлено через 1 час 14 минут
Цитата Сообщение от CoderHuligan Посмотреть сообщение
А если заказчик попросит добавить дополнительный функционал, который соотносится к вашему классу UserRepository? Придётся вам засучить рукава и лезть в код класса. Это не соответствует Open/Closed Principle ООП.
Если никогда не менять код класса, то там и методы то никогда не появятся. Очевидно это не правильна трактовка.
Пример:
У меня есть класс FileLog, он реализует интерфейс ILog. Другой класс, Api, работает с логами через интерфейс ILog.
Так вот чтобы изменить логику логирования класса Api, мне не нужно менять сам класс Api, мне нужно просто подсунуть ему другой класс например DBLog, и благодаря общему интерфейсу ILog класс Api это схавает.
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Вы ничего не слышали о Data Driven Programming?
Краем уха. Из статьи совершенно не очевидно как это решает обсуждаемый вопрос. Возможно вам стоит написать пример на PHP.
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Допустим, мы имеем функцию, которая ответственна за вывод содержимого главной страницы сайта:
Принцип понял. Вижу кучу проблем и противоречий.
1) Ранее вы говорили что ни одна функция не вызывает другую напрямую. В MainPage дергается сразу 2 функции.
2) Глобальные переменные - зло. Что там находится слабо поддается контролю. В больших проектах это приведет к необъяснимым багам, которые можно очень долго искать.
3) Если это решение с конфигами не стандартизировано, то мне сложно представить как в этот велосипед вписать сторонний код.
4) Автокомплит не заработает. Вы наверно в блокноте пишите и и не знаете как приятно использовать современные IDE.
5) Как передают параметры в функцию? Через конфиг? Везде глобальные переменные?
6) Как вызвать конкретную функцию из конфига? Через индекс? А если в массиве один элемент удалится и все последующие индексы слетят, я должно по всему коду прыгать и менять 1 на 2?
7) Интересно во что превращается stack trace, отладка наверно то еще удовольствие.
0
1152 / 554 / 320
Регистрация: 21.06.2012
Сообщений: 1,854
06.10.2018, 19:38
Цитата Сообщение от tarasalk Посмотреть сообщение
Я хз на чем вы тестили и что там внутри include
копипаст вашего кода (для каждого файла свой код соответственно)

Цитата Сообщение от tarasalk Посмотреть сообщение
но у меня результаты совершенно другие.
естественно, ооп это же не процедурка, с чего это функция memory_get_usage будет измерять сколько памяти выделилось под описания классов? Она смотрит сколько памяти сжирает скрипт. А оператор include, как раз и позволяет узнать сколько памяти выделилось под его нужды.

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

Процедурка никогда и никуда не уйдет, так как в конечном итоге и ооп на её основе работает. По сути выполнение программ и архитектура процессоров это и есть процедурный стиль.
1
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
06.10.2018, 20:15
Цитата Сообщение от sasha0012 Посмотреть сообщение
естественно, ооп это же не процедурка, с чего это функция memory_get_usage будет измерять сколько памяти выделилось под описания классов? Она смотрит сколько памяти сжирает скрипт. А оператор include, как раз и позволяет узнать сколько памяти выделилось под его нужды.
Подозревал что-то подобное поэтому разделил на 2 файла и тестил отдельно, даже без инклуда. Выводы написал выше, но повторю, разница незначительна. В vendor у меня лежат сотни классов от фреймворка и библиотек, и ничего, от нехватки памяти сервак не падает.
Цитата Сообщение от sasha0012 Посмотреть сообщение
ооп сжирает на много больше памяти чем процедурка, да и по времени выполнения тоже уступает
Не спорю, но в большинстве случаев выигранные 5%, да пусть даже 20%, не стоят затраченных усилий.
Цитата Сообщение от sasha0012 Посмотреть сообщение
Плюс ко всему, накосячить в ооп стиле гораздо проще чем в процедурном.
Смотря на код CoderHuligan согласится с вами ну никак не могу.
Цитата Сообщение от sasha0012 Посмотреть сообщение
Процедурка никогда и никуда не уйдет, так как в конечном итоге и ооп на её основе работает. По сути выполнение программ и архитектура процессоров это и есть процедурный стиль.
Возможно. Но очевидно ООП итп появились не просто так. Это не альтернатива, а попытка уйти от высокой сложности процедурного стиля. С ростом вычислительной мощности этот тренд будет только усиливаться. Уже сейчас зачастую дешевле взять сервак помощнее чем мучиться с кодом.
0
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
07.10.2018, 12:49
Цитата Сообщение от tarasalk Посмотреть сообщение
Смотрим сравнение скорости функций и схожий вызов через класс.
Тут дело даже не в скорости, а в гибкости.
Цитата Сообщение от tarasalk Посмотреть сообщение
Если никогда не менять код класса, то там и методы то никогда не появятся. Очевидно это не правильна трактовка.
Методы должны жить самостоятельной жизнью, вот в чём дело. Их не нужно загонять в какие-либо клетки, да ещё вместе с хищниками в виде данных. Например у нас есть CMS, которую установил у себя заказчик. Он уже её установил, и вряд ли будет правильным решением на каждый его чих переустанавливать заново движок. Чтобы изменить или добавить новый функционал заказчик просто качает плагин, который сам установится, сделает необходимые изменения, но не в коде, а в данных, установит свои апи. А вы предлагаете в самом классе, то есть в коде что-то прописывать? Для вэб разработки это неприемлемо от слова совсем. Может быть это ещё прокатывает для десктопных приложений где есть система версий, и нужно каждую версию устанавливать заново, и то: это в корне не правильно. И для десктопных приложений ядро должно быть на скриптах, которые "тягают" быстрые сишные или с++ функции отдельными модулями. Но это уже совсем другой вопрос.
Короче говоря отделите мух от котлет и будет вам счастье. Мухи это функции, а котлеты это данные. Мне кажется, что достаточно нэймспейсов или соглашений имён, и правильной разбивки сложной системы на модули, желательно построенной по иерархическому принципу.
Цитата Сообщение от tarasalk Посмотреть сообщение
1) Ранее вы говорили что ни одна функция не вызывает другую напрямую. В MainPage дергается сразу 2 функции.
Это служебные функции, которые к самому функционалу, который требуется заказчиком не имеет никакого отношения. базовый функционал. Ядро системы.
Можно, конечно и их дёргать через наборы данных, но просто не вижу смысла.
Кстати у меня сама функция MainPage() вызывается через список модулей, и её саму можно подменить если что.
Но я у же это буду делать не руками, а через код.
Цитата Сообщение от tarasalk Посмотреть сообщение
2) Глобальные переменные - зло. Что там находится слабо поддается контролю. В больших проектах это приведет к необъяснимым багам, которые можно очень долго искать.
Глобальные переменные не зло если они разделяются всей системой, о есть они являются обще-системными переменными. Всё в меру, сказал Джевахарлар Неру.))
Цитата Сообщение от tarasalk Посмотреть сообщение
3) Если это решение с конфигами не стандартизировано, то мне сложно представить как в этот велосипед вписать сторонний код.
Почему не стандартизировано? Всё прописано в документации. Там прописаны все типы данных, функции расположения полей и т. д. Те, кто пишет плагины достаточно ознакомится с документацией.
Цитата Сообщение от tarasalk Посмотреть сообщение
4) Автокомплит не заработает. Вы наверно в блокноте пишите и и не знаете как приятно использовать современные IDE.
Я знаю как использовать современные IDE, так как некоторые сишные проекты пишу именно там. А в сайты клепаю именно в Notepad++ или в AkelPad.
Мне хватает. И всё там работает в этих редакторах и автозавершение и всё остальное.
Цитата Сообщение от tarasalk Посмотреть сообщение
5) Как передают параметры в функцию? Через конфиг? Везде глобальные переменные?
В данном случае это не требуется, но это легко реализовать через функцию getTplFunction() или любую подобную ей.
PHP
1
2
3
4
5
6
function sibb_getTplFunction($funct, $param) 
{
    global $TemplatesPath, $Skin, $TplList;
    require_once($TemplatesPath.$Skin.$TplList[$funct][0]);
    $TplList[$funct][1]($param);
}
Конфиги здесь и не требуются, хотя можно и через них. Все параметры можно загнать в один массив.
Цитата Сообщение от tarasalk Посмотреть сообщение
6) Как вызвать конкретную функцию из конфига? Через индекс? А если в массиве один элемент удалится и все последующие индексы слетят, я должно по всему коду прыгать и менять 1 на 2?
А если солнце крокодил сьест?.. И то, это ремонтопригодно, причём дистанционно.
Цитата Сообщение от tarasalk Посмотреть сообщение
7) Интересно во что превращается stack trace, отладка наверно то еще удовольствие.
Никогда не делал этого в php.. В C делал, а в пыхе зачем это совсем не пойму?.

Цитата Сообщение от tarasalk Посмотреть сообщение
Из статьи совершенно не очевидно как это решает обсуждаемый вопрос. Возможно вам стоит написать пример на PHP.
По сути это отделение логики программы от данных, которые эта логика обрабатывает. В таком случае логику можно менять через данные, дистанционно. Нельзя данные жёстко прописывать в коде. нельзя из кода делать винегрет из логики и данных. Это примерно то, что я уже показал.

Добавлено через 39 минут
Я всё хочу сделать "умную" систему, чтобы она сама знала о себе всё, что нужно: из чего состоит, какие изменения вводились и т.п. Такая система была бы способна к самолечению.. Некая имунная система должна присутствовать в любой системе.. Пока такой системы ещё не создано, но я выбрал, на мой взгляд правильный вектор развития, который возможно приблизит мечту..
0
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
07.10.2018, 13:39
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Методы должны жить самостоятельной жизнью, вот в чём дело. Их не нужно загонять в какие-либо клетки, да ещё вместе с хищниками в виде данных. Например у нас есть CMS, которую установил у себя заказчик. Он уже её установил, и вряд ли будет правильным решением на каждый его чих переустанавливать заново движок. Чтобы изменить или добавить новый функционал заказчик просто качает плагин, который сам установится, сделает необходимые изменения, но не в коде, а в данных, установит свои апи. А вы предлагаете в самом классе, то есть в коде что-то прописывать? Для вэб разработки это неприемлемо от слова совсем
1) Вы зациклились на плагинах и клиентах. Все это из разряда простеньких штамповочных сайтов.
Посмотрите на что-то более серьезное, например Яндекс.Диск. Думаете его исходники дадут кому-то постороннему?
2) Я вам уже говорил, сделать плагины на ООП не проблема. Но не все решается плагинами. Не просто так существуют различные версии CMS.
3) Если вы думаете что нельзя спокойно обновить движок (не плагин) то спешу вас разочаровать. Это очень легко делается через composer. Например фреймворк Laravel часто меняется, я делаю composer update и всё. Аналогично с другими зависимостями, которые сотнями с гитхаба качаются. В этом и есть ключевая фишка ООП, работая через интерфейс, можно совершенно не обращать внимание на реализацию.

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

Цитата Сообщение от CoderHuligan Посмотреть сообщение
Почему не стандартизировано? Всё прописано в документации. Там прописаны все типы данных, функции расположения полей и т. д. Те, кто пишет плагины достаточно ознакомится с документацией.
Вот именно что его надо писать. А в моем случае не надо. Если я хочу взаимодействовать с Amocrm через АПИ, я иду на гитхаб и качаю готовую библиотеку. Да, мне нужно писать код для работы с библиотекой, но это гораздо меньший объем работы чем если бы я писал и саму библиотеку.

Цитата Сообщение от CoderHuligan Посмотреть сообщение
И всё там работает в этих редакторах и автозавершение и всё остальное.
Сказки. Никакая ID без доработки такое не распознает. Только что вбил в phpStorm вашу функцию sibb_getTplFunction и никаких подсказок. Что там в global, что в require_once, какие параметры у $TplList[$funct][1], что за магическое [1] можно только гадать.

Цитата Сообщение от CoderHuligan Посмотреть сообщение
Никогда не делал этого в php.. В C делал, а в пыхе зачем это совсем не пойму?.
В смысле зачем, для отладки. Баги есть у всех, стек трейс позволяет быстро найти их и исправить.

Цитата Сообщение от CoderHuligan Посмотреть сообщение
По сути это отделение логики программы от данных, которые эта логика обрабатывает. В таком случае логику можно менять через данные, дистанционно. Нельзя данные жёстко прописывать в коде. нельзя из кода делать винегрет из логики и данных. Это примерно то, что я уже показал.
Ну т.е. опять изобретение своих классов.
Класс как раз никаких данных в себе не содержит, всё приходит как параметры в методе.

Цитата Сообщение от CoderHuligan Посмотреть сообщение
но я выбрал, на мой взгляд правильный вектор развития,
Увы нет. Вам нужен ИИ.
0
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
07.10.2018, 14:25
Цитата Сообщение от tarasalk Посмотреть сообщение
Это очень легко делается через composer.
Да, это сейчас стало очень модным пихать его где только можно. Современность, ничего не скажешь! Вот в Си никакого composer нет, а библиотеки есть. То есть ООПные проекты создают столько зависимостей, что вручную отследить где что не представляется возможным.
Цитата Сообщение от tarasalk Посмотреть сообщение
Вот именно что его надо писать. А в моем случае не надо.
Кого писать? Плагин? Документация по-любому нужна. В адекватном проекте. Если вы думаете что ооп код не нуждается в документации, то сильно ошибаетесь.
Цитата Сообщение от tarasalk Посмотреть сообщение
Никакая ID без доработки такое не распознает. Только что вбил в phpStorm вашу функцию sibb_getTplFunction и никаких подсказок.
Вы об этом. Дык это вам такого рода подсказки необходимы. В процедурном это ненужно.
Цитата Сообщение от tarasalk Посмотреть сообщение
Баги есть у всех, стек трейс позволяет быстро найти их и исправить.
опять же это актуально для ооп-пректов, где сложно отследить какой метод работает в действительности. У меня всё прозрачно: сразу видно где какая функция косячит.
Цитата Сообщение от tarasalk Посмотреть сообщение
Ну т.е. опять изобретение своих классов.
Как раз противоположенное. Классы это когда данные и обработчики вместе.
Цитата Сообщение от tarasalk Посмотреть сообщение
Класс как раз никаких данных в себе не содержит, всё приходит как параметры в методе.
А глобальные переменные в классе? Ну, которые юзают методы напрямую?
Цитата Сообщение от tarasalk Посмотреть сообщение
Вам нужен ИИ.
ИИ это должна любая программа. Если у неё есть 1) память 2) логика 3) интерфейс
0
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
07.10.2018, 15:40
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Вот в Си никакого composer нет, а библиотеки есть.
Причем тут Си? Я тоже могу вспомнить например C#, там вообще всё объектное и есть аналог composer - nuget. Но давайте вести дискуссию в рамках темы.

Цитата Сообщение от CoderHuligan Посмотреть сообщение
То есть ООПные проекты создают столько зависимостей, что вручную отследить где что не представляется возможным.
В смысле? composer это просто удобный способ скачать библиотеку. Можно конечно и вручную, но зачем, когда можно просто написать в консольке composer require guzzlehttp/guzzle и готово. Неужели для вас лучше вручную качать архивчик и распаковывать куда-то в plugins? Еще круче обновлять сразу пачку библиотек. В composer пишем composer update, у вас же каждую библиотеку надо вручную удалить и скачать новую версию.

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

Цитата Сообщение от CoderHuligan Посмотреть сообщение
опять же это актуально для ооп-пректов, где сложно отследить какой метод работает в действительности. У меня всё прозрачно: сразу видно где какая функция косячит.
Опять сказки. Где видно? Вы смотрите что то другое, не стек трейс?

Допустим ошибка здесь. require_once($TemplatesPath.$Skin.$TplLi st[$funct][0]);
Как вы поймете где косяк? Стека нет, только текст ошибки. file not found in aaa/bbb/ccc/ddd.php.
А путь вам неизвестен, он же динамически сформировался и там может быть абсолютно любая ерунда.

Цитата Сообщение от CoderHuligan Посмотреть сообщение
В данном случае это не требуется, но это легко реализовать через функцию getTplFunction() или любую подобную ей.
Ага, осталось учесть что количество параметров величина переменная, а еще есть тип параметра и значение по умолчанию.

Цитата Сообщение от CoderHuligan Посмотреть сообщение
Как раз противоположенное. Классы это когда данные и обработчики вместе.
Смотрим пример.
PHP
1
2
3
4
5
6
7
class View
{
    public function render($html)
    {
        echo $html;
    }
}
Что выведет метод render? Где тут данные? $html это не данные, это переменная в которую могут подставлять разные данные, но какие именно данные придут класс не знает.

Цитата Сообщение от CoderHuligan Посмотреть сообщение
А глобальные переменные в классе? Ну, которые юзают методы напрямую?
Я же сказал, глобальные переменные это зло.

Цитата Сообщение от CoderHuligan Посмотреть сообщение
ИИ это должна любая программа. Если у неё есть 1) память 2) логика 3) интерфейс
Хорошо, тогда для вас не составит труда продемонстрировать как любая программа успешно проходит тест Тьюринга.
0
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
09.10.2018, 11:55
Цитата Сообщение от tarasalk Посмотреть сообщение
Причем тут Си? Я тоже могу вспомнить например C#, там вообще всё объектное и есть аналог composer - nuget.
Потому что там нет обьектов из коропки. C# естественно требует это ведь обьектный язык. Без него никак..
Цитата Сообщение от tarasalk Посмотреть сообщение
В смысле? composer это просто удобный способ скачать библиотеку.
Не просто. А также автоматически разрулить зависимости.
Цитата Сообщение от tarasalk Посмотреть сообщение
Неужели для вас лучше вручную качать архивчик и распаковывать куда-то в plugins?
Можно и это автоматизировать без всякого композитора.
Цитата Сообщение от tarasalk Посмотреть сообщение
Вместо того чтобы взять готовую библиотеку вы будете писать свой аналог на конфигах.
Вы не перегрелись под осенним солнышком? Плагин от библиотеки отличить можете?
Цитата Сообщение от tarasalk Посмотреть сообщение
Где видно? Вы смотрите что то другое, не стек трейс?
Конечно. Как у всякого нормального программера у меня есть своя система отлова ошибок.
Цитата Сообщение от tarasalk Посмотреть сообщение
Ага, осталось учесть что количество параметров величина переменная, а еще есть тип параметра и значение по умолчанию.
Это прописывается соглашениями в документации. Один параметр с пустым полем по умолчанию, в который можно загнать любое количество параметров. Массив в php всеядная тварь.
Цитата Сообщение от tarasalk Посмотреть сообщение
Смотрим пример.
Тогда зачем вам вообще класс? Примените нэймспейсы лучше.
Цитата Сообщение от tarasalk Посмотреть сообщение
Я же сказал, глобальные переменные это зло.
Однако в классах они повсюду, - глобальные для класса.
Видимо это зло просто заточили в класс и его стало малозаметно?.
Цитата Сообщение от tarasalk Посмотреть сообщение
Хорошо, тогда для вас не составит труда продемонстрировать как любая программа успешно проходит тест Тьюринга.
Осеннее солнышко печёт. Тесты Тьюринга проходят языки программирования, а не программы на них написанные.
0
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
09.10.2018, 14:06
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Потому что там нет обьектов из коропки
И по вашему это достойный повод чтобы писать не по теме? Что там в Си мне не интересно.

Цитата Сообщение от CoderHuligan Посмотреть сообщение
Не просто. А также автоматически разрулить зависимости.
Я хз что по вашему он там разруливает. Мне, чтобы подключить класс из композера, нужно прописать у себя подобную строку
use App\Models\Driver;
Результат мало чем отличается от require_once.

Цитата Сообщение от CoderHuligan Посмотреть сообщение
Можно и это автоматизировать без всякого композитора.
Ну я уже понял что вы любитель писать велосипеды на каждый чих.

Цитата Сообщение от CoderHuligan Посмотреть сообщение
Вы не перегрелись под осенним солнышком? Плагин от библиотеки отличить можете?
Вам лишь бы придраться и обсудить что-то левое. Вопрос в чем? В том что ваша система несовместима с чужим кодом. Этот кода всегда нужно специально адаптировать. КПД стремится к нулю.

Цитата Сообщение от CoderHuligan Посмотреть сообщение
Конечно. Как у всякого нормального программера у меня есть своя система отлова ошибок.
Очередной велосипед.

Цитата Сообщение от CoderHuligan Посмотреть сообщение
Это прописывается соглашениями в документации. Один параметр с пустым полем по умолчанию, в который можно загнать любое количество параметров. Массив в php всеядная тварь.
Вы похоже опять про плагины? Мощна вас заклинило однако.
Еще раз цитирую ваши слова
Цитата Сообщение от CoderHuligan Посмотреть сообщение
И у меня функции не вызывают друг друга напрямую. Ни одна. У меня всё через конфиги
Где в основной системе(не в плагине постороннего чувака) вот это "все через конфиги", когда даже сам конфиг вызывается через функцию?

Цитата Сообщение от CoderHuligan Посмотреть сообщение
Тогда зачем вам вообще класс? Примените нэймспейсы лучше.
Вообще не по теме. В очередной раз пытаетесь уйти от вопроса.

Цитата Сообщение от CoderHuligan Посмотреть сообщение
Однако в классах они повсюду, - глобальные для класса.
Они лежат в классе, а класс в неймспейсе. Т.е. совершенно не глобальные. А еще есть public/private/protected.

Цитата Сообщение от CoderHuligan Посмотреть сообщение
Тесты Тьюринга проходят языки программирования, а не программы на них написанные.
Вы серьезно? Пожалуй дальше разговор не имеет смысл. Вашу точку зрения я понял.
0
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
26.10.2018, 10:47
Цитата Сообщение от tarasalk Посмотреть сообщение
Глобальные переменные - зло. Что там находится слабо поддается контролю. В больших проектах это приведет к необъяснимым багам, которые можно очень долго искать.
Я переделал проект и полностью избавился от глобальных переменных. Теперь их у меня просто нет. Работа скрипта начинается с главной функции, которая дёргает нижележащие модули передавая им необходимые параметры. Все переменный, которые обьявлены в главной функции невидимы в нижележащих, кроме необходимых им параметров.
Цитата Сообщение от tarasalk Посмотреть сообщение
Как передают параметры в функцию? Через конфиг? Везде глобальные переменные?
Вот переделанный конфиг:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php if(!defined('SIBB_OK')){die('Access denied!');}
$MainPageConfig = array (
  '1' => 
  array (
    'path' => 'logostrip/logostrip.php',
//дальше строка с функцией и уже переданными параметрами
    'func' => 'sibb_showLogoStrip($Pathes, $Config, $ContentBuf, $Skin);',
  ),
  '2' => 
  array (
    'path' => 'logomenu/logomenu.php',
    'func' => 'sibb_showLogoMenu($ContentBuf, $Pathes, $User, $Skin, $Lang);',
  ),//и так далее..
);?>
подключается это дело например так:
PHP
1
2
3
4
5
6
7
8
9
10
function sibb_MainPage(&$Config, $Pathes, &$ContentBuf, &$User, $Skin, $Lang) 
{
    include($Pathes['modules'].'main_page/config.php');
    $l=count($MainPageConfig);
    for($i=1; $i<=$l; ++$i)
    {
        require_once($Pathes['showtools'].$MainPageConfig[$i]['path']);
        eval($MainPageConfig[$i]['func']); // выполняем строку с функцией из конфига с параметрами
    }
}
0
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
26.10.2018, 13:54
Цитата Сообщение от CoderHuligan Посмотреть сообщение
eval($MainPageConfig[$i]['func']);
Прощай безопасность
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.10.2018, 13:54

Можно ли создать приложение под Android на чистом С++?
Можно ли создать приложение которое содержит только код на С++ без строчки на java? Ну то есть на чистом ndk, и при этом у меня будет...

О чистом коде html,css,js,php
Друзья, я занимаюсь программированием уже более 10-ти лет. Работал уже с разными CMSб фреймворками. Столкнулся с сайтом какого-то чувака...

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

Как сделать приложение в стиле Office 2007 в VS2008
Как сделать приложение в стиле Office 2007 в VS2008 ? Если можна подробно, как установить? Буду благодарен и за другой стиль,...

Можно ли в css стиле(на HTML странице) использовать php?
Здравствуйте Задался таким вопросом А можно ли в css стиле(на HTML странице) использовать php? То что оно работать будет я знаю,а вот...


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

Или воспользуйтесь поиском по форуму:
56
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru