Single Responsibility Principle. НС Ρ‚Π°ΠΊΠΎΠΉ простой, ΠΊΠ°ΠΊ каТСтся

Single Responsibility Principle. НС Ρ‚Π°ΠΊΠΎΠΉ простой, ΠΊΠ°ΠΊ каТСтся Single responsibility principle, ΠΎΠ½ ΠΆΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π΅Π΄ΠΈΠ½ΠΎΠΉ отвСтствСнности,
ΠΎΠ½ ΠΆΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π΅Π΄ΠΈΠ½ΠΎΠΉ измСнчивости β€” ΠΊΡ€Π°ΠΉΠ½Π΅ скользкий для понимания ΠΏΠ°Ρ€Π΅Π½ΡŒ ΠΈ ΡΡ‚ΠΎΠ»ΡŒ Π½Π΅Ρ€Π²ΠΎΠ·Π½Ρ‹ΠΉ вопрос Π½Π° собСсСдовании программиста.

ΠŸΠ΅Ρ€Π²ΠΎΠ΅ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎΠ΅ знакомство с этим ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠΌ ΡΠΎΡΡ‚ΠΎΡΠ»ΠΎΡΡŒ для мСня Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ курса, ΠΊΠΎΠ³Π΄Π° ΠΌΠΎΠ»ΠΎΠ΄Ρ‹Ρ… ΠΈ Π·Π΅Π»Π΅Π½Ρ‹Ρ… нас Π²Ρ‹Π²Π΅Π·Π»ΠΈ Π² лСс, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΠ· Π»ΠΈΡ‡ΠΈΠ½ΠΎΠΊ студСнтов β€” студСнтов настоящих.

Π’ лСсу нас Ρ€Π°Π·Π΄Π΅Π»ΠΈΠ»ΠΈ Π½Π° Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΏΠΎ 8-9 Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈ устроили сорСвнованиС β€” какая Π³Ρ€ΡƒΠΏΠΏΠ° быстрСС Π²Ρ‹ΠΏΡŒΠ΅Ρ‚ Π±ΡƒΡ‚Ρ‹Π»ΠΊΡƒ Π²ΠΎΠ΄ΠΊΠΈ ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ ΠΈΠ· Π³Ρ€ΡƒΠΏΠΏΡ‹ Π½Π°Π»ΠΈΠ²Π°Π΅Ρ‚ Π²ΠΎΠ΄ΠΊΡƒ Π² стакан, Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π²Ρ‹ΠΏΠΈΠ²Π°Π΅Ρ‚, Π° Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ закусываСт. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ²ΡˆΠΈΠΉ свою ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ ΡŽΠ½ΠΈΡ‚ встаСт Π² ΠΊΠΎΠ½Π΅Ρ† ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π³Ρ€ΡƒΠΏΠΏΡ‹.

Π‘Π»ΡƒΡ‡Π°ΠΉ, ΠΊΠΎΠ³Π΄Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π±Ρ‹Π» ΠΊΡ€Π°Ρ‚Π΅Π½ Ρ‚Ρ€Π΅ΠΌ, ΠΈ являлся Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ SRP.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ 1. Единая ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ.

ΠžΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° Π΅Π΄ΠΈΠ½ΠΎΠΉ отвСтствСнности (SRP) Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π΅ΡΡ‚ΡŒ своя ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΈ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° сущСствования ΠΈ эта ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ Ρƒ Π½Π΅Π³ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π°.

Рассмотрим ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ «Π’Ρ‹ΠΏΠΈΠ²ΠΎΡ…Π°» (Tippler).
Для выполнСния ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° SRP Ρ€Π°Π·Π΄Π΅Π»ΠΈΠΌ обязанности Π½Π° Ρ‚Ρ€ΠΎΠΈΡ…:

  • Один Π½Π°Π»ΠΈΠ²Π°Π΅Ρ‚ (PourOperation)
  • Один Π²Ρ‹ΠΏΠΈΠ²Π°Π΅Ρ‚ (DrinkUpOperation)
  • Один закусываСт (TakeBiteOperation)

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· участников процСсса отвСтствСнСн Π·Π° ΠΎΠ΄Π½Ρƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ процСсса, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ΄Π½Ρƒ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΡƒΡŽ ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ β€” Π²Ρ‹ΠΏΠΈΡ‚ΡŒ, Π½Π°Π»ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ Π·Π°ΠΊΡƒΡΠΈΡ‚ΡŒ.

Π’Ρ‹ΠΏΠΈΠ²ΠΎΡ…Π° ΠΆΠ΅, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ являСтся фасадом для Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ:

сlass Tippler {
    //...
    void Act(){
        _pourOperation.Do() // Π½Π°Π»ΠΈΡ‚ΡŒ
        _drinkUpOperation.Do() // Π²Ρ‹ΠΏΠΈΡ‚ΡŒ
        _takeBiteOperation.Do() // Π·Π°ΠΊΡƒΡΠΈΡ‚ΡŒ
    }
}

Single Responsibility Principle. НС Ρ‚Π°ΠΊΠΎΠΉ простой, ΠΊΠ°ΠΊ каТСтся

Π—Π°Ρ‡Π΅ΠΌ?

Π§Π΅Π»ΠΎΠ²Π΅ΠΊ-программист ΠΏΠΈΡˆΠ΅Ρ‚ ΠΊΠΎΠ΄ для Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°-ΠΎΠ±Π΅Π·ΡŒΡΠ½Ρ‹, Π° Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ-обСзьяна Π½Π΅Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»Π΅Π½, Π³Π»ΡƒΠΏ ΠΈ Π²Π΅Ρ‡Π½ΠΎ ΠΊΡƒΠ΄Π°-Ρ‚ΠΎ ΡΠΏΠ΅ΡˆΠΈΡ‚. Он ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΈ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΎΠΊΠΎΠ»ΠΎ 3 β€” 7 Ρ‚Π΅Ρ€ΠΌΠΎΠ² Π² ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.
Π’ случаС Π²Ρ‹ΠΏΠΈΠ²ΠΎΡ…ΠΈ этих Ρ‚Π΅Ρ€ΠΌΠΎΠ² Ρ‚Ρ€ΠΈ. Однако Ссли ΠΌΡ‹ напишСм ΠΊΠΎΠ΄ ΠΎΠ΄Π½ΠΎΠΉ простынСй, Ρ‚ΠΎ Π² Π½Π΅ΠΌ появятся Ρ€ΡƒΠΊΠΈ, стаканы, ΠΌΠΎΡ€Π΄ΠΎΠ±ΠΎΠΈ ΠΈ бСсконСчныС споры ΠΎ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ΅. И всС это Π±ΡƒΠ΄Π΅Ρ‚ Π² Ρ‚Π΅Π»Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. Π£Π²Π΅Ρ€Π΅Π½ β€” Π²Ρ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ Π² своСй ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅. НС самоС Π³ΡƒΠΌΠ°Π½Π½ΠΎΠ΅ испытаниС для психики.

Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ-обСзьяна Π·Π°Ρ‚ΠΎΡ‡Π΅Π½ Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΌΠΈΡ€Π° Π² своСй Π³ΠΎΠ»ΠΎΠ²Π΅. Π’ своСм Π²ΠΎΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡ… ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Ρ‚ΡŒ, ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ ΠΈΠ· Π½ΠΈΡ… Π½ΠΎΠ²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒ. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅ сСбС ΡΡ‚Π°Ρ€ΡƒΡŽ модСль ΠΌΠ°ΡˆΠΈΠ½Ρ‹. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π² Π²ΠΎΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π΄Π²Π΅Ρ€ΡŒ, ΠΎΡ‚ΠΊΡ€ΡƒΡ‚ΠΈΡ‚ΡŒ ΠΎΠ±ΡˆΠΈΠ²ΠΊΡƒ Π΄Π²Π΅Ρ€ΠΈ ΠΈ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΌ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ ΡΡ‚Π΅ΠΊΠ»ΠΎΠΏΠΎΠ΄ΡŠΠ΅ΠΌΠ½ΠΈΠΊΠΎΠ², Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±ΡƒΠ΄ΡƒΡ‚ ΡˆΠ΅ΡΡ‚Π΅Ρ€Π½ΠΈ. Но Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ всС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, Π² ΠΎΠ΄Π½ΠΎΠΌ «Π»ΠΈΡΡ‚ΠΈΠ½Π³Π΅». По ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ «Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ-обСзьяна» Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠΈ-программисты Π΄Π΅ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ€ΡƒΡŽΡ‚ слоТныС ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ Π½Π° Π½Π°Π±ΠΎΡ€ ΠΌΠ΅Π½Π΅Π΅ слоТных ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… элСмСнтов. Однако, Π΄Π΅ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ: Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… старых ΠΌΠ°ΡˆΠΈΠ½Π°Ρ… β€” Π²ΠΎΠ·Π΄ΡƒΡ…ΠΎΠ²ΠΎΠ΄ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Π΄Π²Π΅Ρ€ΡŒ, Π° Π² соврСмСнных β€” сбой элСктроники Π·Π°ΠΌΠΊΠ° Π½Π΅ Π΄Π°Π΅Ρ‚ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒΡΡ Π΄Π²ΠΈΠ³Π°Ρ‚Π΅Π»ΡŽ, Ρ‡Ρ‚ΠΎ доставляСт ΠΏΡ€ΠΈ Ρ€Π΅ΠΌΠΎΠ½Ρ‚Π΅.

Π’Π°ΠΊ Π²ΠΎΡ‚, SRP β€” это ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ, ΠΎΠ±ΡŠΡΡΠ½ΡΡŽΡ‰ΠΈΠΉ КАК Π΄Π΅ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π³Π΄Π΅ провСсти линию раздСлСния.

Он Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π΄Π΅ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Π΄ΠΎ ΠΏΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ раздСлСния «ΠΎΡ‚вСтствСнности», Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΠΎ Π·Π°Π΄Π°Ρ‡Π°ΠΌ Ρ‚Π΅Ρ… ΠΈΠ»ΠΈ ΠΈΠ½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

Single Responsibility Principle. НС Ρ‚Π°ΠΊΠΎΠΉ простой, ΠΊΠ°ΠΊ каТСтся

