JavaRush/Java Π±Π»ΠΎΠ³/Random/ΠšΠΎΡ„Π΅-Π±Ρ€Π΅ΠΉΠΊ #85. Π’Ρ€ΠΈ ΡƒΡ€ΠΎΠΊΠ° Java, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я усвоил Π½Π° собст...

ΠšΠΎΡ„Π΅-Π±Ρ€Π΅ΠΉΠΊ #85. Π’Ρ€ΠΈ ΡƒΡ€ΠΎΠΊΠ° Java, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я усвоил Π½Π° собствСнном Π³ΠΎΡ€ΡŒΠΊΠΎΠΌ ΠΎΠΏΡ‹Ρ‚Π΅. Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ SOLID Π² ΠΊΠΎΠ΄Π΅

Π‘Ρ‚Π°Ρ‚ΡŒΡ ΠΈΠ· Π³Ρ€ΡƒΠΏΠΏΡ‹ Random
участников

Π’Ρ€ΠΈ ΡƒΡ€ΠΎΠΊΠ° Java, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я усвоил Π½Π° собствСнном Π³ΠΎΡ€ΡŒΠΊΠΎΠΌ ΠΎΠΏΡ‹Ρ‚Π΅

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: Medium Π˜Π·ΡƒΡ‡Π°Ρ‚ΡŒ Java слоТно. Π― учился Π½Π° своих ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π° ΠΌΠΎΠΈΡ… ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… ΠΈ Π³ΠΎΡ€ΡŒΠΊΠΎΠΌ ΠΎΠΏΡ‹Ρ‚Π΅, ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Π°ΠΌ совсСм Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ. ΠšΠΎΡ„Π΅-Π±Ρ€Π΅ΠΉΠΊ #85. Π’Ρ€ΠΈ ΡƒΡ€ΠΎΠΊΠ° Java, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я усвоил Π½Π° собствСнном Π³ΠΎΡ€ΡŒΠΊΠΎΠΌ ΠΎΠΏΡ‹Ρ‚Π΅. Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ SOLID Π² ΠΊΠΎΠ΄Π΅ - 1

1. Лямбды ΠΌΠΎΠ³ΡƒΡ‚ Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ нСприятности

Лямбды часто ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°ΡŽΡ‚ 4 строки ΠΊΠΎΠ΄Π° ΠΈ Π±Ρ‹Π²Π°ΡŽΡ‚ большС, Ρ‡Π΅ΠΌ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π»ΠΎΡΡŒ. Π­Ρ‚ΠΎ утяТСляСт Ρ€Π°Π±ΠΎΡ‡ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ. Π’Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ с лямбда? Π’Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ этого ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ. ΠŸΠΎΡ‡Π΅ΠΌΡƒ? Если лямбда ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ мСста Π²Ρ‹Π·ΠΎΠ²Π°, ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈΠ· лямбды. А Π²ΠΎΡ‚ Happy path Π² лямбдС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ. ПослС сбоя Π²ΠΎ врСмя выполнСния Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Ρ‚Π°ΠΊΠΎΠΉ ΠΎΡ‚Π²Π΅Ρ‚:
at [CLASS].lambda$null$2([CLASS].java:85)
at [CLASS]$$Lambda$64/730559617.accept(Unknown Source)
Π‘Π»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° трассировкой стСка лямбда слоТно. ИмСна Π·Π°ΠΏΡƒΡ‚Π°Π½Ρ‹, ΠΈΡ… Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΎΡ‚ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΈΡ‚ΡŒ. Π‘ΠΎΠ»ΡŒΡˆΠ΅ лямбд β€” большС трассировки стСка. Какой Π»ΡƒΡ‡ΡˆΠΈΠΉ способ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ лямбд? Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹.
map(elem -> {
 int result = elem.getResult();
 return result;
});
Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ способ β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹Π΅ ΠΏΡ€ΠΈΠ΅ΠΌΡ‹ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ IntelliJ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ TAB для Π²Ρ‹Π±ΠΎΡ€Π° ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒ, ΠΈ совмСститС это с ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΌΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ. β€œΠšΠΎΠ³Π΄Π° ΠΌΡ‹ останавливаСмся Π½Π° строкС, содСрТащСй лямбда, Ссли ΠΌΡ‹ Π½Π°ΠΆΠΈΠΌΠ°Π΅ΠΌ F7 (step into), Ρ‚ΠΎΠ³Π΄Π° IntelliJ выдСляСт Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒ. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊ для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Tab, ΠΈ ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΡ‹ это Ρ€Π΅ΡˆΠΈΠΌ, снова Π½Π°ΠΆΠΌΠΈΡ‚Π΅ F7”. Как ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ мСста Π²Ρ‹Π·ΠΎΠ²Π° ΠΈΠ· лямбды? Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΌ ΠΈΠ»ΠΈ фактичСски ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ. Π’Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΡƒ (wrap) ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… мСста Π²Ρ‹Π·ΠΎΠ²Π°. Π›ΠΈΠ±ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ AtomicType, Π»ΠΈΠ±ΠΎ Ρ‡Π΅Ρ€Π΅Π· свой type. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΡΠΎΠ·Π΄Π°Π½Π½ΡƒΡŽ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΡƒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ с lambda. Как Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с трассировкой стСка? Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (named functions). Π’Π°ΠΊ Π²Ρ‹ смоТСтС быстрСС Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ отвСтствСнный (responsible) ΠΊΠΎΠ΄, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΈ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Ρ€Π΅Π·Π°Ρ‚ΡŒ cryptic stack trace. ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΡΠ΅Ρ‚ΡΡ ΠΎΠ΄Π½Π° ΠΈ Ρ‚Π° ΠΆΠ΅ лямбда? ΠŸΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚Π΅ Π΅Π΅ Π² ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. Π£ вас Π±ΡƒΠ΄Π΅Ρ‚ Сдиная Ρ‚ΠΎΡ‡ΠΊΠ° отсчСта. КаТдая лямбда ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Ρ‡Ρ‚ΠΎ затрудняСт отслСТиваниС.
lambda$yourNamedFunction
lambda$0
Π˜ΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π΅ΡˆΠ°ΡŽΡ‚ Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ΅ лямбды. Π˜ΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°Π·Π±ΠΈΠ²Π°ΡŽΡ‚ большиС лямбды, ΡΠΎΠ·Π΄Π°ΡŽΡ‚ мСньшиС Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΠ΄Π° ΠΈ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.
.map(this::namedFunc1).filter(this::namedFilter1).map(this::namedFunc2)

2. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ со списками

Π’Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ со списками (Lists). Π’Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ HashMap для Π΄Π°Π½Π½Ρ‹Ρ…. Для Ρ€ΠΎΠ»Π΅ΠΉ Π²Π°ΠΌ понадобится TreeMap. Π­Ρ‚ΠΎΡ‚ список ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ. И Π²Π°ΠΌ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с коллСкциями. Как ΡΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ список? Какой список Π²Π°ΠΌ Π½ΡƒΠΆΠ΅Π½? Он Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ нСизмСняСмым ΠΈΠ»ΠΈ измСняСмым? ВсС эти ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ Π²Π»ΠΈΡΡŽΡ‚ Π½Π° Π±ΡƒΠ΄ΡƒΡ‰Π΅Π΅ вашСго ΠΊΠΎΠ΄Π°. Π’Ρ‹Π±Π΅Ρ€ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ список Π·Π°Ρ€Π°Π½Π΅Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡ‚ΠΎΠΌ Π½Π΅ ΠΆΠ°Π»Π΅Ρ‚ΡŒ. Arrays::asList создаСт β€œΡΠΊΠ²ΠΎΠ·Π½ΠΎΠΉβ€ список. Π§Ρ‚ΠΎ нСльзя Π΄Π΅Π»Π°Ρ‚ΡŒ с этим списком? Π’Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€. Он Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π΅Π½. Π§Ρ‚ΠΎ Ρ‚ΡƒΡ‚ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ? Π—Π°Π΄Π°ΠΉΡ‚Π΅ элСмСнты, сортировку ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Π½Π΅ Π²Π»ΠΈΡΡŽΡ‰ΠΈΠ΅ Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Arrays::asList остороТно, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π΅Π½, Π° содСрТимоС β€” Π½Π΅Ρ‚. new ArrayList() создаСт Π½ΠΎΠ²Ρ‹ΠΉ β€œΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡ‹ΠΉβ€ список. КакиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ созданный список? ВсС, ΠΈ это ΠΏΠΎΠ²ΠΎΠ΄ Π±Ρ‹Ρ‚ΡŒ остороТнСС. Π‘ΠΎΠ·Π΄Π°Π²Π°ΠΉΡ‚Π΅ измСняСмыС списки ΠΈΠ· нСизмСняСмых с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ new ArrayList(). List::of создаСт β€œΠ½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΡƒΡŽβ€ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ. Π•Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈ содСрТаниС Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… условиях. Если содСрТимоС β€” ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, int, список нСизмСняСм. ВзглянитС Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€.
@Test
public void testListOfBuilders() {
  System.out.println("### TESTING listOF with mutable content ###");

  StringBuilder one = new StringBuilder();
  one.append("a");

  StringBuilder two = new StringBuilder();
  two.append("a");

  List<StringBuilder> asList = List.of(one, two);

  asList.get(0).append("123");

  System.out.println(asList.get(0).toString());
}
### TESTING listOF with mutable content ### a123
Π’Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ нСизмСняСмыС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈ Π²ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΈΡ… Π² List::of. ΠŸΡ€ΠΈ этом List::of Π½Π΅ Π΄Π°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΉ нСизмСнности. List::of обСспСчиваСт Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΠΎΡΡ‚ΡŒ, Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈ удобство чтСния. Π—Π½Π°ΠΉΡ‚Π΅, ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ измСняСмыС, Π° ΠΊΠΎΠ³Π΄Π° нСизмСняСмыС структуры. Бписок Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π² нСизмСняСмом спискС. Π˜Π·ΠΌΠ΅Π½ΡΠ΅ΠΌΡ‹ΠΉ список ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ измСняСмым списком. ΠŸΠΎΠΉΠΌΠΈΡ‚Π΅, какая коллСкция Π²Π°ΠΌ Π½ΡƒΠΆΠ½Π° для создания Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°.

3. Аннотации Π·Π°ΠΌΠ΅Π΄Π»ΡΡŽΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ

Π’Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ΡΡŒ аннотациями? Π’Ρ‹ ΠΈΡ… ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅? Π’Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π΄Π΅Π»Π°ΡŽΡ‚? Если Π²Ρ‹ Π΄ΡƒΠΌΠ°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ Logged аннотация ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Ρ‚ΠΎ Π²Ρ‹ ΠΎΡˆΠΈΠ±Π°Π΅Ρ‚Π΅ΡΡŒ. Π― использовал Logged для рСгистрации Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. К ΠΌΠΎΠ΅ΠΌΡƒ ΡƒΠ΄ΠΈΠ²Π»Π΅Π½ΠΈΡŽ, это Π½Π΅ сработало.
@Transaction
@Method("GET")
@PathElement("time")
@PathElement("date")
@Autowired
@Secure("ROLE_ADMIN")
public void manage(@Qualifier('time')int time) {
...
}
Π§Ρ‚ΠΎ Π½Π΅ Ρ‚Π°ΠΊ Π² этом ΠΊΠΎΠ΄Π΅? Π’ΡƒΡ‚ ΠΌΠ½ΠΎΠ³ΠΎ дайдТСста ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. Π’Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Ρ‚ΡŒΡΡ с этим ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·. ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ смСшана с ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ. НСплохо само ΠΏΠΎ сСбС, Π½ΠΎ бросаСтся Π² Π³Π»Π°Π·Π°. Аннотации Π½ΡƒΠΆΠ½Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄. Π’Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ endpoint. НС Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ @Transactional. Аннотации ΡΠΎΠΊΡ€Π°Ρ‰Π°ΡŽΡ‚ шаблон Π·Π° счСт извлСчСния ΠΊΠΎΠ΄Π°. Π—Π΄Π΅ΡΡŒ Π½Π΅Ρ‚ явного побСдитСля, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² ΠΈΠ³Ρ€Π΅ ΡƒΡ‡Π°ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΎΠ±Π°. Π― Π΄ΠΎ сих ΠΏΠΎΡ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ XML ΠΈ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ. Когда Π²Ρ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚Π΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΠΉΡΡ шаблон, Π»ΡƒΡ‡ΡˆΠ΅ пСрСнСсти Π»ΠΎΠ³ΠΈΠΊΡƒ Π² Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ. НапримСр, Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ β€” Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ. ΠœΠΎΡ€Π°Π»ΡŒ: Π½Π΅ злоупотрСбляйтС аннотациями ΠΈ Π½Π΅ Π·Π°Π±Ρ‹Π²Π°ΠΉΡ‚Π΅ XML.

Бонус: Ρƒ вас ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с Optional

Π’Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ orElse ΠΈΠ· Optional. ΠΠ΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ встрСчаСтся, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π½Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚Π΅ константу orElse. Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π½Π°Ρ‚ΡŒ ΠΎΠ± этом, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π½Π° нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ². Когда getValue(x) Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, выполняСтся getValue(y). ΠœΠ΅Ρ‚ΠΎΠ΄ Π² orElse выполняСтся, Ссли getValue(x) возвращаСтся нСпустоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Optional.
getValue(x).orElse(getValue(y)
                  .orElseThrow(() -> new NotFoundException("value not present")));

public Optional<Value> getValue(Source s)
{
  System.out.println("Source: " + s.getName());

  // returns value from s source
}

// when getValue(x) is present system will output
Source: x
Source: y
Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ orElseGet. Он Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΊΠΎΠ΄ для нСпустых Optionals.
getValue(x).orElseGet(() -> getValue(y)
                  .orElseThrow(() -> new NotFoundException("value not present")));

public Optional<Value> getValue(Source s)
{
  System.out.println("Source: " + s.getName());

  // returns value from s source
}

// when getValue(x) is present system will output
Source: x

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

Π˜Π·ΡƒΡ‡Π°Ρ‚ΡŒ Java слоТно. Π’Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹ΡƒΡ‡ΠΈΡ‚ΡŒ Java Π·Π° 24 часа. ΠžΡ‚Ρ‚Π°Ρ‡ΠΈΠ²Π°ΠΉΡ‚Π΅ своС мастСрство. НайдитС врСмя, ΡƒΡ‡ΠΈΡ‚Π΅ΡΡŒ ΠΈ прСуспСвайтС Π² Ρ€Π°Π±ΠΎΡ‚Π΅.

Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ SOLID Π² ΠΊΠΎΠ΄Π΅

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: Cleanthecode Для написания Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ SOLID. Π’ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π½Π°ΠΌ всСм ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π½Π°ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. И Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π±ΡƒΠ΄Π΅ΠΌ чСстными. ΠœΡ‹ Π±Ρ‹Π»ΠΈ Π“Π›Π£ΠŸΠ«. И наш ΠΊΠΎΠ΄ Π±Ρ‹Π» Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅. Π‘Π»Π°Π²Π° Π±ΠΎΠ³Ρƒ, Ρƒ нас Π΅ΡΡ‚ΡŒ SOLID. ΠšΠΎΡ„Π΅-Π±Ρ€Π΅ΠΉΠΊ #85. Π’Ρ€ΠΈ ΡƒΡ€ΠΎΠΊΠ° Java, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я усвоил Π½Π° собствСнном Π³ΠΎΡ€ΡŒΠΊΠΎΠΌ ΠΎΠΏΡ‹Ρ‚Π΅. Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ SOLID Π² ΠΊΠΎΠ΄Π΅ - 2

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ SOLID

Π˜Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ SOLID-ΠΊΠΎΠ΄? На самом Π΄Π΅Π»Π΅ это просто. Π’Π°ΠΌ просто Π½ΡƒΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ этим пяти ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ:
  • ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π΅Π΄ΠΈΠ½ΠΎΠΉ отвСтствСнности
  • ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ открытости-закрытости
  • ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π·Π°ΠΌΠ΅Π½Ρ‹ Лисков
  • ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ отдСлСния интСрфСйса
  • ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ инвСрсии зависимостСй
НС Π²ΠΎΠ»Π½ΡƒΠΉΡ‚Π΅ΡΡŒ! Π­Ρ‚ΠΈ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‰Π΅, Ρ‡Π΅ΠΌ каТСтся!

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π΅Π΄ΠΈΠ½ΠΎΠΉ отвСтствСнности

Π’ своСй ΠΊΠ½ΠΈΠ³Π΅ Π ΠΎΠ±Π΅Ρ€Ρ‚ К. ΠœΠ°Ρ€Ρ‚ΠΈΠ½ описываСт этот ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: β€œΠ£ класса Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π° ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° для измСнСния”. Π”Π°Π²Π°ΠΉΡ‚Π΅ вмСстС рассмотрим Π΄Π²Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°.

1. Π§Π΅Π³ΠΎ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ

Π£ нас Π΅ΡΡ‚ΡŒ класс с ΠΈΠΌΠ΅Π½Π΅ΠΌ User, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π΄Π΅Π»Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π²Π΅Ρ‰ΠΈ:
  • Π—Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚
  • ΠΠ²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ
  • ΠŸΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π²Ρ…ΠΎΠ΄Π΅ Π² систСму
Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ этого класса нСсколько обязанностСй. Если процСсс рСгистрации измСнится, класс User измСнится. Π’ΠΎ ΠΆΠ΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ процСсса Π²Ρ…ΠΎΠ΄Π° Π² систСму ΠΈΠ»ΠΈ Π² процСссС увСдомлСния. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ класс ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½. Π£ Π½Π΅Π³ΠΎ слишком ΠΌΠ½ΠΎΠ³ΠΎ обязанностСй. Π‘Π°ΠΌΡ‹ΠΉ простой способ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ это β€” пСрСнСсти ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π½Π° свои классы, Ρ‡Ρ‚ΠΎΠ±Ρ‹ класс User ΠΎΡ‚Π²Π΅Ρ‡Π°Π» Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π° объСдинСниС классов. Если Π·Π°Ρ‚Π΅ΠΌ процСсс измСнится, Ρƒ вас Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ Ρ‡Π΅Ρ‚ΠΊΠΈΠΉ, ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ.

2. Π§Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅ сСбС класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ для Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, FirstUseNotification. Он Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ ΠΈΠ· Ρ‚Ρ€Π΅Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ:
  • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π»ΠΎΡΡŒ Π»ΠΈ ΡƒΠΆΠ΅ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅
  • ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅
  • ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊ ΡƒΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅
Π•ΡΡ‚ΡŒ Π»ΠΈ Ρƒ этого класса нСсколько ΠΏΡ€ΠΈΡ‡ΠΈΠ½ для измСнСния? НСт. Π£ этого класса Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½Π° понятная функция β€” ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ увСдомлСния для Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρƒ класса Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½Π° ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° для измСнСния. А ΠΈΠΌΠ΅Π½Π½ΠΎ, Ссли эта Ρ†Π΅Π»ΡŒ измСнится. Π˜Ρ‚Π°ΠΊ, этот класс Π½Π΅ Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π΅Π΄ΠΈΠ½ΠΎΠΉ отвСтствСнности. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π΅ΡΡ‚ΡŒ нСсколько Π²Π΅Ρ‰Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒΡΡ: способ ΠΏΠΎΠΌΠ΅Ρ‚ΠΊΠΈ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒΡΡ ΠΈΠ»ΠΈ способ отобраТСния увСдомлСния. Однако, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ†Π΅Π»ΡŒ класса ясна ΠΈ элСмСнтарна, это Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ открытости-закрытости

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ-Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π½ Π‘Π΅Ρ€Ρ‚Ρ€Π°Π½ΠΎΠΌ ΠœΠ΅ΠΉΠ΅Ρ€ΠΎΠΌ: β€œΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ (классы, ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Ρ‚. Π΄.) Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, Π½ΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ для модификации”. Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π½Π° самом Π΄Π΅Π»Π΅ ΠΎΡ‡Π΅Π½ΡŒ прост. Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ свой ΠΊΠΎΠ΄, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² Π½Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Π΅Π· измСнСния исходного ΠΊΠΎΠ΄Π°. Π­Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ классы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ зависят ΠΎΡ‚ вашСго ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΠΎΠ³ΠΎ класса. Однако Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ слоТнСС. ΠœΠ΅ΠΉΠ΅Ρ€ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ наслСдованиС. Но это ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ сильной связи. Π­Ρ‚ΠΎ ΠΌΡ‹ обсудим Π² ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°Ρ… раздСлСния интСрфСйсов ΠΈ ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°Ρ… инвСрсии зависимостСй. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠœΠ°Ρ€Ρ‚ΠΈΠ½ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π» Π»ΡƒΡ‡ΡˆΠΈΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ. ВмСсто ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ наслСдования Π² этом ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ абстрактныС Π±Π°Π·ΠΎΠ²Ρ‹Π΅ классы. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, спСцификации наслСдования ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ рСализация Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, Π° Π·Π°Ρ‚Π΅ΠΌ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ для внСсСния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. Π—Π°Ρ‚Π΅ΠΌ Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот интСрфСйс ΠΈ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ Π΅Π³ΠΎ.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π·Π°ΠΌΠ΅Π½Ρ‹ Лисков

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ ΠΈΠ·ΠΎΠ±Ρ€Π΅Π»Π° Π‘Π°Ρ€Π±Π°Ρ€Π° Лисков β€” Π»Π°ΡƒΡ€Π΅Π°Ρ‚ ΠΏΡ€Π΅ΠΌΠΈΠΈ Π’ΡŒΡŽΡ€ΠΈΠ½Π³Π° Π·Π° Π²ΠΊΠ»Π°Π΄ Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ языков программирования ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния. Π’ своСй ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΎΠ½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»Π° свой ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: β€œΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ замСняСмыми Π½Π° экзСмпляры ΠΈΡ… ΠΏΠΎΠ΄Ρ‚ΠΈΠΏΠΎΠ² Π±Π΅Π· измСнСния ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ выполнСния программы”. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π½Π° этот ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ ΠΊΠ°ΠΊ программист. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚. Он ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π·Π²ΡƒΡ‡ΠΈΡ‚ Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ β€” это особая Ρ„ΠΎΡ€ΠΌΠ° ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π—Π΄Π΅ΡΡŒ Π½Π° ΠΏΠΎΠΌΠΎΡ‰ΡŒ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π·Π°ΠΌΠ΅Π½Ρ‹ Лисков. Π’Π΅Π·Π΄Π΅, Π³Π΄Π΅ Π²Ρ‹ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚Π΅ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ Π² своСм ΠΊΠΎΠ΄Π΅, появлСниС ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π° Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ ваш ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ SetWidth ΠΈ SetHeight. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Ρƒ Ρ‚Π°ΠΊΠΆΠ΅ Π½ΡƒΠΆΠ½Ρ‹ эти ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹. К соТалСнию, Π² этом Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ смысла. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ здСсь Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ΡΡ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π·Π°ΠΌΠ΅Π½Ρ‹ Лисков.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ отдСлСния интСрфСйса

Как ΠΈ всС Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹, ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ раздСлСния интСрфСйса Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‰Π΅, Ρ‡Π΅ΠΌ каТСтся: β€œΠœΠ½ΠΎΠ³ΠΎ интСрфСйсов, ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… для ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ², Π»ΡƒΡ‡ΡˆΠ΅, Ρ‡Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ интСрфСйс ΠΎΠ±Ρ‰Π΅Π³ΠΎ назначСния”. Как ΠΈ Π² случаС ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° Π΅Π΄ΠΈΠ½ΠΎΠΉ отвСтствСнности, Ρ†Π΅Π»ΡŒ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Π΅ эффСкты ΠΈ количСство Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Ρ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ ΠΏΠΈΡˆΠ΅Ρ‚. Но с Π½ΠΈΠΌ Π»Π΅Π³ΠΊΠΎ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ. ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°? Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ наш ΠΏΠ»Π°Π½: ΠΌΡ‹ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠΌ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ ΠΈΠ· ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ заставляСм ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ setWidth ΠΈ setHeight, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, вСроятно, Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°ΡŽΡ‚. Если Π±Ρ‹ ΠΎΠ½ΠΈ это сдСлали, ΠΌΡ‹, вСроятно, сломали Π±Ρ‹ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΡˆΠΈΡ€ΠΈΠ½Π° ΠΈ высота Π½Π΅ Π±Ρ‹Π»ΠΈ Π±Ρ‹ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΌΠΈ. К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ для нас, это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ большС Π½Π΅ Π½Π°Ρ€ΡƒΡˆΠ°Π΅ΠΌ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π·Π°ΠΌΠ΅Π½Ρ‹ Лисков, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ Π²Π΅Π·Π΄Π΅, Π³Π΄Π΅ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ. Однако это создаСт Π½ΠΎΠ²ΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ: Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Π½Π°Ρ€ΡƒΡˆΠ°Π΅ΠΌ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ отдСлСния интСрфСйсов. ΠœΡ‹ заставляСм ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ класс Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ½ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°Π΅Ρ‚ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ инвСрсии зависимостСй

ПослСдний ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ прост: высокоуровнСвыС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹, ΠΈ Π½Π° Π½ΠΈΡ… Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Π»ΠΈΡΡ‚ΡŒ измСнСния Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ.
  • A. ΠœΠΎΠ΄ΡƒΠ»ΠΈ высокого уровня Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня. Оба Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ абстракций (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, интСрфСйсов).
  • Π‘. Абстракции Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ. Π”Π΅Ρ‚Π°Π»ΠΈ (ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ) Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ абстракций.
Π­Ρ‚ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ Π·Π° счСт Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ абстракции, Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‰Π΅ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ высокого ΠΈ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня. НазваниС ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ зависимости мСняСтся, Π½ΠΎ это Π½Π΅ Ρ‚Π°ΠΊ. Оно Ρ‚ΠΎΠ»ΡŒΠΊΠΎ раздСляСт Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ, вводя Π°Π±ΡΡ‚Ρ€Π°ΠΊΡ†ΠΈΡŽ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ. Π’ ΠΈΡ‚ΠΎΠ³Π΅ Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Π΄Π²Π΅ зависимости:
  • ΠœΠΎΠ΄ΡƒΠ»ΡŒ высокого уровня, Π² зависимости ΠΎΡ‚ абстракции
  • ΠœΠΎΠ΄ΡƒΠ»ΡŒ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня, зависящий ΠΎΡ‚ Ρ‚ΠΎΠΉ ΠΆΠ΅ абстракции
Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ слоТно, Π½ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ происходит автоматичСски, Ссли ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ открытости/закрытости ΠΈ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ подстановки Лисков. Π’ΠΎΡ‚ ΠΈ всС! Π’Ρ‹ ознакомились с ΠΏΡΡ‚ΡŒΡŽ основными ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°ΠΌΠΈ, Π»Π΅ΠΆΠ°Ρ‰ΠΈΠΌΠΈ Π² основС SOLID. Π‘ этими ΠΏΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°ΠΌΠΈ Π²Ρ‹ смоТСтС ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ свой ΠΊΠΎΠ΄ ΠΏΠΎΡ‚Ρ€ΡΡΠ°ΡŽΡ‰ΠΈΠΌ!
ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ
  • популярныС
  • Π½ΠΎΠ²Ρ‹Π΅
  • старыС
Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ
Π£ этой страницы Π΅Ρ‰Π΅ Π½Π΅Ρ‚ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ коммСнтария