πŸπŸ—οΈ ΠžΡΠ½ΠΎΠ²Ρ‹ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ для Π΄ΠΆΡƒΠ½ΠΎΠ²: построСниС ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… ΠΈ чистых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° Python

Когда Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ ΠΎ создании ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΈΡ… Π²Π°ΠΆΠ½Ρ‹Ρ… понятий, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ чистого ΠΊΠΎΠ΄Π°, Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½Ρ‹Π΅ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρ‹ ΠΈ SOLID ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ проСктирования, ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π΅ΡˆΠ°ΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π˜Π·ΡƒΡ‡ΠΈΠ² эти ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹, Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ прСдставлСниС ΠΎ построСнии Π½Π°Π΄Π΅ΠΆΠ½Ρ‹Ρ…, Π³ΠΈΠ±ΠΊΠΈΡ… ΠΈ Π»Π΅Π³ΠΊΠΎ тСстируСмых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΈΠΌ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΡΡΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Π±Π°Π·Ρ‹ ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΅Π΅ сопровоТдСния ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ роста ΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ².

НСмного Ρ‚Π΅ΠΎΡ€ΠΈΠΈ

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΠΎΠ³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒΡΡ Π² Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ, я Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° нСсколько часто Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… вопросов:

  1. Π’ Ρ‡Π΅ΠΌ прСимущСства указания Ρ‚ΠΈΠΏΠΎΠ² Π² python?
  2. ΠšΠ°ΠΊΠΎΠ²Ρ‹ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ раздСлСния прилоТСния Π½Π° слои?
  3. ΠšΠ°ΠΊΠΎΠ²Ρ‹ прСимущСства использования ООП?
  4. ΠšΠ°ΠΊΠΎΠ²Ρ‹ нСдостатки использования Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ синглтонов?

НС ΡΡ‚Π΅ΡΠ½ΡΠΉΡ‚Π΅ΡΡŒ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ тСорСтичСскиС Ρ€Π°Π·Π΄Π΅Π»Ρ‹, Ссли Π²Ρ‹ ΡƒΠΆΠ΅ Π·Π½Π°Π΅Ρ‚Π΅ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹, ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ нСпосрСдствСнно ΠΊ Ρ€Π°Π·Π΄Π΅Π»Ρƒ Β«Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹Β».

ВсСгда ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΠΉΡ‚Π΅ Ρ‚ΠΈΠΏΡ‹

Аннотация Ρ‚ΠΈΠΏΠΎΠ² Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠ°Π΅Ρ‚ ΠΊΠΎΠ΄, ΠΏΠΎΠ²Ρ‹ΡˆΠ°Ρ Π΅Π³ΠΎ ΡΡΠ½ΠΎΡΡ‚ΡŒ, Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈ Ρ€Π΅ΠΌΠΎΠ½Ρ‚ΠΎΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½ΠΎΡΡ‚ΡŒ:

  1. Π‘Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ Ρ‚ΠΈΠΏΠΎΠ²: Аннотации Ρ‚ΠΈΠΏΠΎΠ² ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ Π²Ρ‹ΡΠ²ΠΈΡ‚ΡŒ нСсоотвСтствиС Ρ‚ΠΈΠΏΠΎΠ² Π½Π° Ρ€Π°Π½Π½Π΅ΠΉ стадии, Ρ‡Ρ‚ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ количСство ошибок ΠΈ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ваш ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ вСсти сСбя Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ оТидаСтся.
  2. Π‘Π°ΠΌΠΎΠ΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄: Подсказки Ρ‚ΠΈΠΏΠΎΠ² ΠΏΠΎΠ²Ρ‹ΡˆΠ°ΡŽΡ‚ ΡƒΠ΄ΠΎΠ±ΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° ΠΈ Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°ΡŽΡ‚ Π² Ρ€ΠΎΠ»ΠΈ встроСнной Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, уточняя ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.
  3. ΠŸΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΠ΅ качСства ΠΊΠΎΠ΄Π°: ИспользованиС подсказок Ρ‚ΠΈΠΏΠΎΠ² способствуСт ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡŽ Π΄ΠΈΠ·Π°ΠΉΠ½Π° ΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹, способствуя ΠΏΡ€ΠΎΠ΄ΡƒΠΌΠ°Π½Π½ΠΎΠΌΡƒ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ структур Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ интСрфСйсов.
  4. Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° инструмСнтов: Π’Π°ΠΊΠΈΠ΅ инструмСнты, ΠΊΠ°ΠΊ mypy, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠΎΠ² для статичСской ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΈΠΏΠΎΠ², выявляя ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ошибки Π΄ΠΎ Π½Π°Ρ‡Π°Π»Π° выполнСния, Ρ‚Π΅ΠΌ самым упрощая процСсс Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ тСстирования.
  5. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° соврСмСнных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ: FastAPI, Pydantic ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠΎΠ² для Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ дублирования ΠΊΠΎΠ΄Π°.
  6. ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… классов Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅Π΄ простыми структурами Π΄Π°Π½Π½Ρ‹Ρ…: Π’ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ классы Π΄Π°Π½Π½Ρ‹Ρ… ΡƒΠ»ΡƒΡ‡ΡˆΠ°ΡŽΡ‚ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ, Ρ€Π°Π±ΠΎΡ‚Ρƒ со структурированными Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ Ρ‚ΠΈΠΏΠΎΠ² ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с массивами ΠΈ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ°ΠΌΠΈ. Они ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ вмСсто строковых ΠΊΠ»ΡŽΡ‡Π΅ΠΉ, Ρ‡Ρ‚ΠΎ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ошибки ΠΈΠ·-Π·Π° ΠΎΠΏΠ΅Ρ‡Π°Ρ‚ΠΎΠΊ ΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠ°Π΅Ρ‚ Π°Π²Ρ‚ΠΎΠ΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°. Датаклассы Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ Ρ‡Π΅Ρ‚ΠΊΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ структур Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‚ сопровоТдСниС ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ ΠΊΠΎΠ΄Π°.
🐍 Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° питониста
Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° питониста»
πŸπŸŽ“ Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° собСса ΠΏΠΎ Python
ΠŸΠΎΠ΄Ρ‚ΡΠ½ΡƒΡ‚ΡŒ свои знания ΠΏΠΎ Python Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° собСса ΠΏΠΎ PythonΒ»
🐍🧩 Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ Python
Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΠΎ Python для ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ PythonΒ»

ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° слои

Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ прилоТСния Π½Π° слои ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ Ρ€Π΅ΠΌΠΎΠ½Ρ‚ΠΎΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½ΠΎΡΡ‚ΡŒ, ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ ΠΈ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ. ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ для этой стратСгии Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚:

Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π·Π°Π±ΠΎΡ‚

  • ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ слой фокусируСтся Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ аспСктС, Ρ‡Ρ‚ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ, ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ ΠΈ сопровоТдСниС.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ использования

  • Π‘Π»ΠΎΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… частях прилоТСния ΠΈΠ»ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ…. Π˜ΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°.

ΠœΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ

  • ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ слоям ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ нСзависимо Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π° Π² зависимости ΠΎΡ‚ потрСбностСй.

Удобство обслуТивания

  • Π£ΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ обслуТиваниС Π·Π° счСт Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ±Ρ‰ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… слоях.

Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Π½Π°Ρ совмСстная Ρ€Π°Π±ΠΎΡ‚Π°

  • ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π°Π΄ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ слоями нСзависимо Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°.

Π“ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ ΠΈ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ

  • ИзмСнСния Π² тСхнологиях ΠΈΠ»ΠΈ Π΄ΠΈΠ·Π°ΠΉΠ½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… слоях. Π’ Π°Π΄Π°ΠΏΡ‚Π°Ρ†ΠΈΠΈ Π½ΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Ρ‚Ρ€ΠΎΠ½ΡƒΡ‚Ρ‹Π΅ слои, ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Π½Π΅Π·Π°Ρ‚Ρ€ΠΎΠ½ΡƒΡ‚Ρ‹ΠΌΠΈ.

Π’Π΅ΡΡ‚ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ

  • ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ слой ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ нСзависимо, Ρ‡Ρ‚ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠ΅ тСстированиС ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ.

ИспользованиС ΠΌΠ½ΠΎΠ³ΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ Π΄Π°Π΅Ρ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ прСимущСства Π² скорости Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΌ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΈ долгосрочном обслуТивании, дСлая систСмы Π±ΠΎΠ»Π΅Π΅ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΌΠΈ, управляСмыми ΠΈ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌΠΈ ΠΊ измСнСниям.

Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ константы ΠΏΡ€ΠΎΡ‚ΠΈΠ² ΠΈΠ½ΠΆΠ΅ΠΊΡ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²

ΠŸΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния Π²Ρ‹Π±ΠΎΡ€ ΠΌΠ΅ΠΆΠ΄Ρƒ использованиСм Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… констант ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΠΈ зависимостСй (DI) ΠΌΠΎΠΆΠ΅Ρ‚ сущСствСнно ΠΏΠΎΠ²Π»ΠΈΡΡ‚ΡŒ Π½Π° Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ, ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π°Π΅ΠΌΠΎΡΡ‚ΡŒ ΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Π’ этом Π°Π½Π°Π»ΠΈΠ·Π΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ нСдостатки Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… констант ΠΈ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ ΠΈΠΌ прСимущСства, обСспСчиваСмыС ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΠ΅ΠΉ зависимостСй.

Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ константы

  1. Ѐиксированная конфигурация: Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ константы статичны ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ динамичСски Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ срСдам ΠΈΠ»ΠΈ трСбованиям Π±Π΅Π· измСнСния ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Π±Π°Π·Ρ‹. Вакая ΠΆΠ΅ΡΡ‚ΠΊΠΎΡΡ‚ΡŒ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΈΡ… использованиС Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… сцСнариях Ρ€Π°Π±ΠΎΡ‚Ρ‹.
  2. ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΉ объСм тСстирования: ВСстированиС становится слоТным ΠΏΡ€ΠΈ использовании Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… констант, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΡ… Π½Π΅Π»Π΅Π³ΠΊΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ глобальноС состояниС ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ слоТныС ΠΎΠ±Ρ…ΠΎΠ΄Π½Ρ‹Π΅ ΠΏΡƒΡ‚ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΡΠΏΠΎΡΠΎΠ±ΠΈΡ‚ΡŒΡΡ ΠΊ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ сцСнариям тСстирования, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ риск ошибок.
  3. УмСньшСниС ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ: ΠžΠΏΠΎΡ€Π° Π½Π° Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ константы сниТаСт ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ становятся зависимыми ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, установлСнных глобально. Вакая Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ сниТаСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ использования ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… ΠΈΠ»ΠΈ контСкстах.
  4. Высокая ΡΠ²ΡΠ·Π°Π½Π½ΠΎΡΡ‚ΡŒ: Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ константы ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΡƒΡŽΡ‚ спСцифичСскоС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ нСпосрСдствСнно Π² ΠΊΠΎΠ΄ΠΎΠ²ΡƒΡŽ Π±Π°Π·Ρƒ, Ρ‡Ρ‚ΠΎ затрудняСт Π°Π΄Π°ΠΏΡ‚Π°Ρ†ΠΈΡŽ ΠΈΠ»ΠΈ Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠ΅ прилоТСния Π±Π΅Π· Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.
  5. Π‘ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ зависимости: Подобно Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ, Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ константы ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ зависимости Π²Π½ΡƒΡ‚Ρ€ΠΈ прилоТСния. Бтановится нСясно, ΠΊΠ°ΠΊΠΈΠ΅ части систСмы зависят ΠΎΡ‚ этих констант, Ρ‡Ρ‚ΠΎ услоТняСт ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΈ сопровоТдСниС ΠΊΠΎΠ΄Π°.
  6. Врудности сопровоТдСния ΠΈ Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³Π°: Π‘ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ использованиС Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… констант ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌ с обслуТиваниСм. Π Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Π±Π°Π·Ρ‹ рискован, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ измСнСния констант ΠΌΠΎΠ³ΡƒΡ‚ случайно Π·Π°Ρ‚Ρ€ΠΎΠ½ΡƒΡ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ части прилоТСния.
  7. Π”ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ состояния Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ модуля: Π’ Python ΠΊΠΎΠ΄ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ модуля ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ нСсколько Ρ€Π°Π·, Ссли ΠΈΠΌΠΏΠΎΡ€Ρ‚ происходит ΠΏΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌ путям (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΉ ΠΈ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ). Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… экзСмпляров ΠΈ трудноотслСТиваСмым ошибкам Π² обслуТивании.

Π˜Π½ΠΆΠ΅ΠΊΡ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹

  1. ДинамичСская Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ ΠΈ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Π΅ΠΌΠΎΡΡ‚ΡŒ: Π˜Π½ΡŠΠ΅ΠΊΡ†ΠΈΡ зависимостСй позволяСт динамичСски Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹, дСлая прилоТСния Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌΠΈ ΠΊ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠΌΡΡ условиям Π±Π΅Π· нСобходимости измСнСния ΠΊΠΎΠ΄Π°.
  2. Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Π½Π°Ρ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ: DI ΡƒΠ»ΡƒΡ‡ΡˆΠ°Π΅Ρ‚ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ, позволяя Π²Π½Π΅Π΄Ρ€ΡΡ‚ΡŒ ΠΌΠΎΠΊΠΈ ΠΈΠ»ΠΈ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π²ΠΎ врСмя тСстирования, эффСктивно изолируя ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΎΡ‚ Π²Π½Π΅ΡˆΠ½ΠΈΡ… зависимостСй ΠΈ обСспСчивая Π±ΠΎΠ»Π΅Π΅ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ тСстирования.
  3. Π£Π²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ возмоТности ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ использования: ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ становятся Π±ΠΎΠ»Π΅Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΈ ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½Ρ‹ΠΌΠΈ для ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ использования, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ спроСктированы Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π»ΡŽΠ±Ρ‹ΠΌΠΈ ΠΈΠ½ΠΆΠ΅ΠΊΡ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΌ интСрфСйсам. Π’Π°ΠΊΠΎΠ΅ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ части прилоТСния ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Π² Ρ€Π°Π·Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹.
  4. Низкая ΡΠ²ΡΠ·Π°Π½Π½ΠΎΡΡ‚ΡŒ: Π˜Π½ΠΆΠ΅ΠΊΡ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΡΠΏΠΎΡΠΎΠ±ΡΡ‚Π²ΡƒΡŽΡ‚ Π½ΠΈΠ·ΠΊΠΎΠΉ связанности, отдСляя Π»ΠΎΠ³ΠΈΠΊΡƒ систСмы ΠΎΡ‚ Π΅Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΎΠ±Π»Π΅Π³Ρ‡Π°Π΅Ρ‚ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΈ внСсСниС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
  5. Π―Π²Π½ΠΎΠ΅ Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ зависимостСй: Π’ DI ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ явно ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ ΠΎ своих зависимостях, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ конструктора ΠΈΠ»ΠΈ сСттСры. Вакая ΡΡΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ±Π»Π΅Π³Ρ‡Π°Π΅Ρ‚ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ систСмы.
  6. ΠœΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ: По ΠΌΠ΅Ρ€Π΅ роста ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ DI ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ, локализуя ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΈ отдСляя ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ ΠΎΡ‚ использования, Ρ‡Ρ‚ΠΎ способствуСт эффСктивному ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ ΠΈ ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°Π½ΠΈΡŽ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… систСм.

ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΡ‚ΠΈΠ² ООП

ИспользованиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ программирования (ООП) ΠΈ ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΠΈ зависимостСй (DI) ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ²Ρ‹ΡΠΈΡ‚ΡŒ качСство ΠΈ ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π°Π΅ΠΌΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠΌ с Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΈ функциями. Π’ΠΎΡ‚ простоС сравнСниС, Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ эти прСимущСства:

ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄: Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

# Global configuration
database_config = {
    'host': 'localhost',
    'port': 3306,
    'user': 'user',
    'password': 'pass'
}

def connect_to_database():
    print(f"Connecting to database on {database_config['host']}...")
    # Assume connection is made
    return "database_connection"

def fetch_user(database_connection, user_id):
    print(f"Fetching user {user_id} using {database_connection}")
    # Fetch user logic
    return {'id': user_id, 'name': 'John Doe'}

# Usage
db_connection = connect_to_database()
user = fetch_user(db_connection, 1)
  1. Π”ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°: database_config Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ ΠΈΠ»ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ глобально Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… функциях.
  2. Врудности тСстирования: Π˜ΠΌΠΈΡ‚Π°Ρ†ΠΈΡ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΌ состояниСм, Ρ‡Ρ‚ΠΎ Ρ‡Ρ€Π΅Π²Π°Ρ‚ΠΎ ошибками.
  3. Высокая ΡΠ²ΡΠ·Π°Π½Π½ΠΎΡΡ‚ΡŒ: Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ зависят ΠΎΡ‚ глобального состояния ΠΈ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ.

ООП + DI-ΠΏΠΎΠ΄Ρ…ΠΎΠ΄

from typing import Dict, Optional
from abc import ABC, abstractmethod

class DatabaseConnection(ABC):
    @abstractmethod
    def connect(self):
        pass

    @abstractmethod
    def fetch_user(self, user_id: int) -> Dict:
        pass

class MySQLConnection(DatabaseConnection):
    def __init__(self, config: Dict[str, str]):
        self.config = config

    def connect(self):
        print(f"Connecting to MySQL database on {self.config['host']}...")
        # Assume connection is made

    def fetch_user(self, user_id: int) -> Dict:
        print(f"Fetching user {user_id} from MySQL")
        return {'id': user_id, 'name': 'John Doe'}

class UserService:
    def __init__(self, db_connection: DatabaseConnection):
        self.db_connection = db_connection

    def get_user(self, user_id: int) -> Dict:
        return self.db_connection.fetch_user(user_id)

# Configuration and DI
config = {
    'host': 'localhost',
    'port': 3306,
    'user': 'user',
    'password': 'pass'
}
db = MySQLConnection(config)
db.connect()
user_service = UserService(db)
user = user_service.get_user(1)
  1. УмСньшСно Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°: ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… инкапсулируСтся Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ.
  2. ВозмоТности DI: Π›Π΅Π³ΠΊΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ MySQLConnection Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ класс ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ PostgresConnection, Π½Π΅ измСняя ΠΊΠΎΠ΄ UserService.
  3. Энкапсуляция ΠΈ абстракция: Π”Π΅Ρ‚Π°Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡŽΡ‚ΡΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ…, скрыты ΠΎΡ‚ Π³Π»Π°Π·.
  4. Удобство ΠΌΠΎΠΊΠΎΠ² ΠΈ тСстирования: UserService ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Π²Π½Π΅Π΄Ρ€ΠΈΠ² Π·Π°Π³Π»ΡƒΡˆΠΊΡƒ DatabaseConnection.
  5. Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΆΠΈΠ·Π½ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°: Π–ΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΌ Ρ†ΠΈΠΊΠ»ΠΎΠΌ соСдинСний с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠ² контСкста).
  6. ИспользованиС ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² ООП: ДСмонстрируСт наслСдованиС (абстрактный Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс), ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ (рСализация абстрактных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²) ΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹ (интСрфСйсы, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ DatabaseConnection).

Благодаря ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ прилоТСния с использованиСм ООП ΠΈ DI, ΠΊΠΎΠ΄ становится Π±ΠΎΠ»Π΅Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹ΠΌ, Π΅Π³ΠΎ Π»Π΅Π³Ρ‡Π΅ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΈ ΠΎΠ½ становится Π³ΠΈΠ±ΠΊΠΈΠΌ ΠΊ измСнСниям, Ρ‚Π°ΠΊΠΈΠΌ ΠΊΠ°ΠΊ Π·Π°ΠΌΠ΅Π½Π° зависимостСй ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

ВсС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ с коммСнтариями Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ

Начало Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

НСбольшой Ρ‡Π΅ΠΊ-лист:

1. Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌΠΈ ΠΈ зависимостями с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Poetry

poetry new python-app-architecture-demo

Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° создаст ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ структуру Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ: ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°ΠΏΠΊΠΈ для прилоТСния ΠΈ тСстов, Ρ„Π°ΠΉΠ» ΠΌΠ΅Ρ‚Π°ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° pyproject.toml, Π»ΠΎΠΊ Ρ„Π°ΠΉΠ»Ρ‹ зависимостСй ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π³ΠΈΡ‚Π°.

2. ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ вСрсий с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Git

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ Π³ΠΈΡ‚:

git init

Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Ρ„Π°ΠΉΠ» .gitignore для ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ· вашСго рСпозитория. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ стандартный .gitignore, прСдоставлСнный GitHub, ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ .DS_Store для macOS ΠΈ ΠΏΠ°ΠΏΠΊΠΈ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ΠΎΠ² (.idea, .vscode, .zed, etc):

wget -O .gitignore https://raw.githubusercontent.com/github/gitignore/main/Python.gitignore
echo .DS_Store >> .gitignore

3. Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ зависимостями

УстановитС зависимости вашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ poetry:

poetry add fastapi pytest aiogram

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ всС зависимости ΠΏΠΎΠ·ΠΆΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ:

poetry install

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Ссли Π²Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ инструкции.

4. Π€Π°ΠΉΠ»Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ„Π°ΠΉΠ» config.py для Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ настроСк прилоТСния – это распространСнный ΠΈ эффСктивный ΠΏΠΎΠ΄Ρ…ΠΎΠ΄.

УстановитС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния для сСкрСтов ΠΈ настроСк:

touch .env example.env

.env содСрТит ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ git-ignored, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ example.env содСрТит placeholder ΠΈΠ»ΠΈ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈ хранится Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ.

5. Π’ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° прилоТСния

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ Ρ‚ΠΎΡ‡ΠΊΡƒ Π²Ρ…ΠΎΠ΄Π° вашСго прилоТСния Π² main.py:

python_app_architecture/main.py:

def run():
    print('Hello, World!')

if __name__ == '__main__': # avoid run on import
    run()

Π‘Π΄Π΅Π»Π°ΠΉΡ‚Π΅ свой ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½Ρ‹ΠΌ для использования Π² качСствС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ доступ, ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ run Π² __init__.py:

python_app_architecture/init.py

from .main import run

Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ прямоС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Poetry, Π΄ΠΎΠ±Π°Π²ΠΈΠ² ярлык Π² __main__.py. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π²Π°ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ poetry run python python_app_architecture вмСсто Π±ΠΎΠ»Π΅Π΅ Π΄Π»ΠΈΠ½Π½ΠΎΠΉ poetry run python python_app_architecture/main.py.

python_app_architecture/main.py:

from .main import run
run()

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² ΠΈ слоСв

ДисклСймСр:ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, всС прилоТСния Ρ€Π°Π·Π½Ρ‹Π΅, ΠΈ ΠΈΡ… Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ Π² зависимости ΠΎΡ‚ Ρ†Π΅Π»Π΅ΠΉ ΠΈ Π·Π°Π΄Π°Ρ‡. Π― Π½Π΅ Π³ΠΎΠ²ΠΎΡ€ΡŽ, Ρ‡Ρ‚ΠΎ это СдинствСнно ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, Π½ΠΎ ΠΌΠ½Π΅ каТСтся, Ρ‡Ρ‚ΠΎ ΠΎΠ½ достаточно срСдний ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ части ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ². ΠŸΠΎΡΡ‚Π°Ρ€Π°ΠΉΡ‚Π΅ΡΡŒ ΡΠΎΡΡ€Π΅Π΄ΠΎΡ‚ΠΎΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π° основных ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°Ρ… ΠΈ идСях, Π° Π½Π΅ Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ….

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ настроим Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… слоСв прилоТСния.

Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΈΠΌΠ΅Π΅Ρ‚ смысл Π²Π΅Ρ€ΡΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ API (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, создавая ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ Ρ‚ΠΈΠΏΠ° api/v1), Π½ΠΎ ΠΌΡ‹ ΠΏΠΎΠΊΠ° Π±ΡƒΠ΄Π΅ΠΌ Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ‰Π΅ ΠΈ опустим этот шаг.

.
β”œβ”€β”€ python_app_architecture_demo
β”‚Β Β  β”œβ”€β”€ coordinator.py
β”‚Β Β  β”œβ”€β”€ entities
β”‚Β Β  β”œβ”€β”€ general
β”‚Β Β  β”œβ”€β”€ mappers
β”‚Β Β  β”œβ”€β”€ providers
β”‚Β Β  β”œβ”€β”€ repository
β”‚Β Β  β”‚Β Β  └── models
β”‚Β Β  └── services
β”‚Β Β      β”œβ”€β”€ api_service
β”‚Β Β      β”‚Β Β  └── api
β”‚Β Β      β”‚Β Β      β”œβ”€β”€ dependencies
β”‚Β Β      β”‚Β Β      β”œβ”€β”€ endpoints
β”‚Β Β      β”‚Β Β      └── schemas
β”‚Β Β      └── telegram_service
└── tests
  1. appentities – структуры Π΄Π°Π½Π½Ρ‹Ρ… всСго прилоТСния. Чисто носитСли Π΄Π°Π½Π½Ρ‹Ρ… Π±Π΅Π· Π»ΠΎΠ³ΠΈΠΊΠΈ.general - Ρ‡Π΅ΠΌΠΎΠ΄Π°Π½ с инструмСнтами. Папка для ΠΎΠ±Ρ‰ΠΈΡ… ΡƒΡ‚ΠΈΠ»ΠΈΡ‚, ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΠΎΠ² ΠΈ ΠΎΠ±Π΅Ρ€Ρ‚ΠΎΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.mappers - спСциалисты ΠΏΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΡŽ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… Π² сущности, ΠΈΠ»ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. Π₯ΠΎΡ€ΠΎΡˆΠ΅ΠΉ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠΉ являСтся инкапсуляция ΠΌΠ°ΠΏΠΏΠ΅Ρ€ΠΎΠ² Π² Π³Ρ€Π°Π½ΠΈΡ†Π°Ρ… ΠΈΡ… использования, вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΈΡ… Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ. НапримСр, ΠΌΠ°ΠΏΠΏΠ΅Ρ€ models-entities ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒΡŽ модуля рСпозитория. Π”Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€: ΠΌΠ°ΠΏΠΏΠ΅Ρ€ schemas-entities Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ сСрвиса Π°ΠΏΠΈ ΠΈ Π±Ρ‹Ρ‚ΡŒ Π΅Π³ΠΎ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΌ инструмСнтом.providers - основа бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ. ΠŸΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ прилоТСния, Π½ΠΎ ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ нСзависимыми ΠΎΡ‚ Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ интСрфСйса, обСспСчивая Π°Π±ΡΡ‚Ρ€Π°ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ ΠΈ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΡŒ своих ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ.repositores - Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ€ΠΈ. Π₯Ρ€Π°Π½ΠΈΡ‚Π΅Π»ΠΈ доступа ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ, Π°Π±ΡΡ‚Ρ€Π°Π³ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ слоТности взаимодСйствия с Π±Π΄.models - опрСдСлСния Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… структур Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π΅ ΠΏΡƒΡ‚Π°Ρ‚ΡŒ с сущностями entities.services - ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ сСрвис дСйствуСт ΠΊΠ°ΠΊ (ΠΏΠΎΡ‡Ρ‚ΠΈ) Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½ΠΎΠ΅ ΠΏΠΎΠ΄ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, организуя свою ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΈ дСлСгируя основныС Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Π°ΠΌ. Вакая конфигурация обСспСчиваСт Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΠΈ Π΅Π΄ΠΈΠ½ΠΎΠΎΠ±Ρ€Π°Π·Π½ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ всСго прилоТСнияapi_service - управляСт внСшними коммуникациями ΠΏΠΎ http/s, структурированными Π²ΠΎΠΊΡ€ΡƒΠ³ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° FastAPI.dependencies - основныС инструмСнты ΠΈ ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… частСй вашСго API, ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ систСмы DI FastAPIendpoints - ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ http интСрфСйсаschemas - опрСдСлСния структур Π΄Π°Π½Π½Ρ‹Ρ… для запросов ΠΈ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² Π°ΠΏΠΈtelegram_service - Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ сСрвису Π°ΠΏΠΈ, прСдоставляя Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ интСрфСйсС, Π½ΠΎ Π±Π΅Π· дублирования ΠΊΠΎΠ΄Π° бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ Π·Π° счСт Π²Ρ‹Π·ΠΎΠ²Π° Ρ‚Π΅Ρ… ΠΆΠ΅ ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ΠΎΠ², Ρ‡ΠΈΡ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π°ΠΏΠΈ сСрвис.
  2. entities – структуры Π΄Π°Π½Π½Ρ‹Ρ… всСго прилоТСния. Чисто носитСли Π΄Π°Π½Π½Ρ‹Ρ… Π±Π΅Π· Π»ΠΎΠ³ΠΈΠΊΠΈ.
  3. general – Ρ‡Π΅ΠΌΠΎΠ΄Π°Π½ с инструмСнтами. Папка для ΠΎΠ±Ρ‰ΠΈΡ… ΡƒΡ‚ΠΈΠ»ΠΈΡ‚, ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΠΎΠ² ΠΈ ΠΎΠ±Π΅Ρ€Ρ‚ΠΎΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.
  4. mappers – спСциалисты ΠΏΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΡŽ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… Π² сущности, ΠΈΠ»ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. Π₯ΠΎΡ€ΠΎΡˆΠ΅ΠΉ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠΉ являСтся инкапсуляция ΠΌΠ°ΠΏΠΏΠ΅Ρ€ΠΎΠ² Π² Π³Ρ€Π°Π½ΠΈΡ†Π°Ρ… ΠΈΡ… использования, вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΈΡ… Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ. НапримСр, ΠΌΠ°ΠΏΠΏΠ΅Ρ€ models-entities ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒΡŽ модуля рСпозитория. Π”Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€: ΠΌΠ°ΠΏΠΏΠ΅Ρ€ schemas-entities Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ сСрвиса Π°ΠΏΠΈ ΠΈ Π±Ρ‹Ρ‚ΡŒ Π΅Π³ΠΎ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΌ инструмСнтом.
  5. providers – основа бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ. ΠŸΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ прилоТСния, Π½ΠΎ ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ нСзависимыми ΠΎΡ‚ Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ интСрфСйса, обСспСчивая Π°Π±ΡΡ‚Ρ€Π°ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ ΠΈ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΡŒ своих ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ.
  6. repositores – Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ€ΠΈ. Π₯Ρ€Π°Π½ΠΈΡ‚Π΅Π»ΠΈ доступа ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ, Π°Π±ΡΡ‚Ρ€Π°Π³ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ слоТности взаимодСйствия с Π±Π΄.models - опрСдСлСния Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… структур Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π΅ ΠΏΡƒΡ‚Π°Ρ‚ΡŒ с сущностями entities.
  7. models – опрСдСлСния Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… структур Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π΅ ΠΏΡƒΡ‚Π°Ρ‚ΡŒ с сущностями entities.
  8. services – ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ сСрвис дСйствуСт ΠΊΠ°ΠΊ (ΠΏΠΎΡ‡Ρ‚ΠΈ) Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½ΠΎΠ΅ ΠΏΠΎΠ΄ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, организуя свою ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΈ дСлСгируя основныС Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Π°ΠΌ. Вакая конфигурация обСспСчиваСт Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΠΈ Π΅Π΄ΠΈΠ½ΠΎΠΎΠ±Ρ€Π°Π·Π½ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ всСго прилоТСнияapi_service - управляСт внСшними коммуникациями ΠΏΠΎ http/s, структурированными Π²ΠΎΠΊΡ€ΡƒΠ³ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° FastAPI.dependencies - основныС инструмСнты ΠΈ ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… частСй вашСго API, ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ систСмы DI FastAPIendpoints - ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ http интСрфСйсаschemas - опрСдСлСния структур Π΄Π°Π½Π½Ρ‹Ρ… для запросов ΠΈ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² Π°ΠΏΠΈtelegram_service - Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ сСрвису Π°ΠΏΠΈ, прСдоставляя Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ интСрфСйсС, Π½ΠΎ Π±Π΅Π· дублирования ΠΊΠΎΠ΄Π° бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ Π·Π° счСт Π²Ρ‹Π·ΠΎΠ²Π° Ρ‚Π΅Ρ… ΠΆΠ΅ ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ΠΎΠ², Ρ‡ΠΈΡ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π°ΠΏΠΈ сСрвис.
  9. api_service – управляСт внСшними коммуникациями ΠΏΠΎ http/s, структурированными Π²ΠΎΠΊΡ€ΡƒΠ³ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° FastAPI.dependencies - основныС инструмСнты ΠΈ ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… частСй вашСго API, ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ систСмы DI FastAPIendpoints - ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ http интСрфСйсаschemas - опрСдСлСния структур Π΄Π°Π½Π½Ρ‹Ρ… для запросов ΠΈ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² Π°ΠΏΠΈ
  10. dependencies – основныС инструмСнты ΠΈ ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… частСй вашСго API, ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ систСмы DI FastAPI
  11. endpoints – ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ http интСрфСйса
  12. schemas – опрСдСлСния структур Π΄Π°Π½Π½Ρ‹Ρ… для запросов ΠΈ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² Π°ΠΏΠΈ
  13. telegram_service – Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ сСрвису Π°ΠΏΠΈ, прСдоставляя Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ интСрфСйсС, Π½ΠΎ Π±Π΅Π· дублирования ΠΊΠΎΠ΄Π° бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ Π·Π° счСт Π²Ρ‹Π·ΠΎΠ²Π° Ρ‚Π΅Ρ… ΠΆΠ΅ ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ΠΎΠ², Ρ‡ΠΈΡ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π°ΠΏΠΈ сСрвис.
  14. tests – дирСктория ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ для тСстирования ΠΈ содСрТит вСсь тСстовый ΠΊΠΎΠ΄, сохраняя Ρ‡Π΅Ρ‚ΠΊΠΎΠ΅ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ с Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ прилоТСния.

Бвязь ΠΌΠ΅ΠΆΠ΄Ρƒ слоями Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ entities - Π½Π΅ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹, Π° лишь структуры Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ слоями:

ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ слои Π½Π΅ связаны Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, Π° зависят Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ абстракций. Π Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΠΈ зависимостСй:

Вакая гибкая структура позволяСт Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…, ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ сСрвис ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ интСрфСйс Π±Π΅Π· Π»ΠΈΡˆΠ½ΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΈ дублирования ΠΊΠΎΠ΄Π°, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π»ΠΎΠ³ΠΈΠΊΠ° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ модуля находится Π½Π° своСм слоС:

Π’ Ρ‚ΠΎ ΠΆΠ΅ врСмя вся Π»ΠΎΠ³ΠΈΠΊΠ° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ сСрвиса инкапсулируСтся Π²Π½ΡƒΡ‚Ρ€ΠΈ Π½Π΅Π³ΠΎ:

Π˜Π·ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°

Π­Π½Π΄ΠΏΠΎΠΈΠ½Ρ‚

НачнСм с ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ:

# api_service/api/endpoints/user.py

from typing import Annotated
from fastapi import APIRouter, Depends, HTTPException, status
from entities.user import UserCreate
from ..dependencies.providers import (
	user_provider, # 1
	UserProvider # 2
)

router = APIRouter()

@router.post("/register")
async def register(
    user: UserCreate, # 3
    provider: Annotated[UserProvider, Depends(user_provider)] # 4
):
    provider.create_user(user) # 5
    return {"message": "User created!"}
  1. Π˜ΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΠΈ зависимостСй (ΠΌΡ‹ рассмотрим Π΅Π΅ Ρ‡Π΅Ρ€Π΅Π· ΠΌΠΈΠ½ΡƒΡ‚Ρƒ)
  2. Π˜ΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ UserProvider protocol для Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠ°
  3. ΠšΠΎΠ½Π΅Ρ‡Π½Π°Ρ Ρ‚ΠΎΡ‡ΠΊΠ° Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‚Π΅Π»ΠΎ запроса содСрТало схСму UserCreate Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ json
  4. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ provider Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ register прСдставляСт собой экзСмпляр Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ UserProvider, ΠΈΠ½ΠΆΠ΅ΠΊΡ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ FastAPI с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Depends.
  5. Π’ ΠΌΠ΅Ρ‚ΠΎΠ΄ create_user Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ UserProvider ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ распарсСнныС Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π­Ρ‚ΠΎ дСмонстрируСт Ρ‡Π΅Ρ‚ΠΊΠΎΠ΅ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, ΠΊΠΎΠ³Π΄Π° ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ API Π΄Π΅Π»Π΅Π³ΠΈΡ€ΡƒΠ΅Ρ‚ бизнСс-Π»ΠΎΠ³ΠΈΠΊΡƒ ΡƒΡ€ΠΎΠ²Π½ΡŽ ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Π°, ΠΏΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡΡΡŒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°, Ρ‡Ρ‚ΠΎ интСрфСйсныС ΡƒΡ€ΠΎΠ²Π½ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ бизнСс-Π»ΠΎΠ³ΠΈΠΊΡƒ.

UserProvider

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° бизнСс-Π»ΠΎΠ³ΠΈΠΊΡƒ:

# providers/user_provider.py

from typing import Protocol, runtime_checkable, Callable
from typing_extensions import runtime_checkable
from repository import UserRepository
from providers.mail_provider import MailProvider
from entities.user import UserCreate


@runtime_checkable
class UserProvider(Protocol): # 1
    def create_user(self, user: UserCreate): ...

@runtime_checkable
class UserProviderOutput(Protocol): # 2
    def user_provider_created_user(self, provider: UserProvider, user: UserCreate): ...

class UserProviderImpl: # 3

    def __init__(self,
        repository: UserRepository,  # 4 
        mail_provider: MailProvider, # 4
        output: UserProviderOutput | None, # 5
        on_user_created: Callable[[UserCreate], None] | None # 6
    ):
        self.repository = repository
        self.mail_provider = mail_provider
        self.output = output
        self.on_user_created = on_user_created

    # Implementation

    def create_user(self, user: UserCreate): # 7
    
        self.repository.add_user(user) # 8
        self.mail_provider.send_mail(user.email, f"Welcome, {user.name}!") # 9

        if output := self.output: # unwraping the optional
            output.user_provider_created_user(self, user) # 10

        # 11
        if on_user_created := self.on_user_created:
            on_user_created(user)
  1. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ интСрфСйса: UserProvider - это ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ», ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ create_user, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ любой класс, ΠΏΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉΡΡ этого ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°. Он слуТит Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠΌ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ создания ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.
  2. ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»Ρ: UserProviderOutput слуТит Π² качСствС Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»Ρ (ΠΈΠ»ΠΈ Π΄Π΅Π»Π΅Π³Π°Ρ‚Π°), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΎ создании ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» обСспСчиваСт свободноС соСдинСниС ΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠ°Π΅Ρ‚ событийно-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ прилоТСния.
  3. РСализация ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°: UserProviderImpl Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Π»ΠΎΠ³ΠΈΠΊΡƒ создания ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Π½ΠΎ Π΅ΠΌΡƒ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ явно Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свою ΠΏΡ€ΠΈΠ²Π΅Ρ€ΠΆΠ΅Π½Π½ΠΎΡΡ‚ΡŒ UserProvider ΠΈΠ·-Π·Π° динамичСской ΠΏΡ€ΠΈΡ€ΠΎΠ΄Ρ‹ Python ΠΈ использования ΡƒΡ‚ΠΈΠ½ΠΎΠΉ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ.
  4. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ зависимости: ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ UserRepository ΠΈ MailProvider - ΠΎΠ±Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹ – Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Полагаясь ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π° эти ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹, UserProviderImpl остаСтся ΠΎΡ‚Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ, ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΡ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ Dependency Injection, Π³Π΄Π΅ ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ Π½Π΅ зависит ΠΎΡ‚ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ, взаимодСйствуя Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π΅Ρ€Π΅Π· ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Ρ‹.
  5. ΠžΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Π΄Π΅Π»Π΅Π³Π°Ρ‚ Π²Ρ‹Π²ΠΎΠ΄Π°: ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ экзСмпляр UserProviderOutput, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, Ссли ΠΎΠ½ прСдоставлСн, Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ ΠΏΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ создания ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.
  6. Ѐункция ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°: Π’ качСствС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ Π΄Π΅Π»Π΅Π³Π°Ρ‚Ρƒ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ on_user_created для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… дСйствий послС создания ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, обСспСчивая Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈ Π½Π° события.
  7. Π¦Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½Π°Ρ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠ°: ΠœΠ΅Ρ‚ΠΎΠ΄ create_user инкапсулируСт ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ бизнСс-Π»ΠΎΠ³ΠΈΠΊΡƒ для добавлСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, дСмонстрируя ΠΎΡ‚Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΡ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ API.
  8. ВзаимодСйствиС с Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅ΠΌ: Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ UserRepository для абстрагирования ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ), гарантируя, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ….
  9. Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½Π°Ρ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠ°: Π’ΠΎΠ²Π»Π΅ΠΊΠ°Π΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ элСктронной ΠΏΠΎΡ‡Ρ‚Ρ‹ Ρ‡Π΅Ρ€Π΅Π· MailProvider, ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΡ, Ρ‡Ρ‚ΠΎ обязанности ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Π° ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π·Π° Ρ€Π°ΠΌΠΊΠΈ простых CRUD-ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ.
  10. Π£Π²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΎ событиях: Если прСдоставлСн Π΄Π΅Π»Π΅Π³Π°Ρ‚ Π²Ρ‹Π²ΠΎΠ΄Π°, ΠΎΠ½ увСдомляСт Π΅Π³ΠΎ ΠΎ событии создания ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»Ρ для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ интСрактивности ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠΉ Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈ Π½Π° события.
  11. ИсполнСниС ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°: ΠžΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ выполняСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°, обСспСчивая простой ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π±Π΅Π· слоТных ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΉ классов ΠΈΠ»ΠΈ зависимостСй.

Зависимости FastAPI

Π₯ΠΎΡ€ΠΎΡˆΠΎ, Π½ΠΎ ΠΊΠ°ΠΊ ΠΈΠ½ΡΡ‚Π°Π½Ρ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ ΠΈ Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ΡŒ Π΅Π³ΠΎ? Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° ΠΊΠΎΠ΄ ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΠΈ, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ DI-Π΄Π²ΠΈΠΆΠΊΠ° FastAPI:

# services/api_service/api/dependencies/providers.py
from typing import Annotated
from fastapi import Request, Depends
from repository import UserRepository
from providers.user_provider import UserProvider, UserProviderImpl
from providers.mail_provider import MailProvider
from coordinator import Coordinator
from .database import get_session, Session
import config


def _get_coordinator(request: Request) -> Coordinator:
    # private helper function
    # NOTE: You can pass the DIContainer in the same way
    return request.app.state.coordinator

def user_provider(
    session: Annotated[Session, Depends(get_session)], # 1
    coordinator: Annotated[Coordinator, Depends(_get_coordinator)] # 2
) -> UserProvider: # 3
    # UserProvider's lifecycle is bound to short endpoint's lifecycle, so it's safe to use strong references here
    return UserProviderImpl( # 4
        repository=UserRepository(session), # 5
        mail_provider=MailProvider(config.mail_token), # 6
        output=coordinator, # 7
        on_user_created=coordinator.on_user_created # 8
        # on_user_created: lambda: coordinator.on_user_created() # add a lambda if the method's signature is not compatible
    )
  1. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ сСссии Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Ρ‡Π΅Ρ€Π΅Π· систСму ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΠΉ зависимостСй FastAPI, гарантируя, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ запрос ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‡ΠΈΡΡ‚ΡƒΡŽ сСссию.
  2. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· состояния прилоТСния экзСмпляра Coordinator, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π±ΠΎΠ»Π΅Π΅ ΡˆΠΈΡ€ΠΎΠΊΠΈΠΌΠΈ Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ прилоТСния ΠΈ выступаСт Π² качСствС ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° событий.
  3. ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ», Π½ΠΎ Π½Π΅ Ρ‚ΠΎΡ‡Π½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ.
  4. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ экзСмпляра UserProviderImpl ΠΏΡƒΡ‚Π΅ΠΌ ΠΈΠ½ΠΆΠ΅ΠΊΡ†ΠΈΠΈ всСх Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… зависимостСй. Π­Ρ‚ΠΎ дСмонстрируСт практичСскоС ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΠΈ зависимостСй для сборки слоТных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².
  5. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ UserRepository с сСссиСй, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠΉ ΠΈΠ· DI-систСмы FastAPI. Π­Ρ‚ΠΎΡ‚ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ всС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΡΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΡŽ Π΄Π°Π½Π½Ρ‹Ρ…, абстрагируя взаимодСйствиС с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚ ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Π°.
  6. Настройка MailProvider с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Ρ‚ΠΎΠΊΠ΅Π½Π°.
  7. Π˜Π½ΠΆΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Coordinator Π² качСствС Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°. ΠŸΡ€ΠΈ этом прСдполагаСтся, Ρ‡Ρ‚ΠΎ Coordinator Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» UserProviderOutput, Ρ‡Ρ‚ΠΎ позволяСт Π΅ΠΌΡƒ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ увСдомлСния ΠΎ создании ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.
  8. НазначаСт ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈΠ· Coordinator Π² качСствС ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΏΡ€ΠΈ создании ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π­Ρ‚ΠΎ позволяСт Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΠ»ΠΈ увСдомлСния Π² качСствС ΠΏΠΎΠ±ΠΎΡ‡Π½ΠΎΠ³ΠΎ эффСкта процСсса создания ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

Π’Π°ΠΊΠΎΠΉ структурированный ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ UserProvider оснащСн всСми Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌΠΈ инструмСнтами для эффСктивного выполнСния своих Π·Π°Π΄Π°Ρ‡, ΠΏΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡΡΡŒ ΠΏΡ€ΠΈ этом ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² свободной связи ΠΈ высокой связности.

ΠšΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ΠΎΡ€

Класс Coordinator выступаСт Π² Ρ€ΠΎΠ»ΠΈ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ оркСстратора Π² вашСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, управляя Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ сСрвисами, взаимодСйствиями, событиями, устанавливая Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ состояниС ΠΈ внСдряя зависимости. Π’ΠΎΡ‚ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ описаниС Π΅Π³ΠΎ Ρ€ΠΎΠ»Π΅ΠΉ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… возмоТностСй Π½Π° основС прСдоставлСнного ΠΊΠΎΠ΄Π°:

# coordinator.py

from threading import Thread
import weakref
import uvicorn
import config
from services.api_service import get_app as get_fastapi_app
from entities.user import UserCreate
from repository.user_repository import UserRepository
from providers.mail_provider import MailProvider
from providers.user_provider import UserProvider, UserProviderImpl
from services.report_service import ReportService
from services.telegram_service import TelegramService


class Coordinator:

    def __init__(self):
        self.users_count = 0 # 1

        self.telegram_service = TelegramService( # 2
            token=config.telegram_token,
            get_user_provider=lambda session: UserProviderImpl(
                repository=UserRepository(session),
                mail_provider=MailProvider(config.mail_token),
                output=self,
                on_user_created=self.on_user_created
            )
        )

        self.report_service = ReportService(
            get_users_count = lambda: self.users_count # 3
        )

    # Coordinator's Interface

    def setup_initial_state(self):
        fastapi_app = get_fastapi_app()

        fastapi_app.state.coordinator = self # 4

        # 5
        fastapi_thread = Thread(target=lambda: uvicorn.run(fastapi_app))
        fastapi_thread.start()

        # 6
        self.report_service.start()
        self.telegram_service.start()

    # UserProviderOutput Protocol Implementation

    def user_provider_created_user(self, provider: UserProvider, user: UserCreate):
        self.on_user_created(user)

    # Event handlers

    def on_user_created(self, user):
        print("User created: ", user)
        self.users_count += 1

        # 7
        if self.users_count >= 10_000:
            self.report_service.interval_seconds *= 10
        elif self.users_count >= 10_000_000:
            self.report_service.stop() # 8
  1. НСкоторыС состояния ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠΌΠΈ для Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ΠΎΠ², слуТб, слоСв ΠΈ всСго прилоТСния.
  2. Π‘Π±ΠΎΡ€ΠΊΠ° Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ ΠΈ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй
  3. Π—Π΄Π΅ΡΡŒ слСдуСт ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΎ ΠΊΡ€ΡƒΠ³ΠΎΠ²Ρ‹Ρ… ссылках, Ρ‚ΡƒΠΏΠΈΠΊΠ°Ρ… ΠΈ ΡƒΡ‚Π΅Ρ‡ΠΊΠ°Ρ… памяти, подробности см. Π² ΠΏΠΎΠ»Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅.
  4. ΠŸΠ΅Ρ€Π΅Π΄Π°ΠΉΡ‚Π΅ экзСмпляр ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ΠΎΡ€Π° Π² состояниС прилоТСния FastAPI, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Π½Π΅ΠΌΡƒ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Ρ… Ρ‚ΠΎΡ‡ΠΊΠ°Ρ… Ρ‡Π΅Ρ€Π΅Π· DI-систСму FastAPI.
  5. Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ всС сСрвисы Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ…
  6. Π£ΠΆΠ΅ запускаСтся Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ сСрвиса
  7. НСкоторая кросс-сСрвисная Π»ΠΎΠ³ΠΈΠΊΠ°, просто для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°
  8. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ управлСния сСрвисами ΠΈΠ· ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ΠΎΡ€Π°

