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

Nicki

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

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

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

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

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

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

zerkms

TDD infected
Команда форума
Чтобы еще увеличить производительность нужно видимо делть кэширование на уровне страницы в целом.
ну вот повторять каждый раз нужно: не в объектной модели тормоза. где именно? - на это тебе ответит профайлер.

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

Nicki

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

Как быть? Это правильный тон или нет?
 

Beavis

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

И если сделаешь как посоветовал zerkms можно будет с объектом работать прям как с массивом, т.е. юзать foreach, count и и.д.
 

Духовность™

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


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