![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| weldpua2008 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 28.12.2008 Репутация: нет Всего: нет |
Добрый день
Пишу приложение "Склад":
Набрасал примерную схему базы данных ![]() Помогите с шаблонами проектирования и архитектурой |
||||
|
|||||
| Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 20 Всего: 42 |
С шаблонами проектирования чего?
-------------------- Мир это Я. Живее всех живых. |
|||
|
||||
| weldpua2008 |
|
||||||||||||||||||||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 28.12.2008 Репутация: нет Всего: нет |
добрый вечер
раньше их не использовал — всегда писал код (наверное это и есть знаменитый быдло-код), который описывает то что "происходит" (без попыток убрать дубли в коде, с последующим переписыванием). Теперь есть желание встать на правильный путь. В этом и прошу помощи... Для работы с базой буду использовать godb Во первых: Реализация функций доступа (ACL) — когда пользователи или конкретная группа имеют возможность выполнять данное действие (Читать/Писать/Просматривать). Разрешения храняться в базе данных Вопрос - лучше проверять при действии (сохранение/просмотр/удаление/обновление) или дополнительно при недостаточности прав менять html-код. Отключаем кнопку сохранить, если нет прав:
на одном блоге "Шаблон проектирования фабрика (factory method)" - в данном виде он не применим тут (там статически заданы группы и пользователи)
на хабре в коментариях:
вот про Аспектно-ориентированное программирование c Go! AOP PHP слышал
тут есть интереная мысль:
отсюда можно почерпнуть интересную идею в хранении всех прав в виде Json
Во вторых: Есть обьекты: товар(он храниться на складах), операции Приход/Уход/Списание товара, Пользователи, склады, привилегии(ACL) и т.д. Сами операции для их сохранения, редактирования, обновления, удаления и просмотра - можно ли использовать некий шаблон проектирования? (например фабрику?) например если классами:
Имеет ли смысл разбивать функции просмотра и модификации (создания/удаления/редактирования) на разные классы? Ведь для некоторых классов нужно кеширование (привилегии (ACL), Склады, Пользователи), причём это не обязательно какой-то определённый вид кеша(мемкеш). И самый главный вопрос: Как проектировать систему, что бы она была модульной? Был склад: Приход/Уход/Списание. Добавили модуль "Купон": теперь при Реализации товара покупатель получает скидку. При этом консистентность склада (Приход- (Уход+Реализация+Списание) = 0 ) Это сообщение отредактировал(а) weldpua2008 - 10.3.2013, 01:29 |
||||||||||||||||||||
|
|||||||||||||||||||||
| Fortop |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 20 Всего: 42 |
weldpua2008, для начала стоит понять, что никакой шаблон проектирования не налезет на систему. В силу сложности системы.
Поэтому можно говорить об уместности использования того или иного шаблона для реализации какой-либо части. Вот отсюда давайте и начинать плясать. А не со стека "новинок", которые хочется потыкать. http://en.wikipedia.org/wiki/Software_design_pattern http://en.wikipedia.org/wiki/Design_Patterns
Можно. Active Record, Table data gateway, Row data gateway, Data mapper и т.д. Какой нужен? http://martinfowler.com/eaaCatalog/index.html
Рекомендую начинать с того, что мешает самому и не нравится. Например - мешает дублирование кода. Вот от него и пляшем - смотрим как мы можем избежать его. Модульной и проектировать. Предусматривать для каждого(необязательно) участвующего объекта связи и возможность влияния на них или их поведение. Исходите из того, что части вашего кода должны знать как можно меньше друг о друге. Т.е., например, мне нужны данные определенного формата, а откуда я получаю эти данные (из кеша или БД) - не имеет значения. -------------------- Мир это Я. Живее всех живых. |
||||
|
|||||
| weldpua2008 |
|
||||||||||||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 28.12.2008 Репутация: нет Всего: нет |
это понятно ;) Разве это не способ чтения/записи данных из базы данных? Я про организацию/структуру/архитектуру самих классов, которые сохраняют и читают обьекты. И то как их проектировать. Допустим, что мне нужно товар, склады, пользователей и так далее хранить не в базе данных, а на диске или "неком" хранилище? А если нужно кеширование? А если нужно для некоторых обьектов добавить проверку или операцию? Нужно менять весь код? (Например: Интернет-магазин на одном SQL-сервере, а текущее приложение Склада на другом, при этом синхронизация идёт с помощью промежуточного приложения). Структуру базы данных(картинка в начале) и библиотека для доступа к ней godb, которые использую. Думаю, что Decorator (Wrapper)/Facade/Proxy подойдет для организации (а там обьект с каким паттерном Active Record/Table data gateway/ Data mapper или же на какой библиотеке Propel/Doctrine не важно???) операций чтения/записи обьектов в систему хранения данных.
да, как? Для себя здесь нашел подсказку как не нарушать принцип единственной ответственности :
Я и сам на такое не раз попадался ;) Там же есть решение этого вопроса:
Ну это Я понимаю. По сути дела в моём случае модули: ACL-ы, склады, товар, пользователи и так далее. Например права доступа не зависят от наличия/отсутствия пользователей. По сути это лишь метки/маски или иные признаки, что можно/нельзя делать с данным ресурсом. А вот логика(модуль логики) системы прав доступа реализует: "если у ресурса статья маска 'rrw', то группа 'Гости и Авторы' могут лишь читать её, но не изменять". По крайней мере мне это кажется логичным, но не понятно как это реализовать. Вот только |
||||||||||||
|
|||||||||||||
| Fortop |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 20 Всего: 42 |
В чем разница?
Разбить код на минимальные логически связанные участки и выделить их в методы/функции. На примере библиотеки работы с БД уже можно было это увидеть. Ведь не имеет значения какого рода данные будут сохраняться с ее помощью. -------------------- Мир это Я. Живее всех живых. |
||||
|
|||||
| weldpua2008 |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 28.12.2008 Репутация: нет Всего: нет |
Кстати вопрос по поводу прав доступа. По идеи каждый класс должен решать свои задачи. Но когда идёт речь о проверки прав доступа к определённой операции получается зависимости. Теперь в наш клас, который Создаёт/Обновляет/Удаляет обьекты "User" явно задана логика проверки прав:
Ведь как мы проверяем права доступа?
|
||||||
|
|||||||
| Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 20 Всего: 42 |
Получаются. От зависимостей полностью не избавится. Два варианта. Либо вы делаете проверку доступа на моменте работы с элементом управления (т.е. до вызова User->create()) Или каким-либо образом связываете свои модели с системой проверки прав (например, при помощи того же Dependency Injection). -------------------- Мир это Я. Живее всех живых. |
|||
|
||||
![]()
|
| Правила форума "PHP" | |
|
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |