-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Продумать архитектуру проекта #1
Comments
Придумывать названия очень сложно. Разделять целые модули чтобы избежать циклических зависимостей и orphaned instances, придумывая в какой модуль и в какую папку это закинуть -- тоже сложно. Совершенно не уверен в исправленной мною структуре и нейминге модулей, тем не менее выделил два основных слоя: |
В целом все хорошо, над названиями можно поработать, ага :) |
Скорее надо подумать как можно разделить работу АПИ от работы с базой данных. В текущем варианте получается что эндпойнты прямо совершают действия на базами данными и тут же возвращают джейсончик ее клиенту. Проекту явно не хватает слой бизнес логики, в которой бы было описаны чистые сущности (юзеру, посты, авторы итд). Имея чистые сущности можно было написать мапперы для АПИшки и для БД представлений, таким образом код можно будет легче понять :) |
В моем случае, название модуля, вероятно, не совсем верное, потому что единственная цель содержащихся в нем типов -- парсинг query параметров. Я вижу тут два варианта:
Относить эти типы к ядру (по крайней мере к самой его основе) я не совсем считаю обоснованным, потому что там хранится как бы "движок програмы", а что с его помощью написано это уже другой архитектурный слой (к которому относятся типы из
Основная проблема у меня была вроде в том, что при возврате вложенной структуры придется ее "выпрямлять" (возможно я выбрал плохую либу для sql (postres-simple)), что не очень удобно, а в случае с массивом произвольной длины бывает и невозможно (например, категория в посте это массив произвольной длины (от рут категории, до текущей), при этом каждый элемент массива это пара из category id и имени, я это десериализовать удобно не смог). Поэтому я от этого отказался в пользу сериализации в json на стороне бд. Вообще, немножко плевался с sql'я, когда писал, потому что чтобы хорошо абстрагироваться, придется уйти в кодогенерацию sql'я, что чревато нетестируемыми багами. Ну и с вложенностями очень неудобно работать Есть конечно вариант джоинить все и уже на стороне сервера выяснять что к чему относится, в массивы собирать, но это как то не очень звучит |
Советую попробовать разделить типы на слои приложения. Обычно это может выглядить так: API -> Domain -> Storage. И для каждого слоя используются свои типы для взаимодействия. Например для слоя API могут типы которые работают с квери парамертами. Storage занимался бы обычным представлением в базе данным, а Domain это уже не посредственно типы для основной логики приложения. Ну и так же между этими слоями нужно будет мапать между собой. :) |
Добавил |
Сейчас не очень понятно устройство приложения, так как все модули в одной папке. Нужно выделить ядро, чтобы была ясна основная цель приложения, а также инфраструктурные слои, которые занимаются доступом к базе данных, и т.д. В целом, вертикальное и горизонтальное разделение смешано, или его нет.
Можно почитать статью по теме, если не очень понятно что требуется http://aspiringcraftsman.com/2008/01/03/art-of-separation-of-concerns/
The text was updated successfully, but these errors were encountered: