Functional concepts

Чистота

ЧистыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ чистой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ зависит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ Π΅Π΅ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… (Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²) ΠΈ Π½Π΅ Π²Π»Π΅Ρ‡Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… эффСктов. Π‘ ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ входящим Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ всСгда Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

function half(x) {
    return x / 2;
}

Ѐункцияhalf(x)ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ числоxΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ‹x. Если ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΄ΠΈΠΌ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ 8, ΠΎΠ½Π° Π²Π΅Ρ€Π½Π΅Ρ‚ 4. ПослС Π²Ρ‹Π·ΠΎΠ²Π° чистая функция всСгда ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΌΠ΅Π½Π΅Π½Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ своСй Ρ€Π°Π±ΠΎΡ‚Ρ‹. НапримСр, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒhalf(8)Π½Π° 4: Π³Π΄Π΅ Π±Ρ‹ эта функция Π½Π΅ использовалась Π² нашСм ΠΊΠΎΠ΄Π΅, ΠΏΠΎΠ΄ΠΌΠ΅Π½Π° Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ повлияла Π±Ρ‹ Π½Π° ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. Π­Ρ‚ΠΎ называСтся ссылочной ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΡΡ‚ΡŒΡŽ.

ЧистыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ зависят Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΈΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ. НапримСр, чистая функция Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈΠ· области видимости родитСля, Ссли ΠΎΠ½ΠΈ явно Π½Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π² Π½Π΅Π΅ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Но ΠΈ Π΄Π°ΠΆΠ΅ Ρ‚ΠΎΠ³Π΄Π° функция Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ Π² Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ области видимости.

var someNum = 8;

// это НЕ чистая функция
function impureHalf() {
  return someNum / 2;
}

Π˜Ρ‚ΠΎΠ³ΠΎ:

  • ЧистыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹.

  • Одни ΠΈ Ρ‚Π΅ ΠΆΠ΅ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ (Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹) всСгда ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄ΡƒΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ (Π²Π΅Ρ€Π½ΡƒΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚).

  • ЧистыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΡΠ½ΠΎΠ²Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΌ состоянии ΠΈ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ внСшнСС (ΠΏΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅:console.logизмСняСт глобальноС состояниС).

  • ЧистыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ производят ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… эффСктов.

  • ЧистыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ нСчистыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

НСчистыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

НСчистая функция измСняСт состояниС Π²Π½Π΅ своСй области видимости. Π›ΡŽΠ±Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΌΠΈ эффСктами β€” нСчистыС, Ρ€ΠΎΠ²Π½ΠΎ ΠΊΠ°ΠΊ ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Π΅Π· Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния. Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:

// нСчистая функция ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΉ эффСкт
function showAlert() {
  alert('This is a side effect!');
}
// нСчистая функция измСняСт внСшнСС состояниС
var globalVal = 1;
function incrementGlobalVal(x) {
  globalVal += x;
}
// нСчистая функция ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ‡ΠΈΡΡ‚ΡƒΡŽ Ρ„ΡƒΠ½Ρ†ΠΈΡŽ
function proceduralFn() {
  const result1 = pureFnFirst(1);
  const result2 = pureFnLast(2);
  console.log(`Done with ${result1} and ${result2}!`);
}
// нСчистая функция выглядит чистой,
// Π½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π°Π·Π½Ρ‹Π΅ значСния
// ΠΏΡ€ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ… Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…
function getRandomRange(min, max) {
  return Math.random() * (max - min) + min;
}

ΠŸΠΎΠ±ΠΎΡ‡Π½Ρ‹Π΅ эффСкты Π² JavaScript

Когда функция ΠΈΠ»ΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ измСняСт состояниС Π²Π½Π΅ своСго контСкста, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ являСтся ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΌ эффСктом. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… эффСктов: Π²Ρ‹Π·ΠΎΠ² API, ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ DOM, Π²Ρ‹Π²ΠΎΠ΄ alert, запись Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. Если функция ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Π΅ эффСкты, ΠΎΠ½Π° считаСтся нСчистой. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Π΅ эффСкты, ΠΌΠ΅Π½Π΅Π΅ прСдсказуСмы ΠΈ ΠΈΡ… Ρ‚Ρ€ΡƒΠ΄Π½Π΅Π΅ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ приводят ΠΊ измСнСниям Π²Π½Π΅ ΠΈΡ… локальной области видимости.

Π’Ρ‹Π²ΠΎΠ΄

Много качСствСнного ΠΊΠΎΠ΄Π° состоит ΠΈΠ· нСчистых Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ…ΡΡ чистыми. Π­Ρ‚ΠΎ всС Ρ€Π°Π²Π½ΠΎ нСсСт массу прСимущСств для тСстирования ΠΈ нСизмСняСмости. Бсылочная ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ удобством для ΠΌΠ΅ΠΌΠΎΠΈΠ·Π°Ρ†ΠΈΠΈ: ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ сохранСниС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ². Однако ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ чисты, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСпросто.

БостояниС

БостояниС β€” информация, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈΠΌΠ΅Π΅Ρ‚ доступ, ΠΈ с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Бюда входят Π΄Π°Π½Π½Ρ‹Π΅, хранящиСся Π² памяти, ΠΏΠΎΡ€Ρ‚Ρ‹ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°, Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. НапримСр, содСрТимоС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π² любой Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ€Π΅ΠΏΡ€Π΅Π·Π΅Π½Ρ‚Π°Ρ‚ΠΈΠ²Π½ΠΎ для состояния прилоТСния.

Π‘ состояниСм

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, прилоТСния ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ с состояниСм хранят Π² памяти Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ состоянии. Они ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ состояниС, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅ΡŽΡ‚ доступ ΠΊ Π΅Π³ΠΎ истории. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ дСмонстрируСт это:

var number = 1;
function increment() {
  return number++;
}
// глобальная пСрСмСнная измСняСтся: number = 2
increment();

Π‘Π΅Π· состояния

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π±Π΅Π· состояния Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ Π·Π°Π΄Π°Ρ‡ΠΈ, словно ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΈΡ… Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‚ Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅. Они Π½Π΅ ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ ΠΈΠ»ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π² своСм исполнСнии Ρ€Π°Π½Π½Π΅Π΅ созданныС Π΄Π°Π½Π½Ρ‹Π΅. ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΠ΅ состояния обСспСчиваСт ΡΡΡ‹Π»ΠΎΡ‡Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ зависят Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ ΠΈΡ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ доступа, Π½Π΅ Π½ΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ Π² Π·Π½Π°Π½ΠΈΠΈ Ρ‡Π΅Π³ΠΎ-Π»ΠΈΠ±ΠΎ Π²Π½Π΅ области ΠΈΡ… видимости.ЧистыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ состояния. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

var number = 1;
function increment(n) {
  return n + 1;
}
// глобальная пСрСмСнная НЕ измСняСтся: Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 2
increment(number);

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π±Π΅Π· состояния всС Π΅Ρ‰Π΅ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ состояниСм. Однако ΠΎΠ½ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ своС Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС Π±Π΅Π· измСнСния ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ состояния. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования.

Π’Ρ‹Π²ΠΎΠ΄

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ состояниСм Π²Π°ΠΆΠ½ΠΎ для любого слоТного прилоТСния. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ с состояниСм ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ состояниС ΠΈ Π΅Π³ΠΎ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ, ΠΈΡ… Ρ‚Ρ€ΡƒΠ΄Π½Π΅Π΅ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒ. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Π΅Π· состояния ΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° свои Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ для создания Π΄Π°Π½Π½Ρ‹Ρ… Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ…. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π±Π΅Π· состояния Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠ²ΠΎΠ΅ состояниС, Π° Π½Π΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ состояниС.

ΠΠ΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ

ΠšΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ нСизмСняСмости ΠΈ измСняСмости Π±ΠΎΠ»Π΅Π΅ Ρ‚ΡƒΠΌΠ°Π½Π½Ρ‹ Π² JavaScript, Ρ‡Π΅ΠΌ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄Ρ€ΡƒΠ³ΠΈΡ… языках программирования. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π²Ρ‹ ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΡΠ»Ρ‹ΡˆΠΈΡ‚Π΅ ΠΎ нСизмСняСмости ΠΏΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π² JS. Π’Π°ΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ эти Ρ‚Π΅Ρ€ΠΌΠΈΠ½Ρ‹ ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ Π² классичСском ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠΈ ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ΡΡ Π² JavaScript. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ достаточно просты:

НСизмСняСмый

Если ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ являСтся нСизмСняСмым, Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ послС создания.

Π˜Π·ΠΌΠ΅Π½ΡΠ΅ΠΌΡ‹ΠΉ

Если ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ измСняСм, Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ послС создания.

РСализация: Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ Π² JavaScript

Π’ JavaScript строки ΠΈ числовыС Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ нСизмСняСмыми. Π­Ρ‚ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ссли Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ с Π½ΠΈΠΌΠΈ:

var str = 'Hello!';
var anotherStr = str.substring(2);
// Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚: str = 'Hello!' (Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π°)
// Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚: anotherStr = 'llo!' (новая строка)

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ .substring()Π½Π° нашСмHello!, строка Π½Π΅ измСняСт ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ строку. ВмСсто этого ΠΎΠ½Π° создаСт Π½ΠΎΠ²ΡƒΡŽ строку. ΠœΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉstrΠ½Π° Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ΅, Π½ΠΎ, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΡ‹ создали Π½Π°ΡˆΡƒ строкуHello!, ΠΎΠ½Π° навсСгда останСтсяHello!

ЧисловыС Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ нСизмСняСмы. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ всСгда Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

var three = 1 + 2;
// Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚: three = 3

Ни ΠΏΡ€ΠΈ ΠΊΠ°ΠΊΠΈΡ… ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΡΡ‚Π²Π°Ρ… 1 + 2Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ Ρ‡Π΅ΠΌ-Π»ΠΈΠ±ΠΎ, ΠΊΡ€ΠΎΠΌΠ΅ 3.

Π­Ρ‚ΠΎ дСмонстрируСт, Ρ‡Ρ‚ΠΎ Π² JavaScript присутствуСт рСализация нСизмСняСмости. Однако Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ JS Π·Π½Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ язык позволяСт ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠ΅. НапримСр, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈ массивы измСняСмы. Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

var arr = [1, 2, 3];
arr.push(4);
// Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚: arr = [1, 2, 3, 4]

var obj = { greeting: 'Hello' };
obj.name = 'Jon';
// Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚: obj = { greeting: 'Hello', name: 'Jon' }

Π’ этих ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… исходныС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹. НовыС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² JavaScript Ρ…ΠΎΡ€ΠΎΡˆΠΎ развиваСтся. Но ΠΏΠΎ своСй сущности JS β€” ΠΎΡ‡Π΅Π½ΡŒ ΠΈΠ·ΠΌΠ΅Π½Ρ‡ΠΈΠ²Ρ‹ΠΉ язык, состоящий ΠΈΠ· мноТСства ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌ. ΠšΠ»ΡŽΡ‡Π΅Π²Π°Ρ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования β€” Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ. Π”Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ языки выбросят ΠΎΡˆΠΈΠ±ΠΊΡƒ, ΠΊΠΎΠ³Π΄Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ попытаСтся ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ нСизмСняСмый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Π’ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠΈΡ€ΠΈΡ‚ΡŒ Π²Ρ€ΠΎΠΆΠ΄Π΅Π½Π½ΡƒΡŽ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ JS ΠΏΡ€ΠΈ написании Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π΅Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ JS?

Когда ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π² JS, слово «нСизмСняСмоС» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΌΠ½ΠΎΠ³ΠΎ, Π½ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ обязан всСгда Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π΅Π΅ Π² Π³ΠΎΠ»ΠΎΠ²Π΅. НапримСр, Redux полагаСтся Π½Π° ΠΎΠ΄Π½ΠΎ нСизмСняСмоС Π΄Π΅Ρ€Π΅Π²ΠΎ состояний. Однако сам JavaScript способСн ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ состояния. Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСизмСняСмоС Π΄Π΅Ρ€Π΅Π²ΠΎ состояний, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ состояния Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉΠΎΠ±ΡŠΠ΅ΠΊΡ‚ состояния.

Для нСизмСняСмости ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ JavaScript Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΌΠΎΡ€ΠΎΠΆΠ΅Π½Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽObject.freeze(obj). ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ это "нСглубокая" Π·Π°ΠΌΠΎΡ€ΠΎΠ·ΠΊΠ°: значСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π²Π½ΡƒΡ‚Ρ€ΠΈ Π·Π°ΠΌΠΎΡ€ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° всС Π΅Ρ‰Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹. Для Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ нСизмСняСмости Ρ‚Π°ΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ "Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠΉ" Π·Π°ΠΌΠΎΡ€ΠΎΠ·ΠΊΠΈ, ΠΊΠ°ΠΊ Mozilla deepFreeze() ΠΈ npm deep-freeze ΠΌΠΎΠ³ΡƒΡ‚ рСкурсивно Π·Π°ΠΌΠΎΡ€Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. Π—Π°ΠΌΠΎΡ€Π°ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ Π² тСстах, Π° Π½Π΅ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. ВСсты Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠΏΠΎΠ²Π΅Ρ‰Π°Ρ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΈ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π·Π°Π³Ρ€ΠΎΠΌΠΎΠΆΠ΄Π°ΡŽΡ‰Π΅Π³ΠΎObject.freezeΠ² основном ΠΊΠΎΠ΄Π΅.

Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ Π² JS. Mori прСдоставляСт постоянныС структуры Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° основС Clojure. Immutable.js ΠΎΡ‚ Facebook Ρ‚Π°ΠΊΠΆΠ΅ прСдоставляСт нСизмСняСмыС ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ для JS. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Underscore.js ΠΈ lodash, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ для Π±ΠΎΠ»Π΅Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ стиля программирования (стало Π±Ρ‹Ρ‚ΡŒ, Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π½Π° Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ).

Π’Ρ‹Π²ΠΎΠ΄

Π’ Ρ†Π΅Π»ΠΎΠΌ, JavaScript β€” язык с сильной ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΡΡ‚ΡŒΡŽ. НСкоторыС стили JS-кодирования ΠΎΠΏΠΈΡ€Π°ΡŽΡ‚ΡΡ Π½Π° эту Π²Ρ€ΠΎΠΆΠ΄Π΅Π½Π½ΡƒΡŽ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ. Однако, ΠΏΡ€ΠΈ написании Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ JS, рСализация нСизмСняСмости Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Если Π²Ρ‹ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ нСчаянно ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚Π΅, JS Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π±Ρ€Π°ΡΡ‹Π²Π°Ρ‚ΡŒ ошибки. ВСстированиС ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ, Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π° с Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΡΡ‚ΡŒΡŽ Π² JS Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΠΈ.

ΠΠ΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ ΠΈΠΌΠ΅Π΅Ρ‚ свои прСимущСства. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ получаСтся ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΎΡ‰Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ. Он Ρ‚Π°ΠΊΠΆΠ΅ обСспСчиваСт ΠΏΠ΅Ρ€ΡΠΈΡΡ‚Π΅Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ хранСния Π±ΠΎΠ»Π΅Π΅ старых вСрсий структур Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ²ΡˆΠΈΡ…ΡΡ частСй.

НСдостатком нСизмСняСмости являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ эффСктивно Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹.

Last updated