Π­Ρ‚ΠΎΡ‚ оркСстратор Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈ связь ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ, ΠΏΠΎΠ²Ρ‹ΡˆΠ°Ρ ΡƒΠΏΡ€Π°Π²Π»ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ ΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ прилоТСния. Он эффСктивно ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½ΠΈΡ€ΡƒΠ΅Ρ‚ дСйствия ΠΌΠ΅ΠΆΠ΄Ρƒ сСрвисами, обСспСчивая Π°Π΄Π΅ΠΊΠ²Π°Ρ‚Π½ΡƒΡŽ Ρ€Π΅Π°ΠΊΡ†ΠΈΡŽ прилоТСния Π½Π° измСнСния состояния ΠΈ взаимодСйствиС с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ. Π­Ρ‚ΠΎΡ‚ шаблон проСктирования ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ΅Π½ для поддСрТания чистого раздСлСния Π·Π°Π΄Π°Ρ‡ ΠΈ обСспСчСния Π±ΠΎΠ»Π΅Π΅ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠ³ΠΎ ΠΈ Π³ΠΈΠ±ΠΊΠΎΠ³ΠΎ повСдСния прилоТСния.

ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ DI

Однако Π² ΠΊΡ€ΡƒΠΏΠ½ΠΎΠΌΠ°ΡΡˆΡ‚Π°Π±Π½Ρ‹Ρ… прилоТСниях Ρ€ΡƒΡ‡Π½ΠΎΠ΅ использованиС DI ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ появлСнию Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ количСства шаблонного ΠΊΠΎΠ΄Π°. ИмСнно Ρ‚ΠΎΠ³Π΄Π° Π½Π° ΠΏΠΎΠΌΠΎΡ‰ΡŒ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ DI Container. DI Containers, ΠΈΠ»ΠΈ Dependency Injection Containers, – это ΠΌΠΎΡ‰Π½Ρ‹Π΅ инструмСнты, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния для управлСния зависимостями Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Они слуТат Π² качСствС Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ мСста, Π³Π΄Π΅ Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈ ΠΈΡ… зависимости. Когда ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ трСбуСтся Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ, DI-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ автоматичСски ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ инстанцированиС ΠΈ прСдоставлСниС этих зависимостСй, гарантируя, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ для эффСктивного функционирования. Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ способствуСт свободному соСдинСнию, ΡƒΠ»ΡƒΡ‡ΡˆΠ°Π΅Ρ‚ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ ΠΈ ΠΎΠ±Ρ‰ΡƒΡŽ ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π°Π΅ΠΌΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Π±Π°Π·Ρ‹ Π·Π° счСт абстрагирования слоТной Π»ΠΎΠ³ΠΈΠΊΠΈ управлСния зависимостями ΠΎΡ‚ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ прилоТСния. DI-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‚ процСсс Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, автоматизируя ΠΈ цСнтрализуя ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ зависимостСй ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ².

Для python сущСствуСт мноТСство Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ DI Container, я просмотрСл ΠΏΠΎΡ‡Ρ‚ΠΈ всС ΠΈΠ· Π½ΠΈΡ… ΠΈ записал Π»ΡƒΡ‡ΡˆΠΈΠ΅ IMO

  1. python-dependency-injector - Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½, основан Π½Π° классах, ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π°, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Singleton ΠΈΠ»ΠΈ Factory
  2. lagom - интСрфСйс словаря с автоматичСским Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ
  3. dishka - Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ области видимости Ρ‡Π΅Ρ€Π΅Π· ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ контСкста
  4. that-depends - ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° контСкстных ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠ² (ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ Π² ΠΊΠΎΠ½Ρ†Π΅), встроСнная интСграция fastapi
  5. punq - Π±ΠΎΠ»Π΅Π΅ классичСский ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ с ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ register ΠΈ resolve.
  6. rodi - классичСский, простой, автоматичСский

main.py

Π’ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΎΠ±Π½ΠΎΠ²ΠΈΠΌ Ρ„Π°ΠΉΠ» main.py:

# main.py
from coordinator import Coordinator


def run(): # entry point, no logic here, only run the coordinator
    coordinator = Coordinator()
    coordinator.setup_initial_state()

if __name__ == '__main__':
    run()

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΠ΅ прСдставлСниС ΠΎΠ± обсуТдаСмых Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½Ρ‹Ρ… ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… стратСгиях, ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ всС Ρ„Π°ΠΉΠ»Ρ‹ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ. НСсмотря Π½Π° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΉ объСм ΠΊΠΎΠ΄Π°, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ„Π°ΠΉΠ» снабТСн ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ коммСнтариями ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ дСталями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π³Π»ΡƒΠ±ΠΆΠ΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ структуру ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ прилоТСния. Π˜Π·ΡƒΡ‡Π΅Π½ΠΈΠ΅ этих аспСктов ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ вашС знакомство с систСмой, гарантируя, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Ρ‹ ΠΊ эффСктивной Π°Π΄Π°ΠΏΡ‚Π°Ρ†ΠΈΠΈ ΠΈΠ»ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡŽ прилоТСния.

Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ унивСрсалСн для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° Python. Он эффСктивСн для бэкСнд-сСрвСров Π±Π΅Π· состояния, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, построСнных с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ FastAPI, Π½ΠΎ Π΅Π³ΠΎ прСимущСства особСнно ярко ΠΏΡ€ΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ Π² прилоТСниях Π±Π΅Π· Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° ΠΈ прилоТСниях, ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… состояниСм. Бюда относятся Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠ½Ρ‹Π΅ прилоТСния (ΠΊΠ°ΠΊ с графичСским интСрфСйсом, Ρ‚Π°ΠΊ ΠΈ с ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкой), Π° Ρ‚Π°ΠΊΠΆΠ΅ систСмы, ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ физичСскими устройствами, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ IoT-устройствами, Ρ€ΠΎΠ±ΠΎΡ‚ΠΎΡ‚Π΅Ρ…Π½ΠΈΠΊΠΎΠΉ, Π΄Ρ€ΠΎΠ½Π°ΠΌΠΈ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ тСхнологиями, ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ Π½Π° Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ΅ обСспСчСниС.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, я Π½Π°ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΊΠ½ΠΈΠ³Ρƒ Чистый ΠΊΠΎΠ΄ Π ΠΎΠ±Π΅Ρ€Ρ‚Π° ΠœΠ°Ρ€Ρ‚ΠΈΠ½Π° для дальнСйшСго обогащСния. ΠšΡ€Π°Ρ‚ΠΊΠΎΠ΅ содСрТаниС ΠΈ основныС Π²Ρ‹Π²ΠΎΠ΄Ρ‹ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ здСсь. Π­Ρ‚ΠΎΡ‚ рСсурс прСдоставит Π²Π°ΠΌ ΠΎΡΠ½ΠΎΠ²ΠΎΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΈ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΡ€Π°ΠΉΠ½Π΅ Π²Π°ΠΆΠ½Ρ‹ для поддСрТания высоких стандартов Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния.

Автор: ΠœΠ°Ρ€ΠΊ ΠŸΠ°Ρ€ΠΊΠ΅Ρ€

www.markparker.me

Π’Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»: t.me/parker_is_typing

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•

admin
11 дСкабря 2018

ООП Π½Π° Python: ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python допускаСт Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΠΈ, Π½ΠΎ Π² Π΅Π³ΠΎ основС...
admin
28 июня 2018

3 самых Π²Π°ΠΆΠ½Ρ‹Ρ… сфСры примСнСния Python: возмоТности языка

БущСствуСт мноТСство областСй примСнСния Python, Π½ΠΎ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ½ особСнно...
admin
13 фСвраля 2017

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python: ΠΎΡ‚ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ° Π΄ΠΎ профСссионала

Пошаговая инструкция для всСх, ΠΊΡ‚ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒΒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python...