SLY_G
@SLY_G
журналист, переводчик, программист, стартапщик

Интернет-магазин и ООП?

Имеется самописный движок для интернет-магазина (perl).

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

Трудно поддерживать и дополнять.

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

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

Но поскольку я мало с объектами знаком, я никак не могу понять, каким образом их применять в данном случае.

Что может являться объектами в движке интернет-магазина?
  • Вопрос задан
  • 6294 просмотра
Пригласить эксперта
Ответы на вопрос 8
mekegi
@mekegi
Как показывает практика и на ООП можно такое нагородить, что потом взвоешь при поддержке и расширении.
Вам помимо самого ООП было бы неплохо ознакомиться с паттернами. Умелое их использование рождает гибкую архитектуру которую можно легко расширять, дополнять функционалом и править.

Лучшая книга по паттернам это «Приемы объектно ориентированного проектирования» банды четырех. Но для человека который только начинает знакомство с ООП она будет достаточно сложной.
Я б для начинающих советовал почитать «Паттерны проектирования» Эрика Фримена и Элизабет Фримен. Книга написана в стиле head first, с кучей картинок и примеров. Как раз по ходу чтения научитесь «видеть» окружающий мир сквозь призму объектов с их методами и свойствами.
Ответ написан
un1t
@un1t
Скачайте какой-нибудь проект написанный в ООП стиле и какое-то время поизучайте. А объектами может быть вобще все что угодно у чего может быть много методов или требуется хранить внутреннее состояние.
Например если у вас есть методы типа user_create, user_save, user_delete, etc, то само сабой напрашивается организовать это в один класс.
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
раздели систему на компоненты, исходя из задачи. Скажем, если исходить из паттрена MVC — должны быть объекты для работы с базой (Order, Client и т.д.), класс занимающийся репрезентативной частью и контроллеры (OrderController (Причем для пользовательской части можно наследовать от Controller а для админки AdminController), ClientController, CatalogController). Магазин можно грубо разделить как минимум на каталог и корзину. Есть еще доставка, оплата и т.д. Все эти части можно разнести по модулям (в случае доставки и оплаты — это будут контроллеры и модели)…

Ну это так, примерно. Просто надо разбить все на эти самые подзадачи. Причем надо продумать как так разбить что бы изменения в одном компоненте не привели к необходимости менять что-то еще…
Ответ написан
micbsv
@micbsv
.NET Web-developer
В свое время я начал изучать ООП вот с этой книги:
Гради Буч: Объектно-ориентированный анализ и проектирование
Это именно то, что вам сейчас нужно. Потом сами увидите, что и как необходимо будет поменять в вашем проекте.
Ответ написан
@dborovikov
Применительно для веба процедурный стиль вполне уместен. Впрочем, я почти не видел веб-приложений не в процедурном стиле несмотря даже на то, что есть там есть классы, ибо классы эти в основном описывают объекты без состояния вроде контроллеров и сервисов, в которых 95% логики. А писать метод create_order внутри класса OrderService или писать процедуру create_order внутри модуля ordering особой архитектурной разницы не имеет. Почитайте про MVC. На три слоя поделить можно и с процедурным подходом. Хоть это деление и приписывают ООП, но его можно найти в любой парадигме.

Что касается идеи сделать методы save/create/update/delete у модели юзер — это те редкие примеры применения ООП, которые все таки используются. Такое решение называется ActiveRecord. Если у вас нету библиотеки-ORM, то советую не отходить от процедурного же паттерна DAO (почитайте про него). Помните, то процедурное программирование, которое используете вы совсем не то, что ругают в книжках, так как perl по крайней мере динамический язык.
Ответ написан
@dborovikov
Да и забыл. Наиболее актуальной книгой по ООП-проектированию, что мне попадалась на глаза является книга Эванса «Domain Driven Design». Буча я читал и у меня сложилось впечатление, что он очень плохо описал как все это можно применить на практике, иначе говоря не описал всей методологии разработки а рассматривает все на каких-то гипотетических примерах.
Ответ написан
Bambr
@Bambr
Был у нас когда-то магазин, перл+ООП, так что все написанное ниже — субъективный опыт и описание конкретной реализации, а не строгая догма.
Во-первых, все очень хорошо и с пользой разбивается на объекты. Часть объектов мысленно «можно потрогать» — к ним можно отнести объекты юзера, товара, объект корзины с подъобъектами-позициями (товар + колво), объект заказа с позициями (товар+колво+зафиксированные цены) и много всякой другой мути. Часть объектов «потрогать» уже сложнее, но их введение тоже дает профит благодаря полиморфизму и наследованию — в этой категории, например, у нас оказались объекты, отвечающие за реализацию различных способов доставки и оплаты. Как обычно, наиболее интересным и не слишком простым оказалось все это увязать в единую систему. Многие объекты в обе стороны зависят друг от друга, но тем не менее избежать циклических связей удалось.
Что вам могут дать объекты? Самый наглядный пример — это, конечно, товар. Предположим, у нас есть две таблицы — с книгами и дисками — и классы ActiveRecord, прикрученные к ним. Начинаем определять, что же нам нужно от товара. По большому счету, это цена (с валютой, если есть необходимость) и название. Остальное менее интересно и может пригодиться в частных случаях. Например, для расчета стоимости почтовой доставки пригодится информация о весе, а для всяких маркетинговых штучек — поле «цена со скидкой» (для красоты чисел удобнее не задавать это поле в процентах). Определяем методы, которые будут эту информацию возвращать. Допустим, захотелось сделать комплекты из нескольких товаров. Заводим новый класс, для которого можно будет определить свое название и цену со скидкой, цена без скидки суммируется по входящим в комплект продуктам. Ну и так далее, на странице товара его можно отображать как угодно и полей может быть сколько угодно, «корзинка» же видит свой набор полей, и только его. По большому счету, если у нас уже есть система, умеющая книги, прикрутить к ней комплекты — цена написания одного небольшого класса с парой обязательных полей.
Доставка также обладает названием, стоимостью, произвольным образом зависит от содержимого корзины, адреса доставки, может быть валидной или невалидной в данных условиях (как правило, курьерская доставка в Петропавловск-Камчатский невозможна). Аналогично и с оплатой, но она зависит также и от доставки (нельзя оплатить курьера наложенным платежом).
Корзина включает в себя информацию о товарах, юзере, доставке и оплате. Заказ — до боли похож на корзину, но вся информация, которая может измениться, в нем сохраняется отдельно. Измениться могут например цены, адреса.
Если приступить к реализации, начните с простого — с товаров и корзинки. Подумайте, что такое корзина, что в нее входит кроме товаров, сколько корзин может быть у юзера, возможна ли «анонимная» корзина. Первые два вопроса позволят вам решить, какие поля и методы должны быть у объекта, вторые два — как получить конкретный объект корзины, когда захочется показать ее на странице. Реализуйте то, что получилось, пока без доставок и оплат, но чтобы на экране выглядело «как у всех». Добавляйте постепенно остальное, ищите места, где можно сделать несколько разных реализаций чего-либо при одинаковом интерфейсе — возможно, это можно будет выделить в отдельный объект. Но без необходимости тоже не крошите, будет сложно собрать в одно целое :)

Как-то так. Успехов!
Ответ написан
MpaK999
@MpaK999
Буду!
О, Perl жив! Радует :)

Объектами в магазине может быть всё, от контроллера каталога, до моделей работающих с базой.

По объектам: Каталог, Элементы каталога (товар), Корзина (связь с товарами), Пользователь > Администратор > Менеджер, Платёжка связанная с оформленной корзиной.

И если всё же останетесь в Perl, посмотрите Moose, Mojolicious.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы