Pull to refresh

Я не могу спроектировать архитектуру своего интернет-магазина или как я пишу «под клиента»

Reading time 3 min
Views 7.2K

Эта статья будет в форме вопроса. Я опишу свою проблему, с которой столкнулся при написании сайта.

Начнем! Вы уже, возможно, знаете меня, а если нет, то советую прочитать про меня тут, и тут.

Как я написал свой интернет-магазин

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

После этого я пытался переписать папину программу для автоматизации магазинов. Писал на WPF. Много чему научился, получил огромный опыт, но конечно же не написал и 1% того, что нужно было.

Потом тем же магазинам мяса захотелось интернет-магазин. Я и предложил написать. Потом захотел ещё один клиент, ещё один, и ещё.. Сейчас пишу магазин электротоваров.

Короче говоря, мой интернет-магазин написан на Blazor.

Когда я обещал написать его, я в душе не знал, что такое ASP.NET Core(Blazor). C# знал 2 месяца. Умел верстать сайты, немного знал CMS, немного умел работать с базами данных.

Также мне нужно было написать админку, где можно менять цены на продукты, добавлять категории и много чего еще. Ещё, на сайте автоматически заказ отправлялся на магазин по адресу в папину программу. Нужно было сделать возможность поменять магазин, который обслуживает заказ.

Решил для админки написать приложение на WPF, так как уже знал его, а на самом сайте мне тогда было сложно сделать.

Когда я писал для одного клиента, то было ещё все хорошо. Но уже скоро стали появляться проблемы.

Вот, например: для сети магазинов я делал справочник магазинов, где можно указывать название, загружать картинки, написать адрес и прочее. Это потом было отображено на старице на сайте. И также к этим магазинам нужно было привязать адреса, которые обслуживает точка.

Второй клиент был с одним магазином, и, естественно, зачем ему нужен справочник магазинов? Что делать?

Настройки - всему голова!

Да, я просто создавал настройку. Называл её, например, ShowShopsInMenuDesktop. Хранил в виде key-value в таблице.

Такая же ситуация и на сайте. Для этого, кстати, и приставка Desktop к настройке.

Таких настроек у меня сейчас уже 111!

Я путаюсь в них, что-то, в них, поменять - достаточно проблематичная задача.

Почему так много? Очень много деталей, которые нужно настраивать, и их количество только увеличивается.

Как я пишу «под клиента»

Ну 200 настроек, и что с того? Сложность даже не в настройках, а в коде, где их нужно проверять.

Очень, очень много if-ов! Один if вложенный в if, который вложен ещё в один if!

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

Как я это пытаюсь решить

Я нашёл решение, которым пользуюсь постоянно, и которое хоть как-то спасает меня.

Решение такое: Если много проверок и настроек - вынеси это в базу в нужном виде и генерируй в программе из базы.

Есть у меня меню. Можно задавать настройки для каждого пункта типа ShowItemInMenu, а можно просто хранить пункты меню в таблице Menu и генерировать меню из базы.

Гибкости больше, все удобно и не засоряет настройки. Прекрасно!

Почему это не работает

Да, большинство настроек можно убрать и переместить в другую таблицу в нужном виде.

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

У меня есть настройка CanUserBuyProducts. Она отвечает за то, что человек может купить продукт, добавить его в корзину. Если она выключена, то пользователь сможет только смотреть продукты. Мое решение здесь не работает. И таких настроек тоже очень много, и даже если максимально вынести все правильно в базу, то проблема все равно останется.

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

Поэтому стили у меня хранятся в css файлах, которые я могу менять. Никакого Sass, PostCSS и прочих предпроцессоров, только чистый CSS, только хардкор! Ладно, шутка)) Люблю чистый CSS.

Но хранение css в файлах лишает меня многих возможностей. Например, бандлинг.

А что с шаблоном компонента? А ничего... Добавляю десятки настроек, чтобы сделать элементарную вещь.

С приложением WPF еще сложнее. Настройка нужна на каждую мелочь. Нужно сделать фон отчета красным? Настройка! Убрать кнопку? Настройка!

Генерировать и хранить всю форму в базе со всеми параметрами и элементами на ней - это уже перебор, просто бред.

И что же делать?

Я провел месяцы в размышлениях и поисках решения. Но пока "стек" решений у меня остается прежним.

Писать отдельный сайт каждому клиенту каждый со своими багами и проблемами? Нет, спасибо.

Может сделать отдельную ветку каждому клиенту, а потом сливать их? Еще хуже!

Единственная статья на Хабре, которая поднимает похожий вопрос - это «Как мы дорабатываем продукт под конкретного клиента» от LsFusion. Я других не нашел.

В их статье они пришли к решению - модульность. Круто, они написали свой собственный язык программирования, а мне-то что делать?

Я думаю, что такая проблема возникает у многих. Как ее решить, вот в чем вопрос?

Ссылки на Github проект:

ShopWeb - сам сайт

ShopWebData - сущности

ShopWebApp - приложение

Tags:
Hubs:
-9
Comments 15
Comments Comments 15

Articles