Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Целесообразность ООП в php и веб-сервисах

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (5): [1] 2 3 4 5 »   

> Без описания
Moreo
Отправлено: 15 Апреля, 2013 - 20:33:57
Post Id


Новичок


Покинул форум
Сообщений всего: 28
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




Здравствуйте!

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

Начинаю работать над очередным проектом, и опять встает вопрос организации структуры.
Я использую возможности ООП в php, но в основном для обращения к БД и классы служат более как контейнерами функций. Сейчас начинаю делать более-менее крупный проект, хочу добиться максимальной масштабируимости.
У меня всегда есть соблазн использовать ООП "на полную катушку", то есть вся прелесть ООП в том что оно помогает абстрагироваться и манипулировать объектами как сущностями, способствует рефакторингу и прочие прелести.

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

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

По-настоящему крупных проектов не делал, и поэтому мне интересны ваши мнения и опыт, спасибо за внимание )
 
 Top
OrmaJever Модератор
Отправлено: 15 Апреля, 2013 - 20:47:51
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Да, классы работают медленее функций но сейчас куда дороше время програмиста чем милисекунды сервера, да и вобще если нужен высоконагруженый проэкт то php тут явно не катит. В любом случае вы проэкт будете обновлять, доделывать и простые функции и глобальные переменые вас очень запутют и замедлят. Как показывает практика производители cms, форумов и прочих движков не брезгуют классами и используют их по полной, и скажу честно в них куда проще разбиратся. НО то что я сказал ранее не значит что от функций нужно отказатся и классы должны быть везьде, это даже не вопрос скорости работы скрипта, это вопрос здравой логики. Например я никогда не понимаю людей которые делают класс для класса. Тоесть если существует класс для работы с бд mysqli/PDO то писать класс обёртку для него точно не стоит, усли уж сильно нужен синглтон то я всегда обходился функцией.
Спойлер (Отобразить)

Или например видел как делают класс из этого кода http://www.php.su/articles/?cat=...les&page=062 , это абсолютно не нужно. Вобщем использовать классы однозначно стоит, но нужно заранее продумать где имено они нужна, а где нет.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Moreo
Отправлено: 15 Апреля, 2013 - 21:18:46
Post Id


Новичок


Покинул форум
Сообщений всего: 28
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




OrmaJever, Согласен, ООП нужно использовать оправданно.
Для примера, который я привел выше (товар - ингридиенты), ООП как раз очень подходит по концепции
Как я уже сказал, в простой операции при тестрировнии разница составляля порядок, ав более крупных проектов и при нагрузке, даже не знаю сколько.
На счет крупных проектов. Я не спец в таких языках, как Java или C#, но, речь идет
о веб-сервисах в принципе, (не имеет значения, php, Java, или C#), то есть вся нагрузка и бизнес логика ложится на сервис (модель), а не клиента. Не расточительно ли в таком случае использовать ООП в полной ее мере?

OrmaJever, Использовали бы Вы ООП в том виде который я привел выше для того конкретного примера?)
 
 Top
caballero
Отправлено: 15 Апреля, 2013 - 21:23:46
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
НО, применимо ли это к php ( и вообще к веб-сервисам)? Ведь это сказывается, во-первых, на скорость выполнения скрипта, часто разница скорости различатеся на порядок (по сравнению с процедурным программированием, проводил недавно тест, одну и туже задачу решал двумя способами), большая нагрузки на сервер.

единственное обьяснение разницы на порядок - кривые руки разработчика.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Moreo
Отправлено: 15 Апреля, 2013 - 21:43:29
Post Id


Новичок


Покинул форум
Сообщений всего: 28
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




Пряморукий caballero, или делается один запрос для извлечени информации о сотни ингридиентов(проецдурно) или, (ООП) каждый из этих ста объектов делает свой запрос (причем несколько для всяческих проверов). Вот и разница
 
 Top
caballero
Отправлено: 15 Апреля, 2013 - 21:45:52
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
каждый из этих ста объектов делает свой запрос (причем несколько для всяческих проверов).

вот пример криворукости


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Moreo
Отправлено: 15 Апреля, 2013 - 21:51:28
Post Id


Новичок


Покинул форум
Сообщений всего: 28
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




caballero пишет:
Цитата:
каждый из этих ста объектов делает свой запрос (причем несколько для всяческих проверов).

вот пример криворукости

Так речь и идет о целесообразности применения концепций ООП, когда каждая сущность отвечает сама за себя (в данном случае объект "ингридиент")
 
 Top
caballero
Отправлено: 15 Апреля, 2013 - 21:54:01
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Так речь и идет о целесообразности применения концепций ООП, когда каждая сущность отвечает сама за себя (в данном случае объект "ингридиент")


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


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
OrmaJever Модератор
Отправлено: 15 Апреля, 2013 - 22:08:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Moreo пишет:
OrmaJever, Использовали бы Вы ООП в том виде который я привел выше для того конкретного примера?)

Да, хотя бы потому что сказу при запуске не будет милионого онлайна, а со временем код всёравно будет оптимизироватся.
И опять же насчёт скорости, всё зависит от железа сервера и от остального кода. Всёравно основную часть времени будут забирать запросы в бд и сложные вычисления. Ну тоесть сами создания обьектов, вызовы методов займут предположим 2мс, а запросы и вычисления 100мс, дак есть ли смысл смотреть на эти 2мс на фоне 100? Однако


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Moreo
Отправлено: 15 Апреля, 2013 - 22:10:49
Post Id


Новичок


Покинул форум
Сообщений всего: 28
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




caballero пишет:
Цитата:
Так речь и идет о целесообразности применения концепций ООП, когда каждая сущность отвечает сама за себя (в данном случае объект "ингридиент")


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


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

Может я где-то ошибаюсь, тогда подскажите, как технически, конкретно, вы решили бы пример, приведенный мной, с ипользованием классических понятий ООП?
 
 Top
caballero
Отправлено: 15 Апреля, 2013 - 22:22:16
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
может набор понадобится не для юзера а для дальнейших расчетов.

очень нечасто бывают расчетв которые нельзя выполнить на стороне сервера БД.

Цитата:
Может я где-то ошибаюсь, тогда подскажите, как технически, конкретно, вы решили бы пример, приведенный мной, с ипользованием классических понятий ООП?

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


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Moreo
Отправлено: 15 Апреля, 2013 - 22:59:38
Post Id


Новичок


Покинул форум
Сообщений всего: 28
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




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

caballero пишет:
Для загрузки используется фабричный статический метод класса объекта. И ни одна живая душа не узнает как работает объхект Ингредиент.


Хм... "фабричный статический метод", интересно, кажется примерно понимаю, то есть объект "Продукт" передает массив ID ингридиентов статическому методу класса "Ингридиент", он свою очередб берет одним запросом данные из БД и на основе их строит объекты, так?
 
 Top
caballero
Отправлено: 15 Апреля, 2013 - 23:04:11
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
о есть объект "Продукт" передает массив ID ингридиентов статическому методу класса "Ингридиент", он свою очередб берет одним запросом данные из БД и на основе их строит объекты, так?


не так.
откуда у продукта массив ID инградиентов? Это у инградиента есть ID продукта к которому он принадлежит. Классическая связь один ко многим.

по этому продукт говорит - верни мне массив инградиентов по такому то критерию - вот мой ID.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Moreo
Отправлено: 15 Апреля, 2013 - 23:14:28
Post Id


Новичок


Покинул форум
Сообщений всего: 28
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




caballero пишет:
Цитата:
о есть объект "Продукт" передает массив ID ингридиентов статическому методу класса "Ингридиент", он свою очередб берет одним запросом данные из БД и на основе их строит объекты, так?


не так.
откуда у продукта массив ID инградиентов? Это у инградиента есть ID продукта к которому он принадлежит. Классическая связь один ко многим.

по этому продукт говорит - верни мне массив инградиентов по такому то критерию - вот мой ID.


Тогда получается классс "Ингридиент" зависит от класса "Продукт", что не совсем логично, те же ингридиенты могут быть составляющими не только объекта "Продукт" но и объекта "Склад", тогда в классе "Ингридиента" надо писать еще обработичк для Склада.
Это у продукта есть ID ингридиентов, которые входят в его состав.
Ну это не принципиально в данном случае. Спасибо за наведение в правильную сторону )
(Добавление)
[quote=Moreo]
caballero пишет:
Цитата:
о есть объект "Продукт" передает массив ID ингридиентов статическому методу класса "Ингридиент", он свою очередб берет одним запросом данные из БД и на основе их строит объекты, так?


не так.
откуда у продукта массив ID инградиентов? Это у инградиента есть ID продукта к которому он принадлежит. Классическая связь один ко многим.

по этому продукт говорит - верни мне массив инградиентов по такому то критерию - вот мой ID.


Тогда получается классс "Ингридиент" зависит от класса "Продукт", что не совсем логично, те же ингридиенты могут быть составляющими не только объекта "Продукт" но и объекта "Склад", тогда в классе "Ингридиента" надо писать еще обработичк для Склада.
Это у продукта есть ID ингридиентов, которые входят в его состав.
Ну это не принципиально в данном случае. Спасибо за наведение в правильную сторону ) (я про фабриный статический метод Улыбка
 
 Top
caballero
Отправлено: 15 Апреля, 2013 - 23:22:04
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Тогда получается классс "Ингридиент" зависит от класса "Продукт",

он ни от чего не зависит.

Цитата:
те же ингридиенты могут быть составляющими не только объекта "Продукт" но и объекта "Склад", тогда в классе "Ингридиента" надо писать еще обработичк для Склада.

мы разбирали упрощенный пример
в реальности будет связь многие ко многим но сути дела не меняет - будет немного другой SQL запрос

Цитата:
Это у продукта есть ID ингридиентов, которые входят в его состав.

нету у него ничего - есть связь между таблицами в БД. Зачем тащить список ID исли можно получить связанные данные по ID продукта который и так под руками

(Отредактировано автором: 15 Апреля, 2013 - 23:25:03)



-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Страниц (5): [1] 2 3 4 5 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


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



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB