[ÐопÑоÑÑ Ð´Ð»Ñ ÑобеÑедованиÑ](README.md)
# ÐÐÐ + ÐикÑоÑеÑвиÑÑ
+ [ЧÑо Ñакое _ÐÐÐ_?](#ЧÑо-Ñакое-ÐÐÐ)
+ [ÐазовиÑе оÑновнÑе пÑинÑÐ¸Ð¿Ñ _ÐÐÐ_.](#ÐазовиÑе-оÑновнÑе-пÑинÑипÑ-ÐÐÐ)
+ [ЧÑо Ñакое _«инкапÑÑлÑÑиÑ»_?](#ЧÑо-Ñакое-инкапÑÑлÑÑиÑ)
+ [ЧÑо Ñакое _«наÑледование»_?](#ЧÑо-Ñакое-наÑледование)
+ [ЧÑо Ñакое _«полимоÑÑизм»_?](#ЧÑо-Ñакое-полимоÑÑизм)
+ [ЧÑо Ñакое _«абÑÑÑакÑиÑ»_?](#ЧÑо-Ñакое-абÑÑÑакÑиÑ)
+ [ЧÑо пÑедÑÑавлÑÐµÑ Ñобой _«обмен ÑообÑениÑми»_?](#ЧÑо-пÑедÑÑавлÑеÑ-Ñобой-обмен-ÑообÑениÑми)
+ [РаÑÑкажиÑе пÑо оÑновнÑе понÑÑÐ¸Ñ ÐÐÐ: _«клаÑÑ»_, _«обÑекÑ»_, _«инÑеÑÑейÑ»_.](#РаÑÑкажиÑе-пÑо-оÑновнÑе-понÑÑиÑ-ÐÐÐ-клаÑÑ-обÑекÑ-инÑеÑÑейÑ)
+ [Ð Ñем заклÑÑаÑÑÑÑ Ð¿ÑеимÑÑеÑÑва и недоÑÑаÑки обÑекÑно-оÑиенÑиÑованного подÑ
ода в пÑогÑаммиÑовании?](#Ð-Ñем-заклÑÑаÑÑÑÑ-пÑеимÑÑеÑÑва-и-недоÑÑаÑки-обÑекÑно-оÑиенÑиÑованного-подÑ
ода-в-пÑогÑаммиÑовании)
+ [ЧÑо подÑазÑмеваÑÑ Ð² плане пÑинÑипов ÐÐРвÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ _«ÑвлÑеÑÑÑ»_ и _«имееÑ»_?](#ЧÑо-подÑазÑмеваÑÑ-в-плане-пÑинÑипов-ÐÐÐ-вÑÑажениÑ-ÑвлÑеÑÑÑ-и-имееÑ)
+ [Ð Ñем ÑазниÑа Ð¼ÐµÐ¶Ð´Ñ _композиÑией_ и _агÑегаÑией_?](#Ð-Ñем-ÑазниÑа-междÑ-композиÑией-и-агÑегаÑией)
+ [ЧÑо Ñакое _ÑÑаÑиÑеÑкое_ и _динамиÑеÑкое ÑвÑзÑвание_?](#ЧÑо-Ñакое-ÑÑаÑиÑеÑкое-и-динамиÑеÑкое-ÑвÑзÑвание)
+ [ÐÑинÑип SOLID?](#ÐÑинÑип-SOLID)
+ [ЧÑо Ñакое ÐонолиÑ, ÐикÑоÑеÑвиÑ?](#ЧÑо-Ñакое-ÐонолиÑ,-ÐикÑоÑеÑвиÑ)
+ [ЧÑо Ñакое Continuous Integration, Continuous Delivery/Deployment?](#ЧÑо-Ñакое-Continuous-Integration,-Continuous-Delivery/Deployment)
+ [ЧÑо вÑбÑаÑÑ ÐÐ¾Ð½Ð¾Ð»Ð¸Ñ Ð¸Ð»Ð¸ ÐикÑоÑеÑвиÑ?](#ЧÑо-вÑбÑаÑÑ-ÐонолиÑ-или-ÐикÑоÑеÑвиÑ)
+ [ÐзаимодейÑÑвие Ð¼ÐµÐ¶Ð´Ñ Ð¼Ð¸ÐºÑоÑеÑвиÑами](#ÐзаимодейÑÑвие-междÑ-микÑоÑеÑвиÑами)
+ [OpenAPI](#OpenAPI)
+ [ТеÑÑиÑование микÑоÑеÑвиÑов](#ТеÑÑиÑование-микÑоÑеÑвиÑов)
+ [РаÑпÑÐµÐ´ÐµÐ»ÐµÐ½Ð½Ð°Ñ ÑÑаÑÑиÑовка](#РаÑпÑеделеннаÑ-ÑÑаÑÑиÑовка)
## ЧÑо Ñакое _ÐÐÐ_?
__ÐбÑекÑно-оÑиенÑиÑованное пÑогÑаммиÑование (ÐÐÐ)__ â меÑÐ¾Ð´Ð¾Ð»Ð¾Ð³Ð¸Ñ Ð¿ÑогÑаммиÑованиÑ, оÑÐ½Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð½Ð° пÑедÑÑавлении пÑогÑÐ°Ð¼Ð¼Ñ Ð² виде ÑовокÑпноÑÑи обÑекÑов, каждÑй из коÑоÑÑÑ
ÑвлÑеÑÑÑ ÑкземплÑÑом опÑеделенного клаÑÑа, а клаÑÑÑ Ð¾Ð±ÑазÑÑÑ Ð¸ÐµÑаÑÑ
Ð¸Ñ Ð½Ð°ÑледованиÑ.
+ обÑекÑно-оÑиенÑиÑованное пÑогÑаммиÑование иÑполÑзÑÐµÑ Ð² каÑеÑÑве оÑновнÑÑ
логиÑеÑкиÑ
конÑÑÑÑкÑивнÑÑ
ÑлеменÑов обÑекÑÑ, а не алгоÑиÑмÑ;
+ каждÑй обÑÐµÐºÑ ÑвлÑеÑÑÑ ÑкземплÑÑом опÑеделенного клаÑÑа
+ клаÑÑÑ Ð¾Ð±ÑазÑÑÑ Ð¸ÐµÑаÑÑ
ии.
ÐÑогÑамма ÑÑиÑаеÑÑÑ Ð¾Ð±ÑекÑно-оÑиенÑиÑованной, ÑолÑко еÑли вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ñ Ð²Ñе ÑÑи ÑказаннÑÑ
ÑÑебованиÑ. Ð ÑаÑÑноÑÑи, пÑогÑаммиÑование, не иÑполÑзÑÑÑее наÑледование, назÑваеÑÑÑ Ð½Ðµ обÑекÑно-оÑиенÑиÑованнÑм, а пÑогÑаммиÑованием Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð°Ð±ÑÑÑакÑнÑÑ
Ñипов даннÑÑ
.
СоглаÑно паÑадигме ÐÐРпÑогÑамма ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· обÑекÑов, обмениваÑÑиÑ
ÑÑ ÑообÑениÑми. ÐбÑекÑÑ Ð¼Ð¾Ð³ÑÑ Ð¾Ð±Ð»Ð°Ð´Ð°ÑÑ ÑоÑÑоÑнием, единÑÑвеннÑй ÑпоÑоб измениÑÑ ÑоÑÑоÑние обÑекÑа - поÑлаÑÑ ÐµÐ¼Ñ ÑообÑение, в оÑÐ²ÐµÑ Ð½Ð° коÑоÑое, обÑÐµÐºÑ Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ ÑобÑÑвенное ÑоÑÑоÑние.
[к оглавлениÑ](#ÐÐÐ)
## ÐазовиÑе оÑновнÑе пÑинÑÐ¸Ð¿Ñ _ÐÐÐ_.
+ _ÐнкапÑÑлÑÑиÑ_ - ÑокÑÑÑие ÑеализаÑии.
+ _ÐаÑледование_ - Ñоздание новой ÑÑÑноÑÑи на базе Ñже ÑÑÑеÑÑвÑÑÑей.
+ _ÐолимоÑÑизм_ - возможноÑÑÑ Ð¸Ð¼ÐµÑÑ ÑазнÑе ÑоÑÐ¼Ñ Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð¹ и Ñой же ÑÑÑноÑÑи.
+ _ÐбÑÑÑакÑиÑ_ - Ð½Ð°Ð±Ð¾Ñ Ð¾Ð±ÑиÑ
Ñ
аÑакÑеÑиÑÑик.
+ _ÐеÑеÑÑлка ÑообÑений_ - ÑоÑма ÑвÑзи, взаимодейÑÑÐ²Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñ ÑÑÑноÑÑÑми.
+ _ÐеÑеиÑполÑзование_- вÑе ÑÑо пеÑеÑиÑлено вÑÑе ÑабоÑÐ°ÐµÑ Ð½Ð° повÑоÑное иÑполÑзование кода.
ÐÑо единÑÑвенно веÑнÑй поÑÑдок паÑадигм ÐÐÐ, Ñак как ÐºÐ°Ð¶Ð´Ð°Ñ Ð¿Ð¾ÑледÑÑÑÐ°Ñ Ð¸ÑполÑзÑÐµÑ Ð¿ÑедÑдÑÑие.
[к оглавлениÑ](#ÐÐÐ)
## ЧÑо Ñакое _«инкапÑÑлÑÑиÑ»_?
__ÐнкапÑÑлÑÑиÑ__ â ÑÑо ÑвойÑÑво ÑиÑÑемÑ, позволÑÑÑее обÑединиÑÑ Ð´Ð°Ð½Ð½Ñе и меÑодÑ, ÑабоÑаÑÑие Ñ Ð½Ð¸Ð¼Ð¸, в клаÑÑе и ÑкÑÑÑÑ Ð´ÐµÑали ÑеализаÑии Ð¾Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ, оÑкÑÑв ÑолÑко Ñо, ÑÑо необÑ
одимо пÑи поÑледÑÑÑем иÑполÑзовании.
Ð¦ÐµÐ»Ñ Ð¸Ð½ÐºÐ°Ð¿ÑÑлÑÑии â ÑйÑи Ð¾Ñ Ð·Ð°Ð²Ð¸ÑимоÑÑи внеÑнего инÑеÑÑейÑа клаÑÑа (Ñо, ÑÑо могÑÑ Ð¸ÑполÑзоваÑÑ Ð´ÑÑгие клаÑÑÑ) Ð¾Ñ ÑеализаÑии. ЧÑÐ¾Ð±Ñ Ð¼Ð°Ð»ÐµÐ¹Ñее изменение в клаÑÑе не влекло за Ñобой изменение внеÑнего Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ ÐºÐ»Ð°ÑÑа.
[к оглавлениÑ](#ÐÐÐ)
## ЧÑо Ñакое _«наÑледование»_?
__ÐаÑледование__ â ÑÑо ÑвойÑÑво ÑиÑÑемÑ, позволÑÑÑее опиÑаÑÑ Ð½Ð¾Ð²Ñй клаÑÑ Ð½Ð° оÑнове Ñже ÑÑÑеÑÑвÑÑÑего Ñ ÑаÑÑиÑно или полноÑÑÑÑ Ð·Ð°Ð¸Ð¼ÑÑвÑÑÑейÑÑ ÑÑнкÑионалÑноÑÑÑÑ.
ÐлаÑÑ, Ð¾Ñ ÐºÐ¾ÑоÑого пÑоизводиÑÑÑ Ð½Ð°Ñледование, назÑваеÑÑÑ _пÑедком_, _базовÑм_ или _ÑодиÑелÑÑким_. ÐовÑй клаÑÑ â _поÑомком_, _наÑледником_ или _пÑоизводнÑм_ клаÑÑом.
[к оглавлениÑ](#ÐÐÐ)
## ЧÑо Ñакое _«полимоÑÑизм»_?
__ÐолимоÑÑизм__ â ÑÑо ÑвойÑÑво ÑиÑÑÐµÐ¼Ñ Ð¸ÑполÑзоваÑÑ Ð¾Ð±ÑекÑÑ Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñм инÑеÑÑейÑом без инÑоÑмаÑии о Ñипе и внÑÑÑенней ÑÑÑÑкÑÑÑе обÑекÑа. Т.е. иÑполÑзоваÑÑ ÑазнÑе обÑекÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ð¾, ÑеÑез обÑий инÑеÑÑейÑ.
ÐÑимеÑ: Ñ Ð½Ð°Ñ ÐµÑÑÑ Ð¼ÐµÑод draw(). ÐÐ»Ñ ÐºÑÑга он ÑиÑÑÐµÑ Ð¾ÐºÑÑжноÑÑÑ, Ð´Ð»Ñ ÐºÐ²Ð°Ð´ÑаÑа â квадÑаÑ. Ðо Ð¼Ñ Ð¾Ð±ÑаÑаемÑÑ Ðº ним одинаково: figure.draw().
ÐÑеимÑÑеÑÑвом полимоÑÑизма ÑвлÑеÑÑÑ Ñо, ÑÑо он Ð¿Ð¾Ð¼Ð¾Ð³Ð°ÐµÑ ÑнижаÑÑ ÑложноÑÑÑ Ð¿ÑогÑамм, ÑазÑеÑÐ°Ñ Ð¸ÑполÑзование одного и Ñого же инÑеÑÑейÑа Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð¸Ñ ÐµÐ´Ð¸Ð½Ð¾Ð³Ð¾ набоÑа дейÑÑвий. ÐÑÐ±Ð¾Ñ Ð¶Ðµ конкÑеÑного дейÑÑвиÑ, в завиÑимоÑÑи Ð¾Ñ ÑиÑÑаÑии, возлагаеÑÑÑ Ð½Ð° компилÑÑÐ¾Ñ ÑзÑка пÑогÑаммиÑованиÑ. ÐÑÑÑда ÑледÑÐµÑ ÐºÐ»ÑÑÐµÐ²Ð°Ñ Ð¾ÑобенноÑÑÑ Ð¿Ð¾Ð»Ð¸Ð¼Ð¾ÑÑизма - иÑполÑзование обÑекÑа пÑоизводного клаÑÑа, вмеÑÑо обÑекÑа базового (поÑомки могÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑ ÑодиÑелÑÑкое поведение, даже еÑли обÑаÑение к ним бÑÐ´ÐµÑ Ð¿ÑоизводиÑÑÑÑ Ð¿Ð¾ ÑÑÑлке ÑодиÑелÑÑкого Ñипа).
ÐолимоÑÑизм бÑÐ²Ð°ÐµÑ _динамиÑеÑким_ (пеÑеопÑеделение меÑодов в поÑомкаÑ
) и _ÑÑаÑиÑеÑким_ (пеÑегÑÑзка меÑодов -одинаковое имÑ, ÑазнÑе паÑамеÑÑÑ).
_ÐолимоÑÑÐ½Ð°Ñ Ð¿ÐµÑеменнаÑ_, ÑÑо пеÑеменнаÑ, коÑоÑÐ°Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑинимаÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÑазнÑÑ
Ñипов, а _полимоÑÑÐ½Ð°Ñ ÑÑнкÑиÑ_, ÑÑо ÑÑнкÑÐ¸Ñ Ñ ÐºÐ¾ÑоÑой Ñ
оÑÑ Ð±Ñ Ð¾Ð´Ð¸Ð½ аÑгÑÐ¼ÐµÐ½Ñ ÑвлÑеÑÑÑ Ð¿Ð¾Ð»Ð¸Ð¼Ð¾ÑÑной пеÑеменной.
ÐÑделÑÑÑ Ð´Ð²Ð° вида полимоÑÑнÑÑ
ÑÑнкÑий:
+ _ad hoc_, ÑÑнкÑÐ¸Ñ Ð²ÐµÐ´ÐµÑ ÑÐµÐ±Ñ Ð¿Ð¾ ÑÐ°Ð·Ð½Ð¾Ð¼Ñ Ð´Ð»Ñ ÑазнÑÑ
Ñипов аÑгÑменÑов (напÑимеÑ, ÑÑнкÑÐ¸Ñ `draw()` â ÑиÑÑÐµÑ Ð¿Ð¾ ÑÐ°Ð·Ð½Ð¾Ð¼Ñ ÑигÑÑÑ ÑазнÑÑ
Ñипов);
+ _паÑамеÑÑиÑеÑкий_, ÑÑнкÑÐ¸Ñ Ð²ÐµÐ´ÐµÑ ÑÐµÐ±Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ð¾ Ð´Ð»Ñ Ð°ÑгÑменÑов ÑазнÑÑ
Ñипов (напÑимеÑ, ÑÑнкÑÐ¸Ñ `add()` â одинаково ÐºÐ»Ð°Ð´ÐµÑ Ð² конÑÐµÐ¹Ð½ÐµÑ ÑлеменÑÑ ÑазнÑÑ
Ñипов).
[к оглавлениÑ](#ÐÐÐ)
## ЧÑо Ñакое _«абÑÑÑакÑиÑ»_?
_ÐбÑÑÑагиÑование_ â ÑÑо ÑпоÑоб вÑделиÑÑ Ð½Ð°Ð±Ð¾Ñ Ð¾Ð±ÑиÑ
Ñ
аÑакÑеÑиÑÑик обÑекÑа, иÑклÑÑÐ°Ñ Ð¸Ð· ÑаÑÑмоÑÑÐµÐ½Ð¸Ñ ÑаÑÑнÑе и незнаÑимÑе. СооÑвеÑÑÑвенно, __абÑÑÑакÑиÑ__ â ÑÑо Ð½Ð°Ð±Ð¾Ñ Ð²ÑеÑ
ÑакиÑ
Ñ
аÑакÑеÑиÑÑик.
ÐÑимеÑ: когда Ð¼Ñ Ð³Ð¾Ð²Ð¾Ñим «маÑина», нам важно, ÑÑо Ñ Ð½ÐµÑ ÐµÑÑÑ Ð´Ð²Ð¸Ð³Ð°ÑÐµÐ»Ñ Ð¸ колÑÑа, а ÑÐ²ÐµÑ ÐºÐ¾Ð²Ñиков внÑÑÑи â неважно.
[к оглавлениÑ](#ÐÐÐ)
## ЧÑо пÑедÑÑавлÑÐµÑ Ñобой _«обмен ÑообÑениÑми»_?
ÐбÑекÑÑ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð´ÐµÐ¹ÑÑвÑÑÑ, поÑÑÐ»Ð°Ñ Ð¸ полÑÑÐ°Ñ ÑообÑениÑ. СообÑение â ÑÑо запÑÐ¾Ñ Ð½Ð° вÑполнение дейÑÑÐ²Ð¸Ñ + даннÑе.
Ð ÐÐРпоÑÑлка ÑообÑÐµÐ½Ð¸Ñ (вÑзов меÑода) â ÑÑо единÑÑвеннÑй пÑÑÑ Ð¿ÐµÑедаÑÑ ÑпÑавление обÑекÑÑ. ÐÑли обÑÐµÐºÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ «оÑвеÑаÑÑ» на ÑÑо ÑообÑение, Ñо Ñ Ð½ÐµÐ³Ð¾ должна имеÑÑÑÑ ÑооÑвеÑÑÑвÑÑÑий Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ ÑообÑÐµÐ½Ð¸Ñ Ð¼ÐµÑод. Так же обÑекÑÑ, иÑполÑзÑÑ Ñвои меÑодÑ, могÑÑ Ð¸ Ñами поÑÑлаÑÑ ÑообÑÐµÐ½Ð¸Ñ Ð´ÑÑгим обÑекÑам.
[к оглавлениÑ](#ÐÐÐ)
## РаÑÑкажиÑе пÑо оÑновнÑе понÑÑÐ¸Ñ ÐÐÐ: _«клаÑÑ»_, _«обÑекÑ»_, _«инÑеÑÑейÑ»_.
__ÐлаÑÑ__ â Ñаблон опиÑÐ°Ð½Ð¸Ñ ÑÑÑноÑÑи, опÑеделÑÑÑий ÑоÑÑоÑние и поведение, завиÑÑÑее Ð¾Ñ ÑÑого ÑоÑÑоÑниÑ, а Ñакже пÑавила Ð´Ð»Ñ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð´ÐµÐ¹ÑÑÐ²Ð¸Ñ Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ ÑÑÑноÑÑÑÑ (конÑÑакÑ).
С ÑоÑки зÑÐµÐ½Ð¸Ñ Ð¿ÑогÑаммиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ»Ð°ÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑаÑÑмаÑÑиваÑÑ ÐºÐ°Ðº Ð½Ð°Ð±Ð¾Ñ Ð´Ð°Ð½Ð½ÑÑ
(полей, аÑÑибÑÑов, Ñленов клаÑÑа) и ÑÑнкÑий Ð´Ð»Ñ ÑабоÑÑ Ñ Ð½Ð¸Ð¼Ð¸ (меÑодов).
С ÑоÑки зÑÐµÐ½Ð¸Ñ ÑÑÑÑкÑÑÑÑ Ð¿ÑогÑаммÑ, клаÑÑ ÑвлÑеÑÑÑ ÑложнÑм Ñипом даннÑÑ
.
__ÐбÑÐµÐºÑ (ÑкземплÑÑ)__ â ÑÑо оÑделÑнÑй пÑедÑÑавиÑÐµÐ»Ñ ÐºÐ»Ð°ÑÑа, имеÑÑий конкÑеÑное ÑоÑÑоÑние и поведение, полноÑÑÑÑ Ð¾Ð¿ÑеделÑемое клаÑÑом. ÐаждÑй обÑÐµÐºÑ Ð¸Ð¼ÐµÐµÑ ÐºÐ¾Ð½ÐºÑеÑнÑе знаÑÐµÐ½Ð¸Ñ Ð°ÑÑибÑÑов и меÑодÑ, ÑабоÑаÑÑие Ñ ÑÑими знаÑениÑми на оÑнове пÑавил, заданнÑÑ
в клаÑÑе.
__ÐнÑеÑÑейÑ__ â ÑÑо Ð½Ð°Ð±Ð¾Ñ Ð¼ÐµÑодов клаÑÑа, доÑÑÑпнÑÑ
Ð´Ð»Ñ Ð¸ÑполÑзованиÑ. ÐнÑеÑÑейÑом клаÑÑа бÑÐ´ÐµÑ ÑвлÑÑÑÑÑ Ð½Ð°Ð±Ð¾Ñ Ð²ÑеÑ
его пÑблиÑнÑÑ
меÑодов в ÑовокÑпноÑÑи Ñ Ð½Ð°Ð±Ð¾Ñом пÑблиÑнÑÑ
аÑÑибÑÑов. Ðо ÑÑÑи, инÑеÑÑÐµÐ¹Ñ ÑпеÑиÑиÑиÑÑÐµÑ ÐºÐ»Ð°ÑÑ, ÑÑÑко опÑеделÑÑ Ð²Ñе возможнÑе дейÑÑÐ²Ð¸Ñ Ð½Ð°Ð´ ним.
[к оглавлениÑ](#ÐÐÐ)
## Ð Ñем заклÑÑаÑÑÑÑ Ð¿ÑеимÑÑеÑÑва и недоÑÑаÑки обÑекÑно-оÑиенÑиÑованного подÑ
ода в пÑогÑаммиÑовании?
â
Ðлиже к ÑеловеÑеÑÐºÐ¾Ð¼Ñ Ð²Ð¾ÑпÑиÑÑÐ¸Ñ Ð¼Ð¸Ñа.
â
Ðод ÑазбиваеÑÑÑ Ð½Ð° логиÑнÑе ÑаÑÑи.
â
Удобнее поддеÑживаÑÑ Ð¸ ÑаÑÑиÑÑÑÑ.
â
Ðод можно пеÑеиÑполÑзоваÑÑ.
â
Ðегко добавлÑÑÑ Ð½Ð¾Ð²Ñе обÑекÑÑ Ð¸ изменÑÑÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ пÑогÑаммÑ.
â Ðногда Ñложно понÑÑÑ, где ÑÑо наÑледÑеÑÑÑ.
â ÐеÑÐ¾Ð´Ñ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Â«ÑазмазанÑ» по ÑазнÑм клаÑÑам.
â ÐокÑменÑиÑоваÑÑ Ñложнее. ÐоÑколÑÐºÑ Ð»Ñбой меÑод Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÐµÑеопÑеделен, в докÑменÑаÑии должно говоÑиÑÑÑÑ Ð½Ðµ ÑолÑко о Ñом, ÑÑо Ð´ÐµÐ»Ð°ÐµÑ Ð´Ð°Ð½Ð½Ñй меÑод, но и о Ñом, в каком конÑекÑÑе он вÑзÑваеÑÑÑ.
â ÐополниÑелÑнÑе ÑаÑÑ
Ð¾Ð´Ñ Ð¿Ð°Ð¼ÑÑи и пÑоизводиÑелÑноÑÑи.
â ÐзбÑÑоÑноÑÑÑ. ЧаÑÑо ÑодеÑжиÑÑÑ Ð±Ð¾Ð»ÑÑе меÑодов, Ñем ÑÑо ÑеалÑно необÑ
одимо ÑекÑÑей пÑогÑамме. РпоÑколÑÐºÑ Ð»Ð¸Ñние меÑÐ¾Ð´Ñ Ð½Ðµ могÑÑ Ð±ÑÑÑ ÑдаленÑ, они ÑÑановÑÑÑÑ Ð¼ÐµÑÑвÑм гÑÑзом.
[к оглавлениÑ](#ÐÐÐ)
## ЧÑо подÑазÑмеваÑÑ Ð² плане пÑинÑипов ÐÐРвÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ _«ÑвлÑеÑÑÑ»_ и _«имееÑ»_?
__«ÑвлÑеÑÑÑ»__ подÑазÑÐ¼ÐµÐ²Ð°ÐµÑ Ð½Ð°Ñледование. ÐлаÑÑ _cat_ ÑвлÑеÑÑÑ Ð¿Ð¾Ñомком клаÑÑа _animal_
__«имееÑ»__ агÑегаÑÐ¸Ñ Ð¸Ð»Ð¸ композиÑиÑ. ÐлаÑÑ _car_ Ð¸Ð¼ÐµÐµÑ ÐºÐ»Ð°ÑÑ _engine_
[к оглавлениÑ](#ÐÐÐ)
## Ð Ñем ÑазниÑа Ð¼ÐµÐ¶Ð´Ñ _композиÑией_ и _агÑегаÑией_?
ÐÑÑоÑиаÑÐ¸Ñ Ð¾Ð±Ð¾Ð·Ð½Ð°ÑÐ°ÐµÑ ÑвÑÐ·Ñ Ð¼ÐµÐ¶Ð´Ñ Ð¾Ð±ÑекÑами.
ÐгÑегаÑÐ¸Ñ â «ÑаÑÑÑ» Ð¼Ð¾Ð¶ÐµÑ ÑÑÑеÑÑвоваÑÑ Ð¾ÑделÑно и пÑинадлежаÑÑ Ð½ÐµÑколÑким «ÑелÑм». (Ðнига наÑ
одиÑÑÑ Ð² библиоÑеке, ÐµÑ Ð¼Ð¾Ð¶Ð½Ð¾ пеÑенеÑÑи в дÑÑгÑÑ).
ÐомпозиÑÐ¸Ñ â «ÑаÑÑÑ» жÑÑÑко пÑивÑзана к «ÑеломÑ». (СÑÑаниÑа пÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð¸Ñ ÐºÐ¾Ð½ÐºÑеÑной книге).
[к оглавлениÑ](#ÐÐÐ)
## ЧÑо Ñакое _ÑÑаÑиÑеÑкое_ и _динамиÑеÑкое ÑвÑзÑвание_?
СвÑзÑвание ознаÑÐ°ÐµÑ Ð½Ð°Ð»Ð¸Ñие ÑвÑзи Ð¼ÐµÐ¶Ð´Ñ ÑÑÑлкой и кодом. ÐапÑимеÑ, пеÑеменнаÑ, на коÑоÑÑÑ Ð²Ñ ÑÑÑлаеÑеÑÑ, пÑивÑзана к кодÑ, в коÑоÑом она опÑеделена. ÐналогиÑно, вÑзÑваемÑй меÑод пÑивÑзан к меÑÑÑ Ð² коде, где он опÑеделен.
_СÑаÑиÑеÑким_ или _Ñанним ÑвÑзÑванием (early binding)_ â компилÑÑÐ¾Ñ Ð·Ð°Ñанее знаеÑ, какой меÑод бÑÐ´ÐµÑ Ð²Ñзван. (ÐапÑ. пеÑегÑÑзка меÑодов).
_Ðозднее ÑвÑзÑвание (late binding) или динамиÑеÑкое_ пÑоводимое непоÑÑедÑÑвенно во вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿ÑогÑаммÑ, в завиÑимоÑÑи Ð¾Ñ Ñипа обÑекÑа (ÐапÑ. пеÑеопÑеделение меÑодов в наÑледникаÑ
). ÐеÑ
анизм позднего ÑвÑзÑÐ²Ð°Ð½Ð¸Ñ Ð·Ð°Ð²Ð¸ÑÐ¸Ñ Ð¾Ñ ÐºÐ¾Ð½ÐºÑеÑного ÑзÑка
ÐÑак, ÑÑндаменÑалÑное ÑазлиÑие Ð¼ÐµÐ¶Ð´Ñ ÑÑаÑиÑеÑким и динамиÑеÑким ÑвÑзÑванием в Java ÑоÑÑÐ¾Ð¸Ñ Ð² Ñом, ÑÑо пеÑвое пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ñано, во вÑÐµÐ¼Ñ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑÑии на оÑнове Ñипа ÑÑÑлоÑной пеÑеменной, а вÑоÑое â позднее, во вÑÐµÐ¼Ñ Ð²ÑполнениÑ, Ñ Ð¸ÑполÑзованием конкÑеÑнÑÑ
обÑекÑов.
Ð Java поÑÑи вÑе меÑÐ¾Ð´Ñ â динамиÑеÑкие, кÑоме `static`, `final` и `private`.
ÐлÑÑевÑе ÑазлиÑÐ¸Ñ Ð¼ÐµÐ¶Ð´Ñ Ñанним и поздним ÑвÑзÑванием в ÑзÑке Java:
1) СÑаÑиÑеÑкое ÑвÑзÑвание иÑполÑзÑеÑÑÑ Ð² ÑзÑке Java Ð´Ð»Ñ ÑазÑеÑÐµÐ½Ð¸Ñ Ð¿ÐµÑегÑÑженнÑÑ
меÑодов, в Ñо вÑÐµÐ¼Ñ ÐºÐ°Ðº динамиÑеÑкое ÑвÑзÑвание иÑполÑзÑеÑÑÑ Ð² ÑзÑке Java Ð´Ð»Ñ ÑазÑеÑÐµÐ½Ð¸Ñ Ð¿ÐµÑеопÑеделеннÑÑ
меÑодов.
2) ÐналогиÑно, пÑиваÑнÑе, ÑÑаÑиÑеÑкие и ÑеÑминалÑнÑе меÑÐ¾Ð´Ñ ÑазÑеÑаÑÑÑÑ Ð¿Ñи помоÑи ÑÑаÑиÑеÑкого ÑвÑзÑваниÑ, поÑколÑÐºÑ Ð¸Ñ
нелÑÐ·Ñ Ð¿ÐµÑеопÑеделÑÑÑ, а вÑе виÑÑÑалÑнÑе меÑÐ¾Ð´Ñ ÑазÑеÑаÑÑÑÑ Ð¿Ñи помоÑи динамиÑеÑкого ÑвÑзÑваниÑ.
3) Ð ÑлÑÑае ÑÑаÑиÑеÑкого ÑвÑзÑÐ²Ð°Ð½Ð¸Ñ Ð¸ÑполÑзÑÑÑÑÑ Ð½Ðµ конкÑеÑнÑе обÑекÑÑ, а инÑоÑмаÑÐ¸Ñ Ð¾ Ñипе, Ñо еÑÑÑ Ð´Ð»Ñ Ð¾Ð±Ð½Ð°ÑÑÐ¶ÐµÐ½Ð¸Ñ Ð½Ñжного меÑода иÑполÑзÑеÑÑÑ Ñип ÑÑÑлоÑной пеÑеменной. С дÑÑгой ÑÑоÑонÑ, пÑи динамиÑеÑком ÑвÑзÑвании Ð´Ð»Ñ Ð½Ð°Ñ
Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð½Ñжного меÑода в Java иÑполÑзÑеÑÑÑ ÐºÐ¾Ð½ÐºÑеÑнÑй обÑекÑ.
[к оглавлениÑ](#ÐÐÐ)
## ÐÑинÑип SOLID?
ÐÑÑÑ Ð¾ÑновнÑÑ
пÑинÑипов дизайна клаÑÑов:
+ Single Responsibility Principle (ÐÑинÑип единÑÑвенной оÑвеÑÑÑвенноÑÑи).
+ Open Closed Principle (ÐÑинÑип оÑкÑÑÑоÑÑи/закÑÑÑоÑÑи).
+ Liskovâs Substitution Principle (ÐÑинÑип подÑÑановки ÐаÑбаÑÑ ÐиÑков).
+ Interface Segregation Principle (ÐÑинÑип ÑÐ°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¸Ð½ÑеÑÑейÑа).
+ Dependency Inversion Principle (ÐÑинÑип инвеÑÑии завиÑимоÑÑей).
__ÐÑинÑип единÑÑвенной оÑвеÑÑÑвенноÑÑи (SRP)__
Ðикогда не должно бÑÑÑ Ð±Ð¾Ð»ÑÑе одной пÑиÑÐ¸Ð½Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ ÐºÐ»Ð°ÑÑ.
ÐлаÑÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ бÑÑÑ Ð¾ÑвеÑÑÑвенен лиÑÑ Ð·Ð° ÑÑо-Ñо одно. ÐÑли клаÑÑ Ð¾ÑвеÑÐ°ÐµÑ Ð·Ð° ÑеÑение неÑколÑкиÑ
задаÑ, его подÑиÑÑемÑ, ÑеализÑÑÑие ÑеÑение ÑÑиÑ
задаÑ, оказÑваÑÑÑÑ ÑвÑзаннÑми дÑÑг Ñ Ð´ÑÑгом. ÐÐ·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² одной Ñакой подÑиÑÑеме ведÑÑ Ðº изменениÑм в дÑÑгой.
ÐÑедÑÑавÑÑе Ñебе модÑлÑ, коÑоÑÑй обÑабаÑÑÐ²Ð°ÐµÑ Ð·Ð°ÐºÐ°Ð·Ñ. ÐÑли заказ веÑно ÑÑоÑмиÑован, он ÑоÑ
ÑанÑÐµÑ ÐµÐ³Ð¾ в Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
и вÑÑÑÐ»Ð°ÐµÑ Ð¿Ð¸ÑÑмо Ð´Ð»Ñ Ð¿Ð¾Ð´ÑвеÑÐ¶Ð´ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ°Ð·Ð°. ÐÑинÑип единÑÑвенной обÑзанноÑÑи подÑазÑмеваеÑ, ÑÑо ÑÑи аÑпекÑа ÑÑой пÑÐ¾Ð±Ð»ÐµÐ¼Ñ Ð½Ð° Ñамом деле â ÑÑи ÑазнÑе обÑзанноÑÑи. РзнаÑиÑ, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð½Ð°Ñ
одиÑÑÑÑ Ð² ÑазнÑÑ
клаÑÑаÑ
или модÑлÑÑ
. ÐбÑединение неÑколÑкиÑ
ÑÑÑноÑÑей, коÑоÑÑе могÑÑ Ð¼ÐµÐ½ÑÑÑÑÑ Ð² Ñазное вÑÐµÐ¼Ñ Ð¸ по ÑазнÑм пÑиÑинам, ÑÑиÑаеÑÑÑ Ð¿Ð»Ð¾Ñ
им пÑоекÑнÑм ÑеÑением. ÐоÑаздо лÑÑÑе ÑазделиÑÑ Ð¼Ð¾Ð´ÑÐ»Ñ Ð½Ð° ÑÑи оÑделÑнÑÑ
, каждÑй из коÑоÑÑÑ
бÑÐ´ÐµÑ Ð²ÑполнÑÑÑ Ð¾Ð´Ð½Ñ ÐµÐ´Ð¸Ð½ÑÑвеннÑÑ ÑÑнкÑиÑ.
__ÐÑинÑип оÑкÑÑÑоÑÑи/закÑÑÑоÑÑи (OCP)__
ÐÑогÑаммнÑе ÑÑÑноÑÑи (клаÑÑÑ, модÑли, ÑÑнкÑии и Ñ.п.) Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¾ÑкÑÑÑÑ Ð´Ð»Ñ ÑаÑÑиÑениÑ, но закÑÑÑÑ Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ.
ÐÑо ознаÑаеÑ, ÑÑо должна бÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑ Ð²Ð½ÐµÑнее поведение клаÑÑа, не вноÑÑ ÑизиÑеÑкие Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² Ñам клаÑÑ. СледÑÑ ÑÑÐ¾Ð¼Ñ Ð¿ÑинÑипÑ, клаÑÑÑ ÑазÑабаÑÑваÑÑÑÑ Ñак, ÑÑÐ¾Ð±Ñ Ð´Ð»Ñ Ð¿Ð¾Ð´ÑÑÑойки клаÑÑа к конкÑеÑнÑм ÑÑловиÑм пÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±Ñло доÑÑаÑоÑно ÑаÑÑиÑиÑÑ ÐµÐ³Ð¾ и пеÑеопÑеделиÑÑ Ð½ÐµÐºÐ¾ÑоÑÑе ÑÑнкÑии. ÐоÑÑÐ¾Ð¼Ñ ÑиÑÑема должна бÑÑÑ Ð³Ð¸Ð±ÐºÐ¾Ð¹, Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑÑ ÑабоÑÑ Ð² пеÑеменнÑÑ
ÑÑловиÑÑ
без Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸ÑÑ
одного кода. ÐÑполÑзÑÑÑÑÑ Ð¸Ð½ÑеÑÑейÑÑ
__ÐÑинÑип подÑÑановки ÐаÑбаÑÑ ÐиÑков (LSP)__
ÐбÑекÑÑ Ð² пÑогÑамме можно замениÑÑ Ð¸Ñ
наÑледниками без Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑвойÑÑв пÑогÑаммÑ.
ÐÑо ознаÑаеÑ, ÑÑо клаÑÑ, ÑазÑабоÑаннÑй пÑÑем ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð½Ð° оÑновании базового клаÑÑа, должен пеÑеопÑеделÑÑÑ ÐµÐ³Ð¾ меÑÐ¾Ð´Ñ Ñак, ÑÑÐ¾Ð±Ñ Ð½Ðµ наÑÑÑалаÑÑ ÑÑнкÑионалÑноÑÑÑ Ñ ÑоÑки зÑÐµÐ½Ð¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñа. То еÑÑÑ, еÑли ÑазÑабоÑÑик ÑаÑÑиÑÑÐµÑ Ð²Ð°Ñ ÐºÐ»Ð°ÑÑ Ð¸ иÑполÑзÑÐµÑ ÐµÐ³Ð¾ в пÑиложении, он не должен изменÑÑÑ Ð¾Ð¶Ð¸Ð´Ð°ÐµÐ¼Ð¾Ðµ поведение пеÑеопÑеделеннÑÑ
меÑодов. ÐÑли оказÑваеÑÑÑ, ÑÑо в коде пÑовеÑÑеÑÑÑ Ñип клаÑÑа, знаÑÐ¸Ñ Ð¿ÑинÑип подÑÑановки наÑÑÑаеÑÑÑ.
__ÐÑинÑип ÑÐ°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¸Ð½ÑеÑÑейÑа (ISP)__
ÐлиенÑÑ Ð½Ðµ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð²ÑнÑÐ¶Ð´ÐµÐ½Ñ ÑеализовÑваÑÑ Ð¼ÐµÑодÑ, коÑоÑÑе они не бÑдÑÑ Ð¸ÑполÑзоваÑÑ.
ÐÑинÑип ÑÐ°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¸Ð½ÑеÑÑейÑов говоÑÐ¸Ñ Ð¾ Ñом, ÑÑо ÑлиÑком «ÑолÑÑÑе» инÑеÑÑейÑÑ Ð½ÐµÐ¾Ð±Ñ
одимо ÑазделÑÑÑ Ð½Ð° более мелкие и ÑпеÑиÑиÑеÑкие, ÑÑÐ¾Ð±Ñ ÐºÐ»Ð¸ÐµÐ½ÑÑ Ð¼ÐµÐ»ÐºÐ¸Ñ
инÑеÑÑейÑов знали ÑолÑко о меÑодаÑ
, необÑ
одимÑÑ
в ÑабоÑе.
РаÑÑмоÑÑим пÑимеÑ. РазÑабоÑÑик ÐÐ»ÐµÐºÑ Ñоздал инÑеÑÑÐµÐ¹Ñ "оÑÑеÑ" и добавил два меÑода: generateExcel() и generatedPdf(). ТепеÑÑ ÐºÐ»Ð¸ÐµÐ½Ñ Ð Ñ
оÑÐµÑ Ð¸ÑполÑзоваÑÑ ÑÑÐ¾Ñ Ð¸Ð½ÑеÑÑейÑ, но он намеÑен иÑполÑзоваÑÑ Ð¾ÑÑеÑÑ ÑолÑко в PDF-ÑоÑмаÑе, а не в Excel. Ðн должен бÑÐ´ÐµÑ ÑеализоваÑÑ Ð´Ð²Ð° меÑода, один из коÑоÑÑÑ
по болÑÑÐ¾Ð¼Ñ ÑÑеÑÑ Ð½Ðµ нÑжен и ÑÑÑеÑÑвÑÐµÑ ÑолÑко благодаÑÑ ÐлекÑÑ â дизайнеÑÑ Ð¿ÑогÑаммного обеÑпеÑениÑ. ÐÐ»Ð¸ÐµÐ½Ñ Ð²Ð¾ÑполÑзÑеÑÑÑ Ð»Ð¸Ð±Ð¾ дÑÑгим инÑеÑÑейÑом, либо оÑÑÐ°Ð²Ð¸Ñ Ð¿Ð¾Ð»Ðµ Ð´Ð»Ñ Excel пÑÑÑÑм. Так в Ñем же ÑеÑение? Ðно ÑоÑÑÐ¾Ð¸Ñ Ð² Ñазделении ÑÑÑеÑÑвÑÑÑего инÑеÑÑейÑа на два более мелкиÑ
. Ðдин â оÑÑÐµÑ Ð² ÑоÑмаÑе PDF, вÑоÑой â оÑÑÐµÑ Ð² ÑоÑмаÑе Excel. ÐÑо даÑÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¸ÑполÑзоваÑÑ ÑолÑко необÑ
одимÑй Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ ÑÑнкÑионал.
__ÐÑинÑип инвеÑÑии завиÑимоÑÑей (DIP)__
ÐавиÑимоÑÑи внÑÑÑи ÑиÑÑÐµÐ¼Ñ ÑÑÑоÑÑÑÑ Ð½Ð° оÑнове абÑÑÑакÑий. ÐбÑекÑом завиÑимоÑÑи должна бÑÑÑ Ð°Ð±ÑÑÑакÑиÑ, а не ÑÑо-Ñо конкÑеÑное. ÐодÑли веÑÑ
него ÑÑÐ¾Ð²Ð½Ñ Ð½Ðµ завиÑÑÑ Ð¾Ñ Ð¼Ð¾Ð´Ñлей нижнего ÑÑовнÑ. ÐбÑÑÑакÑии не Ð´Ð¾Ð»Ð¶Ð½Ñ Ð·Ð°Ð²Ð¸ÑеÑÑ Ð¾Ñ Ð´ÐµÑалей. ÐеÑали Ð´Ð¾Ð»Ð¶Ð½Ñ Ð·Ð°Ð²Ð¸ÑеÑÑ Ð¾Ñ Ð°Ð±ÑÑÑакÑий. ÐÑогÑаммное обеÑпеÑение нÑжно ÑазÑабаÑÑваÑÑ Ñак, ÑÑÐ¾Ð±Ñ ÑазлиÑнÑе модÑли бÑли авÑономнÑми и ÑоединÑлиÑÑ Ð´ÑÑг Ñ Ð´ÑÑгом Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð°Ð±ÑÑÑакÑии.
ÐлаÑÑиÑеÑкое пÑименение ÑÑого пÑинÑипа â Spring framework. Ð ÑамкаÑ
Spring framework вÑе модÑли вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ñ Ð² виде оÑделÑнÑÑ
компоненÑов, коÑоÑÑе могÑÑ ÑабоÑаÑÑ Ð²Ð¼ÐµÑÑе. Ðни наÑÑолÑко авÑономнÑ, ÑÑо могÑÑ Ð±ÑÑÑ Ð±ÑÑÑ Ñ Ñакой же легкоÑÑÑÑ Ð·Ð°Ð´ÐµÐ¹ÑÑÐ²Ð¾Ð²Ð°Ð½Ñ Ð² дÑÑгиÑ
пÑогÑаммнÑÑ
модÑлÑÑ
помимо Spring framework. ÐÑо доÑÑигнÑÑо за ÑÑÐµÑ Ð·Ð°Ð²Ð¸ÑимоÑÑи закÑÑÑÑÑ
и оÑкÑÑÑÑÑ
пÑинÑипов. ÐÑе модÑли пÑедоÑÑавлÑÑÑ Ð´Ð¾ÑÑÑп ÑолÑко к абÑÑÑакÑии, коÑоÑÐ°Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð² дÑÑгом модÑле.
[к оглавлениÑ](#ÐÐÐ)
## ЧÑо Ñакое ÐонолиÑ, ÐикÑоÑеÑвиÑ?
ÐонолиÑÐ½Ð°Ñ Ð°ÑÑ
иÑекÑÑÑа - ÑиÑÑема Ñ Ð¾Ð´Ð½Ð¸Ð¼ ÑеÑвиÑом, коÑоÑÑй оÑвеÑÐ°ÐµÑ Ð·Ð° ÑабоÑÑ Ñо вÑей пÑедмеÑной облаÑÑÑÑ Ð±Ð¸Ð·Ð½ÐµÑа (пÑиложениÑ)
ÐÑи наÑале ÑабоÑÑ Ð½Ð°Ð´ монолиÑнÑм пÑоекÑом ÐоÑÑоинÑÑва:
â
ÐÑÑÑÑÐ°Ñ ÑазÑабоÑка
â
ÐозможноÑÑÑ Ð²Ð½ÐµÑÐµÐ½Ð¸Ñ ÑадикалÑнÑÑ
изменений (напÑÐ¸Ð¼ÐµÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ Ð°ÑÑ
иÑеÑÑÑÑ, клаÑÑ-дизайн, ÑÑ
ÐµÐ¼Ñ Ð±Ð´)
â
Ðезболезненое ÑеÑÑиÑование
â
Ðегкое ÑазвеÑÑÑвание
â
ÐÑоÑÑое hardware маÑÑÑабиÑование
С ÑвелиÑением ÑазмеÑа пÑоекÑа и ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ÑазÑабоÑки поÑвлÑÑÑÑÑ ÐинÑÑÑ:
â Ðедленное внеÑение изменений
ÐÐ¾Ð¼Ð°Ð½Ð´Ñ Ð Ð¸ Ð ÑабоÑаÑÑ Ð½Ðµ пеÑеÑекаÑÑÑ. ÐÑкаÑÑваеÑÑÑ Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑÑÐ¸Ñ Ð¿ÑоекÑа Ñ Ð±Ð°Ð³Ð°Ð¼Ð¸ в коде ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð. ÐÑкаÑÑваеÑÑÑ Ð½Ð° пÑедÑдÑÑÑÑÑ Ð²ÐµÑÑÐ¸Ñ Ð²ÐµÑÑ ÐºÐ¾Ð´ и ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð Ð¸ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð.
â УÑÐ·Ð²Ð¸Ð¼Ð°Ñ Ð½Ð°Ð´ÐµÐ¶Ð½Ð¾ÑÑÑ - еÑли Ð¿Ð°Ð´Ð°ÐµÑ ÑаÑÑÑ ÐºÐ¾Ð´Ð°, Ñо не ÑабоÑÐ°ÐµÑ Ð²Ñе пÑиложение.
â ТÑÑдноÑÑи в hardware маÑÑÑабиÑовании.
Ðдна ÑаÑÑÑ ÑÑебÑÐµÑ Ð¾Ð¿ÐµÑаÑивÑ, дÑÑÐ³Ð°Ñ ÑдÑа. ÐÑиÑ
одиÑÑÑ Ð°Ð¿Ð³ÑейдиÑÑ "веÑÑикалÑно" - покÑпаÑÑ Ð±Ð¾Ð»ÑÑе опеÑаÑивнÑÑ
планок и пÑоÑеÑÑоÑÑ Ñ Ð±Ð¾Ð»ÑÑим кол-вом ÑÐ´ÐµÑ Ð´Ð»Ñ Ð²ÑеÑ
ÑеÑвиÑов. Рне по поÑÑебноÑÑÑм
â ÐоÑоговизна Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑеÑ
нологиÑеÑкого ÑÑека. ÐапÑÐ¸Ð¼ÐµÑ Ð¿ÐµÑеÑ
од на новÑÑ Ð²ÐµÑÑÐ¸Ñ Java. ЧÑÐ¾Ð±Ñ Ð¿ÑовеÑиÑÑ ÑÑÑекÑивноÑÑÑ, нÑжно пеÑепиÑÑваÑÑ Ð²ÐµÑÑ Ð¿ÑоекÑ
ÐикÑоÑеÑвиÑÐ½Ð°Ñ Ð°ÑÑ
иÑекÑÑÑа â ÑиÑÑема, коÑоÑÐ°Ñ ÑодеÑÐ¶Ð¸Ñ Ð±Ð¾Ð»ÑÑе одного обоÑобленнго ÑеÑвиÑа. Ð Ð°Ð·Ð¼ÐµÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð½Ðµ имееÑ.
ÐбоÑобленнÑй ÑеÑÐ²Ð¸Ñ â ÑвлÑеÑÑÑ Ð½ÐµÐ·Ð°Ð²Ð¸Ñимой единиÑей ÑазвеÑÑÑваниÑ, Ð¸Ð¼ÐµÐµÑ ÑÐ²Ð¾Ñ Ñ
ÑанилиÑе, ÑÐ²Ð¾Ñ ÐÐ (?), оÑвеÑÐ°ÐµÑ Ð·Ð° ÑÐ²Ð¾Ñ ÑаÑÑÑ Ð¿ÑедмеÑной облаÑÑи
ÐоÑÑоинÑÑва:
â
ÐозможноÑÑÑ Ð¼Ð°ÑÑÑабиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑазÑабоÑки
â
ÐеÑевизна ÑкÑпеÑеменÑов Ñ Ð½Ð¾Ð²Ñм ÑÑеком
â
ÐнкÑеменÑалÑное обновление ÑеÑ
нолоÑиÑеÑкого ÑÑека
â
ÐовÑÑÐµÐ½Ð½Ð°Ñ Ð½Ð°Ð´ÐµÐ¶Ð½Ð¾ÑÑÑ Ð¸ оÑказоÑÑÑойÑивоÑÑÑ
ÐинÑÑÑ:
â СложноÑÑÑ Ð¿ÑоекÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð°ÑÑ
иÑекÑÑÑÑ
â Ðолгое внеÑение ÑадикалÑнÑÑ
изменений
â ÐеÑÑивиалÑное ÑеÑÑиÑование
â ÐовÑÑеннÑе ÑÑÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ñ Ðº Continuous Integration/Continuous Delivery (деплоÑ)
СложноÑÑи пÑоекÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÐикÑоÑеÑвиÑов
+ Сложно ÑазделиÑÑ Ð¿ÑедмеÑнÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð½Ð° ÑаÑÑи
Ðе ÑÑÐ¾Ð¸Ñ Ð´ÐµÐ»Ð¸ÑÑ Ð¼Ð¾Ð½Ð¾Ð»Ð¸Ñ Ð½Ð° микÑоÑеÑвиÑÑ Ð¿Ð¾ ÑÑнкÑионалÑнÑм возможноÑÑÑм. ÐÑо пÑÐ¸Ð²ÐµÐ´ÐµÑ Ðº ÑаÑпÑÐµÐ´ÐµÐ»ÐµÐ½Ð½Ð¾Ð¼Ñ Ð¼Ð¾Ð½Ð¾Ð»Ð¸ÑÑ - аÑÑ
иÑекÑÑÑа, вклÑÑаÑÑÐ°Ñ Ð½ÐµÐ´Ð¾ÑÑаÑки и Ñого и дÑÑгого. ÐÐ¾Ð½Ð¾Ð»Ð¸Ñ Ð½Ñжно ÑазбиваÑÑ Ð¿Ð¾ пÑенадлежноÑÑи к какой-Ñо облаÑÑи бизнеÑа. ÐÑлиÑиÑÑ Ð¾Ð´Ð½Ð¾ Ð¾Ñ Ð´ÑÑгого доволÑно Ñложно. Т.е. по пÑинÑÐ¸Ð¿Ñ ÐµÐ´Ð¸Ð½Ð¾Ð¹ оÑвеÑÑÑвенноÑÑи.
СооÑвеÑÑÑвие пÑинÑипам Low coupling, high cohesion ÑпоÑобÑÑвÑÐµÑ Ð±ÑÑÑÑÐ¾Ð¼Ñ Ð²Ð½ÐµÑÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ и Ð»ÐµÐ³ÐºÐ¾Ð¼Ñ ÑеÑÑиÑованиÑ.
СилÑÐ½Ð°Ñ ÑвÑзанноÑÑÑ high cohesion - ÑаÑÑи ÑиÑÑемÑ, коÑоÑÑе изменÑÑÑÑÑ Ð²Ð¼ÐµÑÑе, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð½Ð°Ñ
одиÑÑÑÑ Ð±Ð»Ð¸Ð¶Ðµ дÑÑг к дÑÑгÑ
Ð¡Ð»Ð°Ð±Ð°Ñ ÑвÑзанноÑÑÑ low coupling - ÑаÑÑи ÑиÑÑемÑ, коÑоÑÑе изменÑÑÑÑÑ Ð¿Ð°ÑаллелÑно, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸Ð¼ÐµÑÑ ÐºÐ°Ðº можно менÑÑе завиÑимоÑÑей дÑÑг на дÑÑга b внÑÑÑи ÑеÑвиÑа и Ð¼ÐµÐ¶Ð´Ñ ÑеÑвиÑами

+ ÐадеÑжки пÑи межÑеÑвиÑном взаимодейÑÑвии влиÑÑÑ Ð½Ð° пÑоизводиÑелÑноÑÑÑ + ÑеÑÑ Ð½ÐµÐ½Ð°Ð´ÐµÐ¶Ð½Ð°
+ ÐежÑеÑвиÑное взаимодейÑÑвие влиÑÐµÑ Ð½Ð° доÑÑÑпноÑÑÑ
+ Сложно добиÑÑÑÑ ÑоглаÑованноÑÑи даннÑÑ
[к оглавлениÑ](#ÐÐÐ)
## ЧÑо Ñакое Continuous Integration, Continuous Delivery/Deployment?
ÐепÑеÑÑÐ²Ð½Ð°Ñ Ð¸Ð½ÑегÑаÑÐ¸Ñ (CI) â пÑоÑеÑÑ Ð°Ð²ÑомаÑиÑеÑкого пÑинÑÑÐ¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹. ÐеÑвиÑнÑй пÑоÑеÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÐÐ, в ÑамкаÑ
коÑоÑого вÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ð° ÑÑовне кода вноÑÑÑÑÑ Ð² единÑй ÑенÑÑалÑнÑй ÑепозиÑоÑий. Такое внеÑение пÑинÑÑо назÑваÑÑ ÑлиÑнием. ÐоÑле каждого ÑлиÑÐ½Ð¸Ñ (коÑоÑое пÑоÑ
Ð¾Ð´Ð¸Ñ Ð¿Ð¾ неÑколÑко Ñаз в денÑ) в изменÑемой ÑиÑÑеме пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð°Ð²ÑомаÑиÑеÑÐºÐ°Ñ ÑбоÑка (ÑаÑÑо пÑиложение ÑпаковÑваеÑÑÑ Ð² Docker) и ÑеÑÑиÑование (пÑовеÑка конкÑеÑнÑÑ
модÑлей кода, UI, пÑоизводиÑелÑноÑÑи, надÑжноÑÑи API). Таким обÑазом ÑазÑабоÑÑики ÑÑÑаÑ
ÑÑÑÑÑ Ð¾Ñ ÑлиÑком поздниÑ
обнаÑÑжений пÑоблем в обновлениÑÑ
.
+ ÐозможноÑÑÑ Ð»Ð¾ÐºÐ°Ð»Ñной ÑбоÑки пÑоекÑа
+ Ðа каждÑй ÐºÐ¾Ð¼Ð¼Ð¸Ñ Ð² кдаленнÑй Ñепо запÑÑкаем ÑбоÑки пÑоекÑа в ÑиÑÑеме (Jenkins, TravisCI)
+ Ð¡Ð»Ð¾Ð¼Ð°Ð½Ð½Ð°Ñ ÑбоÑка запÑеÑÐ°ÐµÑ ÑлиÑние
ÐепÑеÑÑÐ²Ð½Ð°Ñ Ð´Ð¾ÑÑавка (CD) â CI + CD. ÐвÑомаÑизиÑованÑй пÑоÑеÑÑ Ð´Ð¾ÑÑавки изменений до пÑодакÑена. ТепеÑÑ Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑÑÐ¸Ñ Ð½Ðµ ÑолÑко ÑоздаÑÑÑÑ Ð¸ ÑеÑÑиÑÑеÑÑÑ Ð¿Ñи каждом изменении кода, ÑегиÑÑÑиÑÑемом в ÑепозиÑоÑии, но и Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾Ð¿ÐµÑаÑивно запÑÑена по Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð½Ð°Ð¶Ð°ÑÐ¸Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸ ÑазвÑÑÑÑваниÑ. Ðднако запÑÑк ÑазвÑÑÑÑÐ²Ð°Ð½Ð¸Ñ Ð²ÑÑ ÐµÑÑ Ð¿ÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð²ÑÑÑнÑÑ â ÑÑ ÑамÑÑ ÐºÐ½Ð¾Ð¿ÐºÑ Ð²ÑÑ Ð¶Ðµ надо комÑ-Ñо нажаÑÑ. ÐÑÐ¾Ñ Ð¼ÐµÑод позволÑÐµÑ Ð²ÑпÑÑкаÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½ÐµÐ±Ð¾Ð»ÑÑими паÑÑиÑми, коÑоÑÑе легко измениÑÑ Ð¸Ð»Ð¸ ÑÑÑÑаниÑÑ Ð² ÑлÑÑае необÑ
одимоÑÑи.
+ ÐоддеÑживаем аÑÑеÑакÑÑ ÑÑабилÑнÑми
+ РазвеÑÑÑваем по кнопке
[к оглавлениÑ](#ÐÐÐ)
## ЧÑо вÑбÑаÑÑ ÐÐ¾Ð½Ð¾Ð»Ð¸Ñ Ð¸Ð»Ð¸ ÐикÑоÑеÑвиÑ?
ÐикÑо еÑли:
+ ÐÑедмеÑÐ½Ð°Ñ Ð¾Ð±Ð»Ð°ÑÑÑ Ñ
оÑоÑо делиÑÑÑ Ð½Ð° ÑаÑÑи
+ Ðного напÑавлений, коÑоÑÑе нÑжно ÑазвиваÑÑ Ð¿Ð°ÑаллелÑно
+ "ÐÑобенноÑÑи" монолиÑа не ÑÑÑÑаиваÑÑ Ð±Ð¸Ð·Ð½ÐµÑ
ÐÐ¾Ð½Ð¾Ð»Ð¸Ñ ÐµÑли:
+ ÐÑжно бÑÑÑÑо ÑделаÑÑ Ð¿ÑоÑоÑип
+ ÐаÑÑ Ð·Ð°Ð´Ð°ÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑеÑиÑÑ Ð¾Ð´Ð½Ð¸Ð¼ ÑеÑвиÑом
+ ÐепонÑÑно, как ÑазделиÑÑ Ð¿ÑедмеÑнÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ
+ Ðизкие нагÑÑзки, мало ÑазÑабоÑÑиков, Ð½ÐµÑ ÑеÑÑÑÑов на поддеÑжание микÑоÑеÑвиÑов
https://microservices.io/
https://martinfowler.com/
"microservices patterns" chris richardson
"clean architecture" robert martin
[к оглавлениÑ](#ÐÐÐ)
## ÐзаимодейÑÑвие Ð¼ÐµÐ¶Ð´Ñ Ð¼Ð¸ÐºÑоÑеÑвиÑами
ÐежÑеÑвиÑное взаимодейÑÑвие = ÑеÑевое взаимодейÑÑвие, Ñ.е. ÑиÑÑема ÑпÑавлÑеÑÑÑ ÑообÑениÑми
+ ÐÑоизводиÑелÑноÑÑÑ = задеÑжки и пÑопÑÑÐºÐ½Ð°Ñ ÑпоÑобноÑÑÑ
+ ÐоÑÑÑпноÑÑÑ Ð¸ оÑказоÑÑÑойÑивоÑÑÑ
+ ÐÑÑ
иÑекÑÑÑа
__ТÑанÑпоÑÑ__
+ ÑÑандаÑÑ JSON внÑÑÑи HTTP (REST, RPC, GraphQL). ÐÑоÑÑой, множеÑÑво инÑÑÑÑменÑов, ÑеловекоÑиÑаемоÑÑÑ. Ðз-за ÑекÑÑового ÑоÑмаÑа болÑÑие обÑÐµÐ¼Ñ Ð¸ нÑжно опÑимизиÑоваÑÑ
+ бинаÑнÑе пÑоÑоколÑ: gRPC, Thrift, Avro и Ñ.д.
ÐÑÑе пÑоизводиÑелÑноÑÑÑ, опÑимизиÑованно пÑедÑÑавление даннÑÑ
, можно опÑеделиÑÑ ÑÑ
ÐµÐ¼Ñ ÑообÑÐµÐ½Ð¸Ñ Ð¸Ð· коÑобки, но менÑÑе инÑÑÑÑменÑов и не ÑиÑÐ°ÐµÐ¼Ñ Ñеловеком
ЧÑо вÑбÑаÑÑ?
+ ÐаÑинаÑÑ Ñ HTTP
+ ÐинаÑнÑе не беÑплаÑнÑе
+ ÐолÑÑинÑÑво пÑоблем не из-за пÑоÑокола!
+ ÐÐ»Ñ Ð¿ÑблиÑнÑÑ
API вÑегда HTTP либо неÑколÑко ÑеализаÑий одна из коÑоÑÑÑ
HTTP
__API__
Application Programming Interface - инÑеÑÑейÑ, опÑеделÑÑÑий ÑпоÑоб и ÑÑ
ÐµÐ¼Ñ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð´ÐµÐ¹ÑÑÐ²Ð¸Ñ Ñ ÑеÑвиÑом
+ Remote Procedure Call (RPC)
ТолÑко POST меÑод. ÐÑе паÑамеÑÑÑ Ð² Ñеле запÑоÑа. ÐÑбой ÑÑаÑÑÑ !=200, ÑÑиÑаеÑÑÑ Ð¾Ñибкой
ÐÑбиÑаÑÑ: ÐÑоÑÑÐ°Ñ ÑеализаÑиÑ, ÐнÑÑÑенние API, HTTP ÑолÑко как ÑÑанÑпоÑÑ
+ Representational State Transfer (REST)
ÐÑÑ
иÑекÑÑÑнÑй ÑÑилÑ, в оÑнове коÑоÑого Ð»ÐµÐ¶Ð°Ñ ÑеÑÑÑÑÑ Ð¸ иÑ
иденÑиÑикаÑиÑ, изменение иÑ
ÑоÑÑоÑÐ½Ð¸Ñ ÑеÑез пÑедÑÑавление. REST != HTTP
ÐÑбиÑаÑÑ: Своего Ñода ÑÑандаÑÑ, ÐнÑÑÑенние API, ÐÑблиÑнÑе API, HTTP как пÑоÑокол
+ GraphQL
ЯзÑк запÑоÑов Ð´Ð»Ñ API. ÐапÑÐ¸Ð¼ÐµÑ Ð¼Ð¾Ð¶Ð½Ð¾ задаÑÑ ÐºÐ¾Ð½ÐºÑеÑнÑй Ð½Ð°Ð±Ð¾Ñ Ð¿Ð¾Ð»ÐµÐ¹, коÑоÑÑе Ñ
оÑим полÑÑиÑÑ Ð² оÑвеÑе на запÑоÑ
ÐÑбиÑаÑÑ: Типо-безопаÑноÑÑÑ, API Ð´Ð»Ñ Web и мобилÑнÑÑ
клиенÑов, ÑÑÑ Ñвой инÑÑÑÑменÑаÑий
__ÐÑоекÑиÑвоание__
+ ÐлиенÑ-ÑеÑвеÑ
+ Stateless - ÑеÑÐ²Ð¸Ñ Ð½Ðµ должен Ñ
ÑаниÑÑ ÑоÑÑоÑние в памÑÑи, ÑÑо важно Ð´Ð»Ñ Ð¼Ð°ÑÑÑабиÑованиÑ
+ ÐеÑиÑование
__Ð¢Ð¸Ð¿Ñ ÑообÑений__
+ ÐомандÑ
+
ÐмпеÑаÑивное ÑпÑавление (звÑÑÐ¸Ñ ÐºÐ°Ðº "ÑделаÑÑ ÑÑо-Ñо"), вÑзÑваÑÑ ÑилÑнÑÑ ÑвÑзанноÑÑÑ, заÑо понÑÑÐ½Ñ - Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ð¾Ð±ÑÑно оÑÑажаÑÑ Ð»Ð¾Ð³Ð¸ÐºÑ

+ СобÑÑиÑ
+
ÐеклаÑаÑивное ÑпÑавление (звÑÑÐ¸Ñ ÐºÐ°Ðº "ÑÑо-Ñо пÑоизоÑло"), ÑнижаÑÑ ÑвÑзанноÑÑÑ, менее понÑÑÐ½Ñ - не знаем ÑÑо ÑкÑÑÑо в notifyOrderCreated

__ÐÐ¸Ð´Ñ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð´ÐµÐ¹ÑÑвиÑ__
+ СинÑ
ÑоннÑе - оÑпÑавлÑем запÑÐ¾Ñ Ð¸ блокиÑÑемÑÑ, Ð¾Ð¶Ð¸Ð´Ð°Ñ ÑезÑлÑÑаÑа.
ÐÑоÑÑо и понÑÑно, бÑÑÑÑÑе опеÑаÑии и низкие задеÑжки (ок), Ð½Ð¸Ð·ÐºÐ°Ñ Ð¿ÑопÑÑÐºÐ½Ð°Ñ ÑпоÑобноÑÑÑ (не ок), вÑзÑÐ²Ð°ÐµÑ Ð½Ð¸Ð·ÐºÑÑ Ð´Ð¾ÑÑÑпноÑÑÑ (не ок)
+ ÐÑÑинÑ
ÑоннÑе - не блокиÑÑемÑÑ Ð¾Ð¶Ð¸Ð´Ð°Ñ Ð¾ÑвеÑ
Сложнее в ÑеализаÑии, вÑÑе задеÑжки (не ок), вÑÑе пÑопÑÑÐºÐ½Ð°Ñ ÑпоÑобноÑÑÑ (ок), повÑÑÐ°ÐµÑ Ð´Ð¾ÑÑÑпноÑÑÑ (ок)
Short polling - вÑзÑваем опеÑаÑÐ¸Ñ Ð¸ полÑÑаем ÑÑÑÐ»ÐºÑ Ð½Ð° ÑеÑÑÑÑ Ñ ÑезÑлÑÑаÑом опеÑаÑии. ÐеÑеодиÑеÑки опÑаÑиваем ÑÑÐ¾Ñ ÑеÑÑÑÑ Ð½Ð° пÑÐµÐ´Ð¼ÐµÑ ÑекÑÑего ÑÑаÑÑÑа опеÑаÑии

ÐолÑзоваÑÐµÐ»Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ ждаÑÑ ÐºÐ°Ðº можно менÑÑе, и нÑжно вÑполнÑÑÑ ÐºÐ°Ðº можно менÑÑе запÑоÑов на опÑоÑ
СÑÑаÑегии опÑоÑа:
+ ФикÑиÑованное вÑÐµÐ¼Ñ (Ñаз в ÑекÑндÑ) - пÑоÑÑо, но вÑÐµÐ¼Ñ Ð·Ð°Ð¿ÑоÑа Ð¼Ð¾Ð¶ÐµÑ ÑÑÑÑ Ð¾ÑлиÑаÑÑÑÑ, ÑÑо пÑÐ¸Ð²ÐµÐ´ÐµÑ Ðº лиÑним запÑоÑам
+ ÐÑогÑеÑÑÐ¸Ñ (геомеÑÑиÑеÑкаÑ/алгебÑаиÑеÑкаÑ) - ÑокÑаÑÐ°ÐµÑ ÐºÐ¾Ð»-во запÑоÑов, но возможен ваÑÐ¸Ð°Ð½Ñ ÐºÐ¾Ð³Ð´Ð° пÑидеÑÑÑ Ð´Ð¾Ð»Ð³Ð¾ ждаÑÑ
+ Ðа оÑнове ÑÑаÑиÑÑиÑеÑкого ÑаÑпÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ - напÑимеÑ, знаем, ÑÑо запÑÐ¾Ñ Ð²ÑполнÑеÑÑÑ 50% за 1.5Ñ, 90% за 3Ñ Ð¸ 99% за 5Ñ, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ ÑаÑпÑеделиÑÑ Ð·Ð°Ð¿ÑоÑÑ Ð²Ð¾ вÑемени
Callbacks - вÑзÑваем опеÑаÑÐ¸Ñ Ð¸ полÑÑаем иденÑиÑикаÑÐ¾Ñ Ð¾Ð¿ÐµÑаÑии. СеÑвиÑ, вÑполнÑÑÑий опеÑаÑиÑ, оÑпÑавлÑÐµÑ Ñведомление вÑзвавÑÐµÐ¼Ñ ÑеÑвиÑÑ Ð¾ ÑезÑлÑÑаÑе вÑÐ¿Ð»Ð¾Ð½ÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑаÑии

__СпоÑÐ¾Ð±Ñ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð´ÐµÐ¹ÑÑвиÑ__
+ ÐÑÑмой обмен Ð->Ð - пÑоÑÑо, Ð»ÐµÐ³ÐºÐ°Ñ ÑкÑплÑаÑаÑиÑ, но ÑилÑÐ½Ð°Ñ ÑвÑзанноÑÑÑ ÑеÑвиÑов. ХоÑоÑо Ð´Ð»Ñ Ðоманд
+ Ðбмен ÑеÑез бÑокеÑÑ ÑообÑений Ð->ÐÑокеÑ->Ð - Ñложнее, позволÑÐµÑ ÑнизиÑÑ ÑвÑзанноÑÑÑ ÑеÑвиÑов. ХоÑоÑо Ð´Ð»Ñ Ð¡Ð¾Ð±ÑÑий
Ðа оÑнове callback: RabbitMQ

Ðа оÑнове polling: Kafka

ÐикÑоÑеÑвиÑÑ Ð¼Ð¾Ð³ÑÑ ÑабоÑаÑÑ Ð¾Ð´Ð½Ð¾Ð²ÐµÑеменно Ñ ÑазнÑми диалекÑами ÐÐ. ÐÑи ÑÑом еÑÑÑ __ÑилÑÐ½Ð°Ñ ÑоглаÑованноÑÑÑ__, когда Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑÑÐ°Ð·Ñ Ð²Ð¸Ð´Ð½Ñ Ð²Ñем, Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñа иÑ
пÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸ __конеÑÐ½Ð°Ñ ÑоглаÑованноÑÑÑ__ когда Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±ÑдÑÑ Ð²Ð¸Ð´Ð½Ð¾, но не ÑÑазÑ, а доÑÑавлÑÑÑÑÑ Ð°ÑинÑ
Ñонно
__СилÑÐ½Ð°Ñ ÑоглаÑованноÑÑÑ__ - вÑегда акÑÑалÑнÑе даннÑе, но вÑÑокие задеÑжки пÑи полÑÑении
Ð ÑакиÑ
ÑлÑÑаÑÑ
иÑполÑзÑÑÑÑÑ __РаÑпÑеделеннÑе ÑÑанзакÑии__. Ðо ÑÑо Ñложно, доÑого и еÑÑÑ Ð½Ðµ везде. Ðожно ÑмÑлиÑоваÑÑ ÑаÑпÑеделеннÑÑ ÑÑанзакÑÐ¸Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½ÑÑ
локалÑнÑÑ
ÑÑанзакÑий

ÐÑи ÑÑом возвÑÐ°Ñ Ð¾Ñибки не гаÑанÑиÑÑеÑ, ÑÑо запиÑÑ Ð½Ðµ бÑла вÑÑавленна в ÐÐ. РоÑÐºÐ°Ñ Ð¿ÐµÑвой ÑÑанзакÑии не пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº оÑкаÑÑ Ð²ÑоÑой.
Saga паÑÑеÑн: ÐÐ»Ñ ÑеÑÐµÐ½Ð¸Ñ Ð½Ñжно ÑазбиваÑÑ Ð¾Ð´Ð½Ñ Ð±Ð¾Ð»ÑÑÑÑ ÑаÑпÑеделеннÑÑ ÑÑанзакÑÐ¸Ñ Ð½Ð° поÑледоваÑелÑноÑÑÑ Ð»Ð¾ÐºÐ°Ð»ÑнÑÑ
ÑÑанзакÑий и пÑедоÑÑавиÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¾ÑкаÑа вÑеÑ
локалÑнÑÑ
ÑÑанзакÑий.

ÐÑобенноÑÑи: нÑжно ÑмеÑÑ Ð²Ð¾ÑÑÑанавливаÑÑÑÑ Ð¿Ð¾Ñле Ñбоев лÑбого ÑÑаÑÑка и повÑоÑÑÑÑ ÑÐ°Ð³Ñ Ñ Ð¾Ð¿Ñеделенного Ñага + оÑлиÑаÑÑ ÑиналÑнÑе оÑибки Ð¾Ñ Ð½ÐµÑиналÑнÑÑ
ХоÑеогÑаÑиÑ

+ ÐÐµÑ ÐµÐ´Ð¸Ð½Ð¾Ð¹ ÑоÑки оÑказа
+ Ðегко менÑÑÑ ÐºÑÑоÑек пÑоÑеÑÑа
+ Сложно понÑÑÑ Ð¿ÑоÑеÑÑ Ñеликом и оÑÑлеживаÑÑ Ð¾Ñибки
ÐÑкеÑÑÑаÑиÑ

+ ÐÑÑÑ ÐµÐ´Ð¸Ð½Ð°Ñ ÑоÑка оÑказа
+ Сложнее вноÑиÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² меÑÑа
+ Ðегко понÑÑÑ Ð¿ÑоÑеÑÑ Ð¸ оÑÑлеживаÑÑ Ð¾Ñибки

__ÐонеÑÐ½Ð°Ñ ÑоглаÑованноÑÑÑ__ - могÑÑ Ð±ÑÑÑ Ð½ÐµÐ°ÐºÑÑалÑнÑе даннÑе, заÑо низкие задеÑжки

__ÐзаимоиÑклÑÑениÑ__
Ðногда ÑÑебÑеÑÑÑ Ð²ÑполнÑÑÑ ÐºÐ°ÐºÐ¾Ð¹-Ñо пÑоÑеÑÑ ÑкÑклÑзивно. ÐапÑÐ¸Ð¼ÐµÑ Ð¸ÑполÑзÑÑ ÑаÑпÑеделеннÑй конÑенÑÑÑ - алгоÑиÑмÑ, коÑоÑÑе Ñложно и медленно ÑабоÑаÑÑ. etcd, Consul, Zookeeper. ÐаÑо оÑказоÑÑÑойÑивÑ
ÐлÑÑеÑнаÑива - red lock, когда ÐРиÑполÑзÑеÑÑÑ Ð² каÑеÑÑве Ñ
ÑанилиÑа блокиÑовок. ÐлокиÑовка не заÑ
ваÑÑваеÑÑÑ, а аÑендÑеÑÑÑ Ð½Ð° вÑемÑ. ЧÑÐ¾Ð±Ñ Ð² ÑлÑÑае блокиÑовки и оÑказа ÑиÑÑÐµÐ¼Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовка не оÑÑалаÑÑ Ð½Ð°Ð²Ñегда ÐобавлÑем веÑÑÐ¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовки Ð´Ð»Ñ ÐºÐ¾Ð½ÑÑÐ¾Ð»Ñ ÐµÐµ коÑÑекÑноÑÑи

[к оглавлениÑ](#ÐÐÐ)
## OpenAPI
OpenAPI - ÑпеÑиÑикаÑÐ¸Ñ Ð´Ð»Ñ Ð¾Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ REST API.
https://habr.com/ru/post/541592/
Swagger - ÑÑо ÑÑеймвоÑк Ð´Ð»Ñ ÑпеÑиÑикаÑии RESTful API, ÑÐµÐ»Ñ ÐºÐ¾ÑоÑого - поддеÑживаÑÑ Ð´Ð¾ÐºÑменÑаÑÐ¸Ñ Ð² акÑÑалÑном виде. Ðго пÑелеÑÑÑ Ð·Ð°ÐºÐ»ÑÑаеÑÑÑ Ð² Ñом, ÑÑо он Ð´Ð°ÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð½Ðµ ÑолÑко инÑеÑакÑивно пÑоÑмаÑÑиваÑÑ ÑпеÑиÑикаÑиÑ, но и оÑпÑавлÑÑÑ Ð·Ð°Ð¿ÑоÑÑ â Ñак назÑваемÑй Swagger UI.
+ Code first - ÑнаÑала пиÑем код, поÑом генеÑиÑÑем ÑпеÑиÑикаÑиÑ
+ Schema first - ÑпеÑва ÑпеÑиÑикаÑиÑ, заÑем генеÑиÑÑем по ней код
+ ÐÑбликÑем ÑпеÑиÑикаÑÐ¸Ñ (оÑделнÑй аÑÑеÑак или Swagger)
+ СÑÑого ÑледоваÑÑ ÑÑой ÑпеÑиÑикаÑии
ÐокÑменÑиÑование ÐÐ
Database Schema as a Code - ÑекÑÑÐ°Ñ ÑÑ
ема должна бÑÑÑ Ð¿ÑедÑÑавлена поÑледоваÑелÑноÑÑÑÑ Ð¿Ð°ÑÑей, Ñ
ÑанимÑÑ
как код
+ ÐозможноÑÑÑ Ð²Ð¾ÑÑÑановиÑÑ ÐРна лÑбом окÑÑжении
+ ÐÑдиÑ, конÑÑолÑ, валидаÑиÑ
+ Flyway, Liquibase
[к оглавлениÑ](#ÐÐÐ)
## ТеÑÑиÑование микÑоÑеÑвиÑов
+ ÐомпоненÑнÑе ÑеÑÑÑ Ð¿ÑовеÑÑÑÑ ÑабоÑÑ ÑеÑвиÑов и иÑ
взаимодейÑÑвие
+ ÐодÑлÑнÑе ÑеÑÑÑ Ð´Ð»Ñ ÑеÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¾ÑделÑнÑÑ
ÑÑнкÑий
ÐомпоненÑнÑÑ
должно бÑÑÑ Ð±Ð¾Ð»ÑÑе, Ñем модÑлÑнÑÑ
, Ñ.к. изменÑÐµÐ¼Ð°Ñ ÑÑеда, много завиÑимоÑÑи Ð¼ÐµÐ¶Ð´Ñ ÐºÐ»Ð°ÑÑами
ТеÑÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð½ÐµÐ·Ð°Ð²Ð¸ÑимÑми и ÑмеÑÑ ÑабоÑаÑÑ Ð¿Ð°ÑаллелÑно.
ÐÐ»Ñ ÑеÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ API лÑÑÑе делаÑÑ ÑеалÑнÑе HTTP вÑзовÑ, валидиÑоваÑÑ Ð¾ÑÐ²ÐµÑ ÑоглаÑно ÑÑ
еме (JSON). RESTAssured как пÑÐ¸Ð¼ÐµÑ Ð¸Ð½ÑÑÑÑменÑа.
ÐÑи ÑеÑÑиÑование взаимодейÑÑÐ²Ð¸Ñ Ñ ÐРна каждÑй запÑÑк ÑеÑÑов локалÑно поднимаеÑÑÑ ÐÐ. Embedded или TestContainers. ТеÑÑÑ Ð½Ðµ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾ÑиÑаÑÑ ÐРили бÑÑÑÐµÑ Ð±ÑокеÑа ÑообÑений пеÑед/поÑле Ñвоего запÑÑка/завеÑÑениÑ
ÐÑи ÑеÑÑиÑовании взаимодейÑÑÐ²Ð¸Ñ Ð¼Ð¸ÐºÑоÑеÑвиÑов на каждÑй запÑÑк ÑеÑÑов локалÑно HTTP-ÑеÑвеÑ, Ñоздаем моки опеÑаÑий ÑеÑвиÑов, вÑполнÑем, моки валидиÑÑем. WireMock, MockServer
ÐÑи ÑеÑÑиÑовании аинÑ
ÑоннÑÑ
пÑоÑеÑÑов ÑÑаÑаемÑÑ Ð¿ÑиблизиÑÑ ÑеÑÑовÑй ÑÑенаÑий к ÑеалÑномÑ, запÑÑкаем опеÑаÑÐ¸Ñ Ð¸ ждем завеÑÑÐµÐ½Ð¸Ñ Ð²ÑполнениÑ. Awaitility
ÐÐ»Ñ Ð°Ð²ÑомаÑизаÑии Ñазвиваем Continuous Integration/Continuous Delivery - Ð¿Ð¾Ð¼Ð¾Ð³Ð°ÐµÑ Ð±ÑÑÑÑее ÑазвиваÑÑ ÑеÑвиÑÑ Ð¸ доÑÑавлÑÑÑ Ð¸Ñ
на production. Ðо доÑого.
[к оглавлениÑ](#ÐÐÐ)
## РаÑпÑÐµÐ´ÐµÐ»ÐµÐ½Ð½Ð°Ñ ÑÑаÑÑиÑовка
ÐÑи межÑеÑвиÑном взаимодейÑÑвии Ñложно оÑÑледиÑÑ Ð²ÐµÑÑ Ð¿ÑÑÑ Ð·Ð°Ð¿ÑоÑа по ÑиÑÑеме
+ Ð ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ Ð²Ð½ÐµÑÐ½ÐµÐ¼Ñ Ð·Ð°Ð¿ÑÑÐ¾Ñ Ð¿ÑикÑеплÑем "иденÑиÑикаÑÐ¾Ñ Ð¾Ð¿ÐµÑаÑии"
+ ÐÑобÑаÑÑваем его по вÑей ÑиÑÑеме
+ ÐобавлÑем его в логовÑе ÑообÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¾ÑÑлеживаниÑ. Elastic APM, OpenTracing
ÐÐ»Ñ HTTP: ÐÑикÑеплÑем HTTP-заголовок Ñ ÑÑим иденÑиÑикаÑоÑом - ÐÑполÑзÑем его пÑи обÑабоÑке запÑоÑа - Ðоллинг делаем Ñ Ñем же инденÑиÑикаÑоÑо - ÐбÑанÑй вÑзов Ñ Ð½Ð¸Ð¼ же - РбÑÐ¾ÐºÐµÑ ÑообÑений Ñакже оÑпÑавлÑем ÑÑÐ¾Ñ Ð¸Ð½Ð´ÐµÐ½ÑиÑикаÑоÑ
ÐÐ»Ñ Ð¡Ð°Ð³Ð¸: ÐÑÑ
однÑй запÑÐ¾Ñ ÑеÑÑеÑÑÑ Ð¿Ñи обÑабоÑке аÑинÑ
ÑоннÑÑ
пÑоÑеÑÑов - РзадаÑÑ Ð½Ð° пÑодолжение Ñаги кладем иÑÑ
однÑй иденÑиÑикаÑÐ¾Ñ Ð¾Ð¿ÐµÑаÑии (в ÐÐ) - ÐÑи возобновлении Ñаги иÑполÑзÑем ÑÑÐ¾Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑ
ÐизÑализаÑÐ¸Ñ ÑÑаÑÑ Ð¿Ð¾Ð¼Ð¾Ð³Ð°ÐµÑ Ð¿Ð¾ÑÑÑоиÑÑ ÑÑ
ÐµÐ¼Ñ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð´ÐµÐ¹ÑÑÐ²Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñ ÑеÑвиÑами. Ðожно ÑÑо делаÑÑ Ð°ÑомаÑиÑеÑки и динамиÑеÑки. Zipkin, Jaeger
[к оглавлениÑ](#ÐÐÐ)
# ÐÑÑоÑники
+ [DevColibri](http://devcolibri.com/720)
+ [ХабÑаÑ
абÑ](https://habrahabr.ru/post/87119/)
+ [ÐикипедиÑ](https://ru.wikipedia.org/wiki/ÐбÑекÑно-оÑиенÑиÑованное_пÑогÑаммиÑование)
[ÐопÑоÑÑ Ð´Ð»Ñ ÑобеÑедованиÑ](README.md)