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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
WebDev
December 06, 2014
Programming
0
110
«Организация бизнес-логики со сложной схемой данных», Тимофей Кукушкин, ТриЛан Вологда
Расскажу о том, какой путь мы прошли, реализуя бизнес-логику сложного enterprise решения.
WebDev
December 06, 2014
Tweet
Share
More Decks by WebDev
See All by WebDev
«Тестирование веб-приложений», Андрей Кишкин, ТриЛан Вологда
webdevconf
0
120
«Еще раз про MVC и веб-фреймворки в enterprise решениях», Дмитрий Кукушкин, ТриЛан Вологда
webdevconf
0
80
Секретный доклад об управлении проектами, Наташа Юматова, Дмитрий Чернов, Трилан
webdevconf
0
79
«Низкокалорийный дизайн. Диета для сайта», Ольга Сбоева, ТриЛан Вологда
webdevconf
0
110
«Стек технологий и приемов при разработке серверной части мобильного приложения», Сергей Аникин, ТриЛан Вологда
webdevconf
0
460
Other Decks in Programming
See All in Programming
Windows on Ryzen and I
seosoft
0
400
Codex の「自走力」を高める
yorifuji
0
1.3k
DevinとClaude Code、SREの現場で使い倒してみた件
karia
1
1.1k
Nuxt Server Components
wattanx
0
130
20260228_JAWS_Beginner_Kansai
takuyay0ne
5
620
ファインチューニングせずメインコンペを解く方法
pokutuna
0
190
へんな働き方
yusukebe
6
2.8k
ふつうの Rubyist、ちいさなデバイス、大きな一年
bash0c7
0
1.1k
野球解説AI Agentを開発してみた - 2026/02/27 LayerX社内LT会資料
shinyorke
PRO
0
370
「効かない!」依存性注入(DI)を活用したAPI Platformのエラーハンドリング奮闘記
mkmk884
0
250
モダンOBSプラグイン開発
umireon
0
180
Codex CLIのSubagentsによる並列API実装 / Parallel API Implementation with Codex CLI Subagents
takatty
2
490
Featured
See All Featured
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
150
A Soul's Torment
seathinner
5
2.5k
Crafting Experiences
bethany
1
94
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
91
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
2.5k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
280
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.2k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.1k
Practical Orchestrator
shlominoach
191
11k
Color Theory Basics | Prateek | Gurzu
gurzu
0
260
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
230
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 • Атомарность операций
Вопросы?