ВСрнСмся ΠΊ Π²Ρ‹ΠΏΠΈΠ²ΠΎΡ…Π΅ ΠΈ плюсам, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ-обСзьянка ΠΏΡ€ΠΈ Π΄Π΅ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ:

  • Код стал ΠΏΡ€Π΅Π΄Π΅Π»ΡŒΠ½ΠΎ ясСн Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅
  • Код ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΈΡΠ°Ρ‚ΡŒ нСсколько программистов сразу (ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΈΡˆΠ΅Ρ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ элСмСнт)
  • УпрощаСтся автоматичСскоС тСстированиС β€” Ρ‡Π΅ΠΌ ΠΏΡ€ΠΎΡ‰Π΅ элСмСнт, Ρ‚Π΅ΠΌ Π»Π΅Π³Ρ‡Π΅ Π΅Π³ΠΎ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ
  • ΠŸΠΎΡΠ²Π»ΡΠ΅Ρ‚ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° β€” ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ DrinkUpOperation Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²Ρ‹ΠΏΠΈΠ²ΠΎΡ…Π° Π²Ρ‹Π»ΠΈΠ²Π°Π΅Ρ‚ ΠΆΠΈΠ΄ΠΊΠΎΡΡ‚ΡŒ ΠΏΠΎΠ΄ стол. Или Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ наливания Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²Ρ‹ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚Π΅ Π²ΠΈΠ½ΠΎ ΠΈ Π²ΠΎΠ΄Ρƒ ΠΈΠ»ΠΈ Π²ΠΎΠ΄ΠΊΡƒ ΠΈ ΠΏΠΈΠ²ΠΎ. Π’ зависимости ΠΎΡ‚ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ бизнСса Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ всС, ΠΏΡ€ΠΈ этом Π½Π΅ трогая ΠΊΠΎΠ΄ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Tippler.Act.
  • Из этих ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ»ΠΎΠΆΠΈΡ‚ΡŒ ΠΎΠ±ΠΆΠΎΡ€Ρƒ ( ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ TakeBitOperation), Алкоголика (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ DrinkUpOperation Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΈΠ· Π±ΡƒΡ‚Ρ‹Π»ΠΊΠΈ) ΠΈ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ трСбования бизнСса.

(Ой, каТСтся это ΡƒΠΆΠ΅ OCP ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ, ΠΈ я Π½Π°Ρ€ΡƒΡˆΠΈΠ» ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ этого поста)

И, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, минусы:

  • ΠŸΡ€ΠΈΠ΄Π΅Ρ‚ΡΡ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ большС Ρ‚ΠΈΠΏΠΎΠ².
  • Π’Ρ‹ΠΏΠΈΠ²ΠΎΡ…Π° Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Π²Ρ‹ΠΏΡŒΠ΅Ρ‚ Π½Π° ΠΏΠ°Ρ€Ρƒ часов ΠΏΠΎΠ·ΠΆΠ΅, Ρ‡Π΅ΠΌ ΠΌΠΎΠ³ Π±Ρ‹

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ 2. Единая ΠΈΠ·ΠΌΠ΅Π½Ρ‡ΠΈΠ²ΠΎΡΡ‚ΡŒ.

ΠŸΠΎΠ·Π²ΠΎΠ»ΡŒΡ‚Π΅ господа! Класс Π²Ρ‹ΠΏΠΈΠ²ΠΎΡ…ΠΈ ΠΆΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ выполняСт Π΅Π΄ΠΈΠ½ΡƒΡŽ ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ β€” ΠΎΠ½ Π²Ρ‹ΠΏΠΈΠ²Π°Π΅Ρ‚! И Π²ΠΎΠΎΠ±Ρ‰Π΅, слово «ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ» β€” понятиС ΠΊΡ€Π°ΠΉΠ½Π΅ Ρ€Π°Π·ΠΌΡ‹Ρ‚ΠΎΠ΅. ΠšΡ‚ΠΎ-Ρ‚ΠΎ отвСтствСнСн Π·Π° ΡΡƒΠ΄ΡŒΠ±Ρƒ чСловСчСства, Π° ΠΊΡ‚ΠΎ-Ρ‚ΠΎ отвСтствСнСн Π·Π° ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΎΠΏΡ€ΠΎΠΊΠΈΠ½ΡƒΡ‚Ρ‹Ρ… Π½Π° полюсС ΠΏΠΈΠ½Π³Π²ΠΈΠ½ΠΎΠ².

Рассмотрим Π΄Π²Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π²Ρ‹ΠΏΠΈΠ²ΠΎΡ…ΠΈ. ΠŸΠ΅Ρ€Π²Π°Ρ, указанная Π²Ρ‹ΡˆΠ΅, содСрТит Π² сСбС Ρ‚Ρ€ΠΈ класса β€” Π½Π°Π»ΠΈΡ‚ΡŒ, Π²Ρ‹ΠΏΠΈΡ‚ΡŒ ΠΈ Π·Π°ΠΊΡƒΡΠΈΡ‚ΡŒ.

Вторая, написана Ρ‡Π΅Ρ€Π΅Π· ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΡŽ «Π’ΠΏΠ΅Ρ€Π΅Π΄ ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΏΠ΅Ρ€Π΅Π΄» ΠΈ содСрТит всю Π»ΠΎΠ³ΠΈΠΊΡƒ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ Act:

//НС Ρ‚Ρ€Π°Ρ‚ΡŒΡ‚Π΅ врСмя  Π½Π° ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ этого класса. Π›ΡƒΡ‡ΡˆΠ΅ ΡΡŠΠ΅ΡˆΡŒΡ‚Π΅ ΠΏΠ΅Ρ‡Π΅Π½ΡŒΠΊΡƒ
сlass BrutTippler {
   //...
   void Act(){
        // Π½Π°Π»ΠΈΠ²Π°Π΅ΠΌ
    if(!_hand.TryDischarge(from:_bottle, to:_glass, size:_glass.Capacity))
        throw new OverdrunkException();

    // Π²Ρ‹ΠΏΠΈΠ²Π°Π΅ΠΌ
    if(!_hand.TryDrink(from: _glass,  size: _glass.Capacity))
        throw new OverdrunkException();

    //ЗакусываСм
    for(int i = 0; i< 3; i++){
        var food = _foodStore.TakeOrDefault();
        if(food==null)
            throw new FoodIsOverException();

        _hand.TryEat(food);
    }
   }
}

Оба этих класса, с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния стороннСго Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»Ρ, выглядят Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ Π΅Π΄ΠΈΠ½ΡƒΡŽ ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ «Π²Ρ‹ΠΏΠΈΡ‚ΡŒ».

ΠšΠΎΠ½Ρ„ΡƒΠ·!

Π’ΠΎΠ³Π΄Π° ΠΌΡ‹ Π»Π΅Π·Π΅ΠΌ Π² ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ ΠΈ ΡƒΠ·Π½Π°Π΅ΠΌ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ SRP β€” ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π΅Π΄ΠΈΠ½ΠΎΠΉ измСнчивости (Single Changeability Principle).

SCP гласит, Ρ‡Ρ‚ΠΎ «Π£ модуля Π΅ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΠ²ΠΎΠ΄ для измСнСния«. Π’ΠΎ Π΅ΡΡ‚ΡŒ «ΠžΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ β€” это ΠΏΠΎΠ²ΠΎΠ΄ для измСнСния».

(ΠŸΠΎΡ…ΠΎΠΆΠ΅, рСбята, ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π²ΡˆΠΈΠ΅ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΈ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹ Π² тСлСпатичСских способностях Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°-ΠΎΠ±Π΅Π·ΡŒΡΠ½Ρ‹)

Π’Π΅ΠΏΠ΅Ρ€ΡŒ всС встаСт Π½Π° свои мСста. ΠžΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ наливания, выпивания ΠΈ закусывания, Π° Π² самом Π²Ρ‹ΠΏΠΈΠ²ΠΎΡ…Π΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ состав ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, пСрСмСстив закуску ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹ΠΏΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠ² Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ тоста.

Π’ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ «Π’ΠΏΠ΅Ρ€Π΅Π΄ ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΏΠ΅Ρ€Π΅Π΄», всС Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ β€” мСняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ Act. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‡ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½ΠΎ ΠΈ эффСктивно Π² случаС, ΠΊΠΎΠ³Π΄Π° Π»ΠΎΠ³ΠΈΠΊΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈ ΠΎΠ½Π° Ρ€Π΅Π΄ΠΊΠΎ мСняСтся, Π½ΠΎ Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ это кончаСтся уТасными ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ ΠΏΠΎ 500 строк Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ, с количСством if -ΠΎΠ² большим, Ρ‡Π΅ΠΌ трСбуСтся для вступлСния России Π² Π½Π°Ρ‚ΠΎ.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ 3. Локализация ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.

Π’Ρ‹ΠΏΠΈΠ²ΠΎΡ…ΠΈ часто Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡŽΡ‚, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΎΠ½ΠΈ ΠΏΡ€ΠΎΡΠ½ΡƒΠ»ΠΈΡΡŒ Π² Ρ‡ΡƒΠΆΠΎΠΉ ΠΊΠ²Π°Ρ€Ρ‚ΠΈΡ€Π΅, ΠΈΠ»ΠΈ Π³Π΄Π΅ ΠΈΡ… ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ. ΠŸΡ€ΠΈΡˆΠ»ΠΎ врСмя Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²ΠΊΡƒ.

НачнСм Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²ΠΊΡƒ с процСсса наливания:

class PourOperation: IOperation{
    PourOperation(ILogger log /*....*/){/*...*/}
    //...
    void Do(){
        _log.Log($"Before pour with {_hand} and {_bottle}");
        //Pour business logic ...
        _log.Log($"After pour with {_hand} and {_bottle}");
    }
}

Π˜Π½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Π² Π΅Π΅ Π² PourOperation, ΠΌΡ‹ поступили ΠΌΡƒΠ΄Ρ€ΠΎ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния отвСтствСнности ΠΈ инкапсуляции, Π½ΠΎ Π²ΠΎΡ‚ с ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠΌ измСнчивости Ρƒ нас Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊΠΎΠ½Ρ„ΡƒΠ·. Помимо самой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, которая ΠΌΠΎΠΆΠ΅Ρ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ, ΠΈΠ·ΠΌΠ΅Π½Ρ‡ΠΈΠ²ΠΎΠΉ становится ΠΈ сама Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²ΠΊΠ°. ΠŸΡ€ΠΈΠ΄Π΅Ρ‚ΡΡ Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒ ΠΈ Π΄Π΅Π»Π°Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ наливания:

interface IPourLogger{
    void LogBefore(IHand, IBottle){}
    void LogAfter(IHand, IBottle){}
    void OnError(IHand, IBottle, Exception){}
}

class PourOperation: IOperation{
    PourOperation(IPourLogger log /*....*/){/*...*/}
    //...
    void Do(){
        _log.LogBefore(_hand, _bottle);
        try{
             //... business logic
             _log.LogAfter(_hand, _bottle");
        }
        catch(exception e){
            _log.OnError(_hand, _bottle, e)
        }
    }
}

Π”ΠΎΡ‚ΠΎΡˆΠ½Ρ‹ΠΉ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŒ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚, Ρ‡Ρ‚ΠΎ LogAfter, LogBefore ΠΈ OnError Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΈ ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌΠΈ дСйствиями создаст Ρ‚Ρ€ΠΈ класса: PourLoggerBefore, PourLoggerAfter ΠΈ PourErrorLogger.

А вспомнив, Ρ‡Ρ‚ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ для Π²Ρ‹ΠΏΠΈΠ²ΠΎΡ…ΠΈ Ρ‚Ρ€ΠΈ β€” ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π΄Π΅Π²ΡΡ‚ΡŒ классов логирования. Π’ ΠΈΡ‚ΠΎΠ³Π΅ вСсь Π²Ρ‹ΠΏΠΈΠ²ΠΎΡ…Π° состоит ΠΈΠ· 14 (!!!) классов.

Π“ΠΈΠΏΠ΅Ρ€Π±ΠΎΠ»Π°? Π•Π΄Π²Π° Π»ΠΈ! Π§Π΅Π»ΠΎΠ²Π΅ΠΊ-обСзьянка с Π΄Π΅ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎΠΉ Π³Ρ€Π°Π½Π°Ρ‚ΠΎΠΉ Ρ€Π°Π·Π΄Ρ€ΠΎΠ±ΠΈΡ‚ β€œΠ½Π°Π»ΠΈΠ²Π°Ρ‚Π΅Π»Ρβ€ Π½Π° Π³Ρ€Π°Ρ„ΠΈΠ½, стакан, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ наливания, сСрвис ΠΏΠΎΠ΄Π°Ρ‡ΠΈ Π²ΠΎΠ΄Ρ‹, Ρ„ΠΈΠ·ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ модСль столкновСния ΠΌΠΎΠ»Π΅ΠΊΡƒΠ» ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠ²Π°Ρ€Ρ‚Π°Π» Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Ρ€Π°ΡΠΏΡƒΡ‚Π°Ρ‚ΡŒ зависимости Π±Π΅Π· Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. И ΠΏΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ β€” ΠΎΠ½ Π½Π΅ остановится.

ИмСнно Π½Π° этом ΠΌΠΎΠΌΠ΅Π½Ρ‚Π΅ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ приходят ΠΊ Π²Ρ‹Π²ΠΎΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ SRP β€” это сказки ΠΈΠ· Ρ€ΠΎΠ·ΠΎΠ²Ρ‹Ρ… королСвств, ΠΈ уходят Π²ΠΈΡ‚ΡŒ Π»Π°ΠΏΡˆΡƒ…

… Ρ‚Π°ΠΊ ΠΈ Π½Π΅ ΡƒΠ·Π½Π°Π² ΠΎ сущСствовании Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ опрСдСлСния Srp:

«ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π΅Π΄ΠΈΠ½ΠΎΠΉ отвСтствСнности гласит, Ρ‡Ρ‚ΠΎ схоТиС для измСнСния Π²Π΅Ρ‰ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ мСстС«. ΠΈΠ»ΠΈ β€œΠ’ΠΎ, Ρ‡Ρ‚ΠΎ измСняСтся вмСстС, Π΄ΠΎΠ»ΠΆΠ½ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ мСстС”

Π’ΠΎ Π΅ΡΡ‚ΡŒ, Ссли ΠΌΡ‹ мСняСм Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²ΠΊΡƒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Ρ‚ΠΎ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ это ΠΌΠ΅Π½ΡΡ‚ΡŒ Π² ΠΎΠ΄Π½ΠΎΠΌ мСстС.

Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ β€” Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ всС объяснСния SRP, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ Π²Ρ‹ΡˆΠ΅, Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π°Π΄ΠΎ Π΄Ρ€ΠΎΠ±ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏΡ‹, ΠΏΠΎΠΊΠ° ΠΎΠ½ΠΈ дробятся, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π»ΠΎ «ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ свСрху» Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π° Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΡƒΠΆΠ΅ ΠΈ ΠΎΠ± «ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΈ снизу». Π˜Π½Ρ‹ΠΌΠΈ словами, SRP Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ «Π΄Ρ€ΠΎΠ±ΠΈΡ‚ΡŒ ΠΏΠΎΠΊΠ° дробится», Π½ΠΎ ΠΈ Π½Π΅ ΠΏΠ΅Ρ€Π΅ΡΡ‚Π°Ρ€Π°Ρ‚ΡŒΡΡ β€” «Π½Π΅ Ρ€Π°Π·Π΄Ρ€ΠΎΠ±ΠΈΡ‚ΡŒ сцСплСнныС Π²Π΅Ρ‰ΠΈ». Π­Ρ‚ΠΎ вСликая Π±ΠΈΡ‚Π²Π° Π±Ρ€ΠΈΡ‚Π²Ρ‹ Оккама с Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠΎΠΌ-обСзьяной!

Single Responsibility Principle. НС Ρ‚Π°ΠΊΠΎΠΉ простой, ΠΊΠ°ΠΊ каТСтся

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ΠΏΠΈΠ²ΠΎΡ…Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΡ‚Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π³Ρ‡Π΅. Помимо Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π΅ Π½Π°Π΄ΠΎ Π΄Ρ€ΠΎΠ±ΠΈΡ‚ΡŒ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ IPourLogger Π½Π° Ρ‚Ρ€ΠΈ класса, ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ всС Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠΈ Π² ΠΎΠ΄ΠΈΠ½ Ρ‚ΠΈΠΏ:

class OperationLogger{
    public OperationLogger(string operationName){/*..*/}
    public void LogBefore(object[] args){/*...*/}       
    public void LogAfter(object[] args){/*..*/}
    public void LogError(object[] args, exception e){/*..*/}
}

И Ссли Π½Π°ΠΌ добавится Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚Ρ‹ΠΉ Ρ‚ΠΈΠΏ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Ρ‚ΠΎ для Π½Π΅Π΅ ΡƒΠΆΠ΅ Π³ΠΎΡ‚ΠΎΠ²Π° Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²ΠΊΠ°. А ΠΊΠΎΠ΄ самих ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ чист ΠΈ ΠΈΠ·Π±Π°Π²Π»Π΅Π½ ΠΎΡ‚ инфраструктурного ΡˆΡƒΠΌΠ°.

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρƒ нас 5 классов для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ΠΈ выпивания:

  • ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ наливания
  • ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ выпивания
  • ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ заСдания
  • Π›ΠΎΠ³ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ
  • Ѐасад Π²Ρ‹ΠΏΠΈΠ²ΠΎΡ…ΠΈ

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ строго Π·Π° ΠΎΠ΄Π½Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ΄Π½Ρƒ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ для измСнСния. ВсС схоТиС для измСнСния ΠΏΡ€Π°Π²ΠΈΠ»Π° Π»Π΅ΠΆΠ°Ρ‚ рядом.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ· Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ ΠΆΠΈΠ·Π½ΠΈ

ΠžΠ΄Π½Π°ΠΆΠ΄Ρ‹ ΠΌΡ‹ писали сСрвис автоматичСской рСгистрации b2b ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. И появился GOD -ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π° 200 строк ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ содСрТимого:

  • Π‘Ρ…ΠΎΠ΄ΠΈ Π² 1Π‘ ΠΈ Π·Π°Π²Π΅Π΄ΠΈ счСт
  • Π‘ этим счСтом сходи ΠΊ ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ½ΠΎΠΌΡƒ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ ΠΈ Π·Π°Π²Π΅Π΄ΠΈ Π΅Π³ΠΎ Ρ‚Π°ΠΌ
  • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒ, Ρ‡Ρ‚ΠΎ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ с Ρ‚Π°ΠΊΠΈΠΌ счСтом Π½Π΅ создан Π² Π³Π»Π°Π²Π½ΠΎΠΌ сСрвСрС
  • Π‘ΠΎΠ·Π΄Π°ΠΉ Π½ΠΎΠ²Ρ‹ΠΉ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚
  • Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ рСгистрации Π² ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ½ΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅ ΠΈ Π½ΠΎΠΌΠ΅Ρ€ 1с добавь Π² сСрвис Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² рСгистрации
  • Π”ΠΎΠ±Π°Π²ΡŒ Π² эту Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π΅
  • Π‘ΠΎΠ·Π΄Π°ΠΉ Π½ΠΎΠΌΠ΅Ρ€ Ρ‚ΠΎΡ‡ΠΊΠΈ для этого ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π² сСрвисС Ρ‚ΠΎΡ‡Π΅ΠΊ. ΠŸΠ΅Ρ€Π΅Π΄Π°ΠΉ Π² этот сСрвис Π½ΠΎΠΌΠ΅Ρ€ счСта 1с.

И Π±Ρ‹Π»ΠΎ Π² этом спискС Π΅Ρ‰Π΅ ΠΎΠΊΠΎΠ»ΠΎ 10-Ρ‚ΠΈ бизнСс ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с ΠΆΡƒΡ‚ΠΊΠΎΠΉ ΡΠ²ΡΠ·Π°Π½Π½ΠΎΡΡ‚ΡŒΡŽ. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ счСта Π½ΡƒΠΆΠ΅Π½ Π±Ρ‹Π» ΠΏΠΎΡ‡Ρ‚ΠΈ всСм. Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΈ имя ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π½ΡƒΠΆΠ½Ρ‹ Π±Ρ‹Π»ΠΈ Π² ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π΅ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ².

ПослС часового Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³Π°, ΠΌΡ‹ смогли ΠΎΡ‚Π΄Π΅Π»ΠΈΡ‚ΡŒ инфраструктурный ΠΊΠΎΠ΄ ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡŽΠ°Π½ΡΡ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ΠΎΠΌ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹/классы. God ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠΎΠ»Π΅Π³Ρ‡Π°Π», Π½ΠΎ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ 100 строк ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°ΡΠΏΡƒΡ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ Ρ…ΠΎΡ‚Π΅Π»ΠΈ.

Π›ΠΈΡˆΡŒ Ρ‡Π΅Ρ€Π΅Π· нСсколько Π΄Π½Π΅ΠΉ ΠΏΡ€ΠΈΡˆΠ»ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΡΡƒΡ‚ΡŒ этого «ΠΏΠΎΠ»Π΅Π³Ρ‡Π°Π²ΡˆΠ΅Π³ΠΎ» ΠΌΠ΅Ρ‚ΠΎΠ΄Π° β€” ΠΈ Π΅ΡΡ‚ΡŒ бизнСс Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ. И Ρ‡Ρ‚ΠΎ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ описаниС Π’Π— Π±Ρ‹Π»ΠΎ довольно слоТным. И ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ Π½Π° куски этот ΠΌΠ΅Ρ‚ΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ΠΌ SRP, Π° Π½Π΅ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚.

Π€ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·ΠΌ.

ΠŸΡ€ΠΈΡˆΠ»ΠΎ врСмя ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² ΠΏΠΎΠΊΠΎΠ΅ нашСго Π²Ρ‹ΠΏΠΈΠ²ΠΎΡ…Ρƒ. Π’Ρ‹Ρ‚Ρ€ΠΈΡ‚Π΅ слСзы β€” ΠΌΡ‹ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ вСрнСмся ΠΊ Π½Π΅ΠΌΡƒ ΠΊΠ°ΠΊ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ. А сСйчас Ρ„ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·ΡƒΠ΅ΠΌ знания ΠΈΠ· этой ΡΡ‚Π°Ρ‚ΡŒΠΈ.

Π€ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·ΠΌ 1. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ SRP

  1. РаздСляйтС элСмСнты Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… Π±Ρ‹Π» отвСтствСнСн Π·Π° Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΎΠ΄Π½ΠΎ.
  2. ΠžΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ΡΡ ΠΊΠ°ΠΊ «ΠΏΠΎΠ²ΠΎΠ΄ для измСнСния». Π’ΠΎ Π΅ΡΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΠ²ΠΎΠ΄ для измСнСния, Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… бизнСс Π»ΠΎΠ³ΠΈΠΊΠΈ.
  3. ΠŸΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ измСнСния бизнСс Π»ΠΎΠ³ΠΈΠΊΠΈ. Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹. Π˜Π·ΠΌΠ΅Π½ΡΠ΅ΠΌΡ‹Π΅ синхронно элСмСнты Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ рядом.

Π€ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·ΠΌ 2. НСобходимыС ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΈ самопровСрки.

МнС Π½Π΅ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Π»ΠΈΡΡŒ достаточныС ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΈ выполнСния SRP. Но Π΅ΡΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ условия:

1) Π—Π°Π΄Π°ΠΉΡ‚Π΅ сСбС вопрос β€” Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ этот класс/ΠΌΠ΅Ρ‚ΠΎΠ΄/ΠΌΠΎΠ΄ΡƒΠ»ΡŒ/сСрвис. Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° Π½Π΅Π³ΠΎ простым ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ. ( Π±Π»Π°Π³ΠΎΠ΄Π°Ρ€ΡŽ Brightori )

пояснСния

Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ ΠΈΠ½ΠΎΠ³Π΄Π° ΠΏΠΎΠ΄ΠΎΠ±Ρ€Π°Ρ‚ΡŒ простоС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΡ‡Π΅Π½ΡŒ слоТно

2) Ѐикс Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±Π°Π³Π° ΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠΉ Ρ„ΠΈΡ‡ΠΈ Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°Π΅Ρ‚ минимальноС количСство Ρ„Π°ΠΉΠ»ΠΎΠ²/классов. Π’ ΠΈΠ΄Π΅Π°Π»Π΅ β€” ΠΎΠ΄ΠΈΠ½.

пояснСния

Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ (Π·Π° Ρ„ΠΈΡ‡Ρƒ ΠΈΠ»ΠΈ Π±Π°Π³) инкапсулированна Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅/классС, Ρ‚ΠΎ Π²Ρ‹ Ρ‚ΠΎΡ‡Π½ΠΎ Π·Π½Π°Π΅Ρ‚Π΅ Π³Π΄Π΅ ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΈ Ρ‡Ρ‚ΠΎ ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ. НапримСр: Ρ„ΠΈΡ‡Π° измСнСния Π²Ρ‹Π²ΠΎΠ΄Π° Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ. Π‘Π΅Π³Π°Ρ‚ΡŒ ΠΏΠΎ всСму ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΊΠΎΠ΄Ρƒ Π½Π΅ трСбуСтся.

Π”Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ β€” Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ UI-ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π°, схоТСго с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌΠΈ. Если это заставляСт вас Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ 10 Ρ€Π°Π·Π½Ρ‹Ρ… сущностСй ΠΈ 15 Ρ€Π°Π·Π½Ρ‹Ρ… ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚Π΅Ρ€ΠΎΠ² β€” каТСтся, Π²Ρ‹ β€œΠΏΠ΅Ρ€Π΅Π΄Ρ€ΠΎΠ±ΠΈΠ»ΠΈβ€.

3)Если нСсколько Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π½Π°Π΄ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ Ρ„ΠΈΡ‡Π°ΠΌΠΈ вашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Ρ‚ΠΎ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ ΠΌΠ΅Ρ€Π΄ΠΆ -ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π°, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ„Π°ΠΉΠ»/класс Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ Ρƒ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ β€” минимальна.

пояснСния

Если ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π½ΠΎΠ²ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ «Π’Ρ‹Π»ΠΈΡ‚ΡŒ Π²ΠΎΠ΄ΠΊΡƒ ΠΏΠΎΠ΄ стол» Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π·Π°Ρ‚Ρ€ΠΎΠ½ΡƒΡ‚ΡŒ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ, ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ выпивания ΠΈ выливания β€” Ρ‚ΠΎ ΠΏΠΎΡ…ΠΎΠΆΠ΅, Ρ‡Ρ‚ΠΎ отвСтствСнности Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Ρ‹ ΠΊΡ€ΠΈΠ²ΠΎ. БСзусловно, это Π½Π΅ всСгда Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΡΡ‚Π°Ρ€Π°Ρ‚ΡŒΡΡ ΡΠ½ΠΈΠ·ΠΈΡ‚ΡŒ этот ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ.

4) ΠŸΡ€ΠΈ ΡƒΡ‚ΠΎΡ‡Π½ΡΡŽΡ‰Π΅ΠΌ вопросС ΠΏΡ€ΠΎ бизнСс Π»ΠΎΠ³ΠΈΠΊΡƒ (ΠΎΡ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΈΠ»ΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π°) Π²Ρ‹ Π»Π΅Π·Π΅Ρ‚Π΅ строго Π² ΠΎΠ΄ΠΈΠ½ класс/Ρ„Π°ΠΉΠ» ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ Ρ‚ΡƒΠ΄Π°.

пояснСния

Π€ΠΈΡ‡ΠΈ, ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΈΠ»ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½ΠΎ написаны каТдая Π² ΠΎΠ΄Π½ΠΎΠΌ мСстС, Π° Π½Π΅ разбросаны Ρ„Π»Π°Π³Π°ΠΌΠΈ ΠΏΠΎ всСму пространству ΠΊΠΎΠ΄Π°.

5) НСйминг понятСн.

пояснСния

Наш класс ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ отвСтствСнСн Π·Π° Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΎΠ΄Π½ΠΎ, ΠΈ ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½Π° Π² Π΅Π³ΠΎ Π½Π°Π·Π²Π°Π½ΠΈΠΈ

AllManagersManagerService β€” скорСС всСго, God-класс
LocalPayment β€” вСроятно, Π½Π΅Ρ‚

Π€ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·ΠΌ 3. ΠœΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠ° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ «ΠžΠΊΠΊΠ°ΠΌΠ°-first».

Π’ Π½Π°Ρ‡Π°Π»Π΅ проСктирования, Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ-обСзьянка Π½Π΅ Π·Π½Π°Π΅Ρ‚ ΠΈ Π½Π΅ чувствуСт всСх тонкостСй Ρ€Π΅ΡˆΠ°Π΅ΠΌΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π°Ρ‚ΡŒ ΠΌΠ°Ρ…Ρƒ. ΠžΡˆΠΈΠ±Π°Ρ‚ΡŒΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎ Ρ€Π°Π·Π½ΠΎΠΌΡƒ:

  • Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ слишком большиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, склСив Ρ€Π°Π·Π½Ρ‹Π΅ отвСтствСнности
  • ΠŸΠ΅Ρ€Π΅Π΄Ρ€ΠΎΠ±ΠΈΡ‚ΡŒ, Ρ€Π°Π·Π΄Π΅Π»ΠΈΠ² Π΅Π΄ΠΈΠ½ΡƒΡŽ ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ²
  • НСвСрно ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ отвСтствСнности

Π’Π°ΠΆΠ½ΠΎ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ: «ΠΎΡˆΠΈΠ±Π°Ρ‚ΡŒΡΡ Π»ΡƒΡ‡ΡˆΠ΅ Π² Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ сторону», ΠΈΠ»ΠΈ «Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹ β€” Π½Π΅ Π΄Ρ€ΠΎΠ±ΠΈΡ‚Π΅». Если, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ваш класс собираСт Π² сСбС Π΄Π²Π΅ отвСтствСнности β€” Ρ‚ΠΎ ΠΎΠ½ ΠΏΠΎ ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ понятСн ΠΈ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΠΏΠΈΠ»ΠΈΡ‚ΡŒ Π½Π° Π΄Π²Π° с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ клиСнтского ΠΊΠΎΠ΄Π°. Π‘ΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ ΠΆΠ΅ ΠΈΠ· осколков стСкла стакан, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, слоТнСС ΠΈΠ·-Π·Π° Ρ€Π°Π·ΠΌΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎ нСскольким Ρ„Π°ΠΉΠ»Π°ΠΌ контСкста ΠΈ отсутствия Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… зависимостСй Π² клиСнтском ΠΊΠΎΠ΄Π΅.

ΠŸΠΎΡ€Π° Π·Π°ΠΊΡ€ΡƒΠ³Π»ΡΡ‚ΡŒΡΡ

Π‘Ρ„Π΅Ρ€Π° примСнСния SRP Π½Π΅ ограничиваСтся ООП ΠΈ SOLID. Он ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ, функциям, классам, модулям, микросСрвисам ΠΈ сСрвисам. Он ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ ΠΊΠ°ΠΊ ΠΊ β€œΡ„ΠΈΠ³Π°ΠΊΡ-фигакс-ΠΈ-Π²-прод”, Ρ‚Π°ΠΊ ΠΈ ΠΊ β€œΡ€ΠΎΠΊΠ΅Ρ‚-сайнс” Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅, Π²Π΅Π·Π΄Π΅ дСлая ΠΌΠΈΡ€ Ρ‡ΡƒΡ‚ΠΎΡ‡ΠΊΡƒ Π»ΡƒΡ‡ΡˆΠ΅. Если Π·Π°Π΄ΡƒΠΌΠ°Ρ‚ΡŒΡΡ, Ρ‚ΠΎ это Π΅Π΄Π²Π° Π»ΠΈ Π½Π΅ Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ всСй ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΈ. ΠœΠ°ΡˆΠΈΠ½ΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΠ΅, систСмы управлСния, Π΄Π° ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ всС слоТныС систСмы β€” строятся ΠΈΠ· ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², ΠΈ β€œΠ½Π΅Π΄ΠΎΠ΄Ρ€ΠΎΠ±Π»Π΅Π½ΠΈΠ΅β€ Π»ΠΈΡˆΠ°Π΅Ρ‚ конструкторов гибкости, β€œΠΏΠ΅Ρ€Π΅Π΄Ρ€ΠΎΠ±Π»Π΅Π½ΠΈΠ΅β€ β€” эффСктивности, Π° Π½Π΅Π²Π΅Ρ€Π½Ρ‹Π΅ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ β€” Ρ€Π°Π·ΡƒΠΌΠ° ΠΈ Π΄ΡƒΡˆΠ΅Π²Π½ΠΎΠ³ΠΎ спокойствия.

Single Responsibility Principle. НС Ρ‚Π°ΠΊΠΎΠΉ простой, ΠΊΠ°ΠΊ каТСтся

SRP Π½Π΅ Π²Ρ‹Π΄ΡƒΠΌΠ°Π½ ΠΏΡ€ΠΈΡ€ΠΎΠ΄ΠΎΠΉ ΠΈ Π½Π΅ являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ Ρ‚ΠΎΡ‡Π½ΠΎΠΉ Π½Π°ΡƒΠΊΠΈ. Он Π²Ρ‹Π»Π΅Π·Π°Π΅Ρ‚ ΠΈΠ· Π½Π°ΡˆΠΈΡ… с Π²Π°ΠΌΠΈ биологичСских ΠΈ психологичСских ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ.Π­Ρ‚ΠΎ всСго лишь способ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Ρ€Π°Π·Π²ΠΈΠ²Π°Ρ‚ΡŒ слоТныС систСмы ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΌΠΎΠ·Π³Π° Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°-ΠΎΠ±Π΅Π·ΡŒΡΠ½Ρ‹. Он рассказываСт Π½Π°ΠΌ, ΠΊΠ°ΠΊ Π΄Π΅ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ систСму. Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²ΠΊΠ° Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»Π° изрядного Π½Π°Π²Ρ‹ΠΊΠ° Ρ‚Π΅Π»Π΅ΠΏΠ°Ρ‚ΠΈΠΈ, Π½ΠΎ надСюсь, эта ΡΡ‚Π°Ρ‚ΡŒΡ слСгка развСяла Π΄Ρ‹ΠΌΠΎΠ²ΡƒΡŽ завСсу.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