Глубина объектной детализации и вопросы производительности.

  • Автор темы Автор темы Nicki
  • Дата начала Дата начала

Nicki

Новичок
Глубина объектной детализации и вопросы производительности.

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

К примеру мой сайт lux-france.ru. Если взять какую либо одну запись о товаре, то с точки зрения ситемы это:
- класс контайнер, который может содержить следующие объекты: объект товарной группы, объект-множество товаров, которые объедены группой, объект-множество отзывов.
- объект товарной группы может содержать: объект производителя (lazyLoad), объект раздела каталога в который назначена товарная группа, + для косметики объект области применения (lazyLoad), а для парфюмерии объект Семейство запахов (lazyLoad). ну и несколько обычных свойств типа свойства с названием, описанием товара, картикой товара и т.д.
- объект Товар это простой объект. товары объедены в группы с общим описанием, названием, картинкой (т.е. тем что описывает предыдущий объект) и отличаются по вес/объем/цвет и соответственно ценой. таких объектов может быть много в группе, а может и один.
- объект Отзыв тоже простой объект, и как и объект Товар их можект быть много. отзывы загружаются в Контейнер только тогда, когда отображается страница с отзывами о товарах.
- объект Производитель один из простых объектов. содержит id и имя производителя.
- объект Раздел - еще один простой обект содержит id и имя раздела каталога.
- объект Семейство запахов тоже простой объект. содержит id и имя запаха.
- объект Область применения. содержит id и имя области применения (ну, для лица, для рук, для шеи и т.д.).

А алгоритм такой: делается выборка из базы для постраничного вывода товаров. далее результат выборки перебирается, при этом, если есть готовый html для отображения общих данных о товарах то объект Группы не создается (а значит не нужно создавать и объекты Раздел, Производитель, Семейство запахов, Область применения). Дальше из результата выборки берутся данные по товарам и как и в случае с товарной группой, если есть готовый html вывода списка товаров то ни один объект товара для данной группы не строится (т.к. html выводит сразу весь список товаров). В общем в результате объект Контейнера может совсем не содержать ниодного объекта, т.к. для всех сущностей есть готовый html. И так с каждым контейнером (а их выводится по 10 на страницу).

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

Не ругайте пожалуйста сильно - первый серьезный опыт в ооп и mvc (причем действительно пришлось генерить для одной модели несколько представлений). Посоветуйте как определить ту степень детализации которая необходима в проекте...
 
Чтобы еще увеличить производительность нужно видимо делть кэширование на уровне страницы в целом.
ну вот повторять каждый раз нужно: не в объектной модели тормоза. где именно? - на это тебе ответит профайлер.

Получается так, что для каждой сущности у меня есть Гейтвей (соответственно таблица), который возвращает объекты определенного типа, т.е. если есть таблица, значит у меня для нее есть Гейтвей, который работает с объектами определенного типа, которые в свою очередьь являются составной частью некоторого сложного объекта.
с идеологический точки зрения это нормально.
 
Еще у меня есть вопрос такого плана. У меня методы возвращающие некоторое множество сущьностей, например, список производителей, список запахов и т.д. возвращают не массив, а, как мне однажды предложили сделать, объект-коллекцию... С одной стороны мне это нравится, т.к. все как бы под один стиль сделано - перебор объектов в коллекции производится так while ($Obj = $ListObjects->getNext());, получение по id $Obj = $ListObjects->getById('id');, но с другой стороны, это опять таки возможно лишние расходы производительности.

Как быть? Это правильный тон или нет?
 
Nicki
Правильный...
Вряд ли это сильно повлияет на производительность, обычно тормозят другие вещи

И если сделаешь как посоветовал zerkms можно будет с объектом работать прям как с массивом, т.е. юзать foreach, count и и.д.
 
это дорожка в "вечные муки, Адъ и погибель". По своему опыту сужу - имитировать поведение объекта как массива - НЕ НУЖНО!!! Запутаться в этом очень легко, а если нужно будет избавиться от ArrayAccess, то придется весь код переписывать с одного синтаксиса на другой.


Как быть? Это правильный тон или нет?
Не совсем ListObjects. Абстрагируйся от понятия "список" На самом деле нужно совместить тип array и тип object и создать класс-хранилище, которое будет уметь делать многие вещи, такие как getNext(), getById('id') и т.д.
У меня сырая реализация этого вот так сделана: http://phpclub.ru/paste/index.php?show=2366
 
Сверху