Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
«Организация бизнес-логики со сложной схемой данных», Тимофей Кукушкин, ТриЛан Вологда
Search
WebDev
December 06, 2014
Programming
0
95
«Организация бизнес-логики со сложной схемой данных», Тимофей Кукушкин, ТриЛан Вологда
Расскажу о том, какой путь мы прошли, реализуя бизнес-логику сложного enterprise решения.
WebDev
December 06, 2014
Tweet
Share
More Decks by WebDev
See All by WebDev
«Тестирование веб-приложений», Андрей Кишкин, ТриЛан Вологда
webdevconf
0
95
«Еще раз про MVC и веб-фреймворки в enterprise решениях», Дмитрий Кукушкин, ТриЛан Вологда
webdevconf
0
71
Секретный доклад об управлении проектами, Наташа Юматова, Дмитрий Чернов, Трилан
webdevconf
0
73
«Низкокалорийный дизайн. Диета для сайта», Ольга Сбоева, ТриЛан Вологда
webdevconf
0
100
«Стек технологий и приемов при разработке серверной части мобильного приложения», Сергей Аникин, ТриЛан Вологда
webdevconf
0
380
Other Decks in Programming
See All in Programming
Prepare for Jakarta EE 11 - Performance and Developer Productivity
ivargrimstad
0
730
スキーマ駆動開発による品質とスピードの両立 - 私達は何故、スキーマを書くのか
kentaroutakeda
0
170
PostmanでAPIの動作確認が楽になった話
h455h1
0
170
Java 22 Overview
kishida
1
180
Behind VS Code Extensions for JavaScript / TypeScript Linnting and Formatting
unvalley
5
900
Git Rebase
bkuhlmann
11
1.6k
GitHub Copilotのススメ
marcy731
1
200
Compose-View Interop in Practice (mDevCamp 2024)
stewemetal
0
120
educure_カリキュラム生操作マニュアル.pdf
linew_official
0
740
Azure OpenAI Serviceのプロンプトエンジニアリング入門
tomokusaba
3
680
見た目から始める生産性向上
ikumatadokoro
7
830
ADRを一年運用してみた/adr_after_a_year
hanhan1978
7
2.3k
Featured
See All Featured
Done Done
chrislema
178
15k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
20
1.9k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
17
1.4k
Writing Fast Ruby
sferik
621
60k
Imperfection Machines: The Place of Print at Facebook
scottboms
260
12k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
357
22k
GitHub's CSS Performance
jonrohan
1025
450k
The MySQL Ecosystem @ GitHub 2015
samlambert
243
12k
Building Adaptive Systems
keathley
31
1.9k
How GitHub Uses GitHub to Build GitHub
holman
468
290k
How STYLIGHT went responsive
nonsquared
92
4.8k
It's Worth the Effort
3n
180
27k
Transcript
Организация бизнес логики со сложной схемой данных
Особенности схемы данных заказчика: • Часть данных внешняя, часть “локальная”
• Многоязычность • Простые типы данных • Нет ссылочной целостности
Подсистемы: • Система версионирования • Система блокировок • Система ревизионирования
• API
Как все начиналось
Толстые тупые уродливые контроллеры Class Based Views
• Для каждой модели свое приложение. • Вся обработка и
получение данных в приложениях. • Views отвечают только за взаимодействие пользователя и приложения “Приложения”
class ArticleApp(BaseApp): model = Article multilingual_model = MultilingualArticle common_fields =
['author_id'] multilingual_fields = ['title', 'content'] external_fields = ['author', 'title'] search_fields = ['title'] aliases = {'author_id': 'author'} article_app = ArticleApp()
• Прослойка между системой версионирования и моделью Django ORM •
Для каждой модели свой класс интерфейса. • Работает строго с одним объектом “Интерфейсы”
class ArticleInterface(interfaces.Interface): model = Article multilingual_model = MultilingualArticle common_fields =
['author_id'] multilingual_fields = ['title', 'content'] external_fields = ['author', 'title'] interfaces.register(ArticleInterface)
class ArticleApp(BaseApp): interface_class = ArticleInterface search_fields = ['title'] aliases =
{'author_id': 'author'} article_app = ArticleApp()
• Метаданные фрагментированы • Нет четкого публичного API • Приватное
API течет внаружу Что по-прежнему плохо
Схема данных в YAML формате
Вспомогательный класс для генерации моделей
class ArticleInterface(interfaces.Interface): model = interfaces.Model( 'Article', common_fields=[ fields.IntegerField('id', label='ID', primary_key=True,
source='Site') fields.ForeignKey('author_id', label=u'автор', source='Site', required=True, to=AuthorInterface, property_name='author') ], multilingual_fields=[ fields.TextField('title', label=u'Заголовок', required=True, source='Site', searchable=True) fields.TextField('content', label=u'Содержимое', required=False, source='Local') ], label=u'Статья' ) interfaces.register(ArticleInterface) _Article = ArticleInterface.model _MultilingualArticle = ArticleInterface.multilingual_model
class ArticleApp(BaseApp): interface_class = ArticleInterface article_app = ArticleApp()
class ArticleInterface(interfaces.Interface): name = 'Article' common_fields = [ fields.IntegerField('id', label='ID',
primary_key=True, source='Site') fields.ForeignKey('author_id', label=u'автор', source='Site', required=True, to=AuthorInterface, property_name='author') ] multilingual_fields = [ fields.TextField('title', label=u'Заголовок', required=True, source='Site', searchable=True) fields.TextField('content', label=u'Содержимое', required=False, source='Local') ] label = u'Статья' interfaces.register(ArticleInterface) _Article = ArticleInterface.model _MultilingualArticle = ArticleInterface.multilingual_model
Менеджеры
>>> from articles.models import ArticleInterface >>> objects = ArticleInterface.objects.filter( ...
include_removed=True)[:3] >>> objects [<articles.models.ArticleInterface u'Starbucks'>, <articles.models.ArticleInterface u'Lorem ipsum'>, <articles.models.ArticleInterface u'Dolor sit amet'>] >>> objects.count() 3 >>> for instance in objects: ... print instance.data.id 197 196 195
Переносим все операции над данными в интерфейсы
>>> object = objects[0] >>> object.data.locales['ru'].Title 'Starbucks' >>> version =
object.change( ... user, ... common_data={'author_id': 10}, ... locales_data={'ru': {'title': 'Bartsucks', 'content': 'Lorem ipsum'}} ... ) >>> new_object, version = ArticleInterface.objects.create( ... user, ... common_data={'author_id': 1}, ... locales_data={'ru': {'title': 'foo', 'content': 'bar'}} ... ) >>> type(new_object) articles.models.ArticleInterface
В итоге • Описание схемы данных через интерфейсы полностью отражает
схему данных заказчика • Четкое публичное API • Атомарность операций
Вопросы